PDFBox中的合并文档要么没有空白页,要么没有太多......但仅在打印时才有

时间:2011-08-18 23:27:56

标签: java pdf pdfbox

我目前正在开展的项目需要大量印刷文件,这些文件将邮寄给客户。例如,单个打印运行可能包含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 个答案:

答案 0 :(得分:0)

好吧,我想我可能已经解决了这个问题。看起来有些字母是用“A4”纸设计的,而不是“字母”。如果我只是查看Acrobat Reader中的文件,它看起来非常好,如果我从那里打印字母,Reader必须自动将输出压缩到可用的纸张尺寸上。不幸的是,PDFBox似乎没有做同样的挤压。因此,当通过PDFBox进行打印时,这封信会稍微延伸到下一页,导致我看到的奇怪行为。

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