3

私が現在取り組んでいるプロジェクトでは、大量のドキュメントを印刷する必要があり、クライアントに郵送されます。たとえば、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 の構造に深く入り込むと、事態は非常に危険になり始め、場違いなものとして何も飛び出しません。何が起こっているのでしょうか?

4

1 に答える 1

1

さて、私は問題を理解したかもしれないと思います。一部の文字は、「Letter」ではなく「A4」用紙でデザインされているようです。ファイルを Acrobat Reader で見ただけではまったく問題ないように見えたし、そこから文字を印刷した場合、Reader は出力を利用可能な用紙サイズに自動的に縮小したにちがいない。残念ながら、PDFBox は同じスクイーズを行っていないようです。そのため、PDFBox を介して印刷すると、手紙が次のページにはみ出してしまい、私が見た奇妙な動作が発生しました。

私はまだこの理論をテストする機会がありません...手紙の開発者はバグを見つけましたが、彼の変更はまだテストサーバーに置かれていません. これで問題が解決しない場合は、また報告します。

于 2011-08-23T15:47:38.143 に答える