C# iTextSharp:拆分页面大小等于文件大小

C# iTextSharp:拆分页面大小等于文件大小,c#,itext,C#,Itext,下面是我如何拆分一个大PDF(144 mb): public int SplitAndSave(字符串输入路径,字符串输出路径) { FileInfo file=新的FileInfo(inputPath); 字符串名称=file.name.Substring(0,file.name.LastIndexOf(“.”); 使用(PdfReader读取器=新PdfReader(inputPath)) { 对于(int pagenumber=1;pagenumber,对于您的文档,原因确实是我提到的:所

下面是我如何拆分一个大PDF(144 mb):

public int SplitAndSave(字符串输入路径,字符串输出路径)
{
FileInfo file=新的FileInfo(inputPath);
字符串名称=file.name.Substring(0,file.name.LastIndexOf(“.”);
使用(PdfReader读取器=新PdfReader(inputPath))
{
对于(int pagenumber=1;pagenumber,对于您的文档,原因确实是我提到的:所有页面都引用object2 0r作为它们的/Resources,而2 0obj中的词典反过来引用PDF中的所有图像

要将该文档拆分为仅包含所需图像的部分文档,您应该先找出哪些图像属于哪些页面,然后为所有页面创建单独的/Resources词典,从而对文档进行预处理

由于您已经在此上下文中使用了iText,您还可以使用它来找出哪些页面需要哪些图像。使用iText
解析器
包,使用一个
RenderListener
实现,一页一页地解析PDF,该实现的
RenderImage
方法仅记住当前使用的图像对象nt页。(作为一种特殊的扭曲,iText隐藏了所讨论的图像XObject的名称;不过,您可以获得间接对象,并且可以查询其对象和生成号,这就足以进行下一步。)

在第二步中,在
PdfStamper
中打开文档并迭代页面。对于每个页面,您检索/Resources字典并复制它,但仅复制引用其中一个图像对象的XObject引用,在第一步中,您为相应页面记住了该图像对象的对象编号和生成步骤。最后,将减少的副本设置为相关页面的/Resources字典

生成的PDF应该可以很好地拆分

PSiText邮件列表上最近出现了一个非常类似的问题。为了解决iText隐藏xobject名称所带来的困难,我现在建议在名称丢失之前进行干预,使用不同的
ContentOperator
表示“Do”,这里是Java版本:

class Do implements ContentOperator 
{ 
    public void invoke(PdfContentStreamProcessor processor, PdfLiteral operator, ArrayList<PdfObject> operands) throws IOException 
    { 
        PdfName xobjectName = (PdfName)operands.get(0); 
        names.add(xobjectName); 
    } 

    final List<PdfName> names = new ArrayList<PdfName>(); 
} 
类Do实现ContentOperator
{ 
public void invoke(PdfContentStreamProcessor处理器、PDF并行运算符、ArrayList操作数)引发IOException
{ 
PdfName xobjectName=(PdfName)操作数。获取(0);
name.add(xobjectName);
} 
最终列表名称=新的ArrayList();
} 

此内容操作符只收集使用过的xobject的名称,即要为给定页面保留的xobject资源。

不幸的是,必须对相关PDF进行分析。您能提供一个示例吗?我想到的一个原因是:存在大量文档,其中每个页面引用文档中的所有资源,即这些不是页面本身所必需的。如果是这样的文档,您的代码会将所有资源与每个页面一起复制。您需要我提供什么样的示例?此代码是complete code-inputpath-pdf location,outputpath-folder for splitted page。您知道如何“解除链接”吗资源和页面?不是示例代码,而是一个必须首先分析的示例PDF文档。我提到的原因是一个可能的原因。我不知道这是否是您的原因。这是PDF文件,该文件需要登录,您是否可以将其放在任何地方,以便我们下载它?
class Do implements ContentOperator 
{ 
    public void invoke(PdfContentStreamProcessor processor, PdfLiteral operator, ArrayList<PdfObject> operands) throws IOException 
    { 
        PdfName xobjectName = (PdfName)operands.get(0); 
        names.add(xobjectName); 
    } 

    final List<PdfName> names = new ArrayList<PdfName>(); 
}