PDFBox中的java合并文档要么没有空白页,要么太多。。。但只有在印刷时
我目前正在从事的项目需要大量打印文档,这些文档将被邮寄给客户。例如,一次打印可能包含1000多封信,每封信都将发送到不同的客户机
要生成此打印运行,外部服务(即不使用PDFBox)首先将这些信件作为单个PDF文件生成。然后,我的代码加载所有这些PDF文件,将它们与PDFBox合并在一起(以便它们可以在打印室中作为单个作业打印),然后我在前面添加一个“横幅页”(也使用PDFBox),告诉打印室如何处理这些信件
所有的东西都是双面印刷的。但由于每封信都是发给不同的客户,我不能在一张纸上背靠背打印两封信。这意味着任何页数为奇数的信件都需要添加空白页。在打印之前,仅包含两个字母的非常小的打印运行的合并PDF文档可能看起来像这样:
Banner Page
Blank
Letter 1
Blank
Letter 2
Blank
但这就是我的问题所在。我用这个代码添加了空白页:
PDFMergerUtility docMerger = new PDFMergerUtility();
for (PDDocument currDoc : documents) {
// Add blank page to document if odd number
if (currDoc.getNumberOfPages() % 2 != 0) {
currDoc.addPage(new PDPage());
}
// Merge into single document
docMerger.appendDocument(mergedDoc, currDoc);
// Close currDoc
currDoc.close();
}
这似乎对横幅页面一直有效,但对于某些类型的信件,它会出错。如果我打开生成的PDF,看起来没问题,但是当我打印时,我会在每个字母之间得到一张额外的空白纸
因此,当我在Acrobat Reader(甚至PDFBox的查看器)中看到这一点时:
Sheet 1: Banner Page
Sheet 2: Letter 1
Sheet 3: Letter 2
打印输出如下所示:
Sheet 1: Banner Page
Sheet 2: Letter 1
Sheet 3: BLANK!
Sheet 4: Letter 2
Sheet 5: BLANK!
同时,如果我取出new PDPage()
代码,我会在Acrobat和打印输出中得到以下结果:
Sheet 1: Banner Page
Sheet 2: Letter 1 (front) AND Letter 2 (back)
我尝试过通过PDDocument.silentPrint(PrinterJob)
进行调试,但是当它深入到PDF的结构中时,事情开始变得非常危险,没有什么东西会因为不合适而跳出去。知道会发生什么吗
# 1 楼答案
好吧,我想我可能已经解决了问题。看起来有些信件是用“A4”纸设计的,而不是“信件”。如果我只看Acrobat Reader中的文件,它看起来非常好,如果我从那里打印字母,Reader一定会自动将输出压缩到可用的纸张大小。不幸的是,PDFBox似乎没有做同样的压缩。因此,当通过PDFBox打印时,这封信会稍微翻到下一页,导致我看到的奇怪行为
我还没有机会检验这个理论。。。信函开发人员发现了这个bug,但是他的更改还没有放到我们的测试服务器上。如果这不能解决问题,我会向你汇报