有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

    我还没有机会检验这个理论。。。信函开发人员发现了这个bug,但是他的更改还没有放到我们的测试服务器上。如果这不能解决问题,我会向你汇报