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 的结构中并且没有任何东西不合适时,事情开始变得非常危险。知道会发生什么吗?

4

1 回答 1

1

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

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

于 2011-08-23T15:47:38.143 回答