PDFBox合并的文档在打印时要么没有空白页,要么有太多空白页。

3
我目前正在处理的项目需要大量打印文件,并将其邮寄给客户。例如,一个单独的打印任务可能包括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个回答

1

好的,我想我可能已经找到了问题所在。看起来一些字母是用“A4”纸设计的,而不是“信纸”。如果我只是在Acrobat Reader中查看文件,它看起来完全正常,如果我从那里打印信件,Reader必须自动将输出挤压到可用的纸张大小上。不幸的是,PDFBox似乎没有做同样的挤压。因此,通过PDFBox打印时,信件会略微超出下一页,导致我看到的奇怪行为。

我还没有机会测试这个理论...信件开发人员找到了错误,但他的更改尚未放在我们的测试服务器上。如果这不能解决问题,我会回报的。


2
那么...纸张大小最终是问题吗?如果是,请接受您自己的答案 :)。 - jjmontes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接