私が現在取り組んでいるプロジェクトでは、大量のドキュメントを印刷する必要があり、クライアントに郵送されます。たとえば、1 回の印刷に 1000 通を超える文字が含まれる場合があり、それぞれが異なるクライアントに送られます。
この印刷物を生成するために、外部サービス (つまり、PDFBox を使用しないサービス) は、最初にこれらの各レターを個別の PDF ファイルとして生成します。次に、私のコードはこれらの PDF ファイルをすべて読み込み、それらをすべて PDFBox とマージして (印刷室で 1 つのジョブとして印刷できるように)、前面に「バナー ページ」を追加します (これも PDFBox を使用)。文字をどうするかを印刷室に指示します。
すべて両面印刷です。しかし、手紙はそれぞれ別のクライアントに送られるため、1 枚の紙に 2 通の手紙を連続して印刷することはできません。つまり、ページ数が奇数のレターには空白ページを追加する必要があります。印刷の直前に、2 文字のみを含む非常に小さな印刷部数のマージされた 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 の構造に深く入り込むと、事態は非常に危険になり始め、場違いなものとして何も飛び出しません。何が起こっているのでしょうか?