C# iTextSharp:拆分页面大小等于文件大小
下面是我如何拆分一个大PDF(144 mb):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,对于您的文档,原因确实是我提到的:所
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>();
}