gpt4 book ai didi

c# - iTextSharp : Split pages size equals file size

转载 作者:行者123 更新时间:2023-11-30 20:59:20 25 4
gpt4 key购买 nike

以下是我拆分大型 PDF (144 mb) 的方法:

public int SplitAndSave(string inputPath, string outputPath)
{
FileInfo file = new FileInfo(inputPath);
string name = file.Name.Substring(0, file.Name.LastIndexOf("."));

using (PdfReader reader = new PdfReader(inputPath))
{
for (int pagenumber = 1; pagenumber <= reader.NumberOfPages; pagenumber++)
{
string filename = pagenumber.ToString() + ".pdf";

Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileStream(outputPath + "\\" + filename, FileMode.Create));

document.Open();

copy.AddPage(copy.GetImportedPage(reader, pagenumber));

document.Close();
}
return reader.NumberOfPages;
}
}

对于大多数 PDF(小尺寸,我猜是旧格式),一切正常。但是对于更大的页面(可能正在使用类似 refstreams 的东西来更好地压缩),拆分页面作为一页打开,但其大小等于原始 PDF 的大小。我能做什么?

最佳答案

以您的文件为例Top_Gear_Magazine_2012_09.pdf原因确实是我提到的那个:所有页面都将对象2 0 R作为它们的/Resources,而2 0 obj中的字典依次引用 PDF 中的所有图像。

要将该文档拆分为只包含所需图像的部分文档,您应该预处理文档,首先找出哪些图像属于哪些页面,然后为所有页面创建单独的 /Resources 字典。

由于您已经在此上下文中使用了 iText,因此您还可以使用它来找出哪些页面需要哪些图像。使用 iText parser 包,使用 RenderListener 实现逐页解析 PDF,其 RenderImage 方法简单地记住哪些图像对象被用于当前页面。 (作为一个特殊的变化,iText 隐藏了相关图像 XObject 的名称;不过,您获得了间接对象,并且可以查询它的对象和世代号,这足以进行下一步。)

在第二步中,您在 PdfStamper 中打开文档并遍历页面。对于每个页面,您检索 /Resources 字典并复制它,但只复制引用其中一个图像对象的 XObjects 引用,您在第一步中为相应页面记住了这些图像对象的对象编号和生成。最后,您将缩小的副本设置为相关页面的 /Resources 字典。

生成的 PDF 应该分割得很好。

PS iText 邮件列表最近出现了一个非常相似的问题。 In that thread the solution recipe given here has been improved ,为了解决 iText 隐藏 xobject 名称造成的困难,我现在建议在名称丢失之前进行干预,方法是对“Do”使用不同的 ContentOperator,这里是 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>();
}

此内容运算符仅收集使用的 xobject 的名称,即为给定页面保留的 xobject 资源。

关于c# - iTextSharp : Split pages size equals file size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15566896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com