我目前正在进行的项目需要大量打印文件,这些文件将邮寄给客户。例如,单次印刷可能包含超过 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 的结构中并且没有任何东西不合适时,事情开始变得非常危险。知道会发生什么吗?