使用iTextSharp将多个A5页面合并为A4页面

时间:2013-11-21 15:13:47

标签: c# itextsharp

我生成了几个A5 pdf,我现在想创建一个批处理pdf,但批处理pdf将是A4页面,所以我想合并每页的2个pdf。如何将2个A5 pdf合并为一张A4纸。我正在使用iTextSharp来创建pdfs。

2 个答案:

答案 0 :(得分:0)

这是可行的,但它会发臭,因为有很多事情可能会出现可怕的错误。

我不太了解iTextSharp,但我知道PDF很好,所以让我告诉你这样做的步骤。

首先,您需要能够按照您想要的方向制作空白A4页面。这很简单。 接下来,您需要能够从给定的A5页面获取内容流和资源,并以正确的方向将其放置在A4页面的一半上。为此,您需要注入流:

  • gsave(q运营商)
  • 轮换/翻译(cm)运算符

然后您需要复制现有的内容流,然后使用grestore(Q运算符)进行跟踪。

如果你能做到这一点,那么你应该能够修改代码来做同样的事情,但是将A5内容翻译成A4页面的一半。

这是很简单的事情。这是艰难的地方。您需要能够将两个页面执行此操作到同一目标页面,您需要将资源合并在一起。那是困难的部分。这很难,因为当PDF生成软件制作页面并且您决定使用字体时,该页面的字体资源可能会被命名为有用的东西,如/F1。如果两个页面的F1都没有引用相同的字体,则需要重命名其中一个并更改内容流以反映重新映射。您还需要为XObjects(图像和表单),ColorSpace对象,Graphics State对象,Pattern对象等执行此操作。

答案 1 :(得分:0)

我假设您希望将2张A5 pdfs合并为一张A4纸,并将它们并排排列在那里(也称为2张),而不是叠加它们,更不用说回流它们了到一页。

使用iTextSharp,您可以根据NUpTool.csWebified iTextSharp Examples的代码执行此操作。

但是,您必须稍微更改该示例,因为它假定目标格式与源的格式相同,并缩小源页面以使多个页面适合。

此外,该示例默认将其结果文档存储在某个ZIP文件中,因此您只需要获取所需的部分。

示例是NUpTool.java的C#ified版本,来自chapter 6iText in Action, Second Edition的示例,Bruno是他的作者,并且在他对您的问题的评论中提及了该示例。

这个样本本质上完成了@plinth在他的回答中描述的扭曲,将原始页面内容包装在单独的形式xobjects中,这样就可以保留资源。

请注意,示例仅采用页面内容,而不是原始文件中的注释。如果您有例如AcroForm形式字段需要出现,样本必须扩展。