3

既存の PDF ファイルにヘッダーを追加しようとしています。動作しますが、既存の PDF のテーブル ヘッダーは、フォントの変更によって台無しになります。フォントの設定を削除すると、ヘッダーが表示されません。これが私のコードです:

    // the document
    PDDocument doc = null;
    try
    {
        doc = PDDocument.load( file );

        List allPages = doc.getDocumentCatalog().getAllPages();
        //PDFont font = PDType1Font.HELVETICA_BOLD;

        for( int i=0; i<allPages.size(); i++ )
        {
            PDPage page = (PDPage)allPages.get( i );
            PDRectangle pageSize = page.findMediaBox();
            PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true,true);
            PDFont font = PDType1Font.TIMES_ROMAN;
            float fontSize = 15.0f;
            contentStream.beginText();
            // set font and font size
            contentStream.setFont( font, fontSize);
            contentStream.moveTextPositionByAmount(700, 1150);
            contentStream.drawString( message);
            contentStream.endText();

            //contentStream.
            contentStream.close();}

        doc.save( outfile );
    }
    finally
    {
        if( doc != null )
        {
            doc.close();
        }
    }
}`
4

1 に答える 1

8

基本的に、現在のバージョン 1.8.2 で PDFBox のバグが発生しています。

回避策:

getFontsフォントを使用する前に、新しいコンテンツ ストリームを作成した後、ページ リソースの呼び出しを追加します。

PDPage page = (PDPage)allPages.get( i );
PDRectangle pageSize = page.findMediaBox();
PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true,true);
page.getResources().getFonts();  // <<<<<<<<
PDFont font = PDType1Font.TIMES_ROMAN;
float fontSize = 15.0f;
contentStream.beginText();

バグ自体:

バグは、PDResources.addFontから呼び出されるメソッドにありPDPageContentStream.setFontます:

public String addFont(PDFont font) 
{
    return addFont(font, MapUtil.getNextUniqueKey( fonts, "F" ));
}

メンバー変数の現在の内容を使用しfontsて、ページ上の新しいフォント リソースの一意の名前を決定します。残念ながら、このメンバー変数はまだ初期化されていない可能性があります(あなたの場合そうです)。これにより、MapUtil.getNextUniqueKey( fonts, "F" )呼び出しは常にF0を返します。

font変数は、後で呼び出し中に暗黙的に初期化されますaddFont(PDFont, String)

したがって、残念ながらそのページにF0という名前のフォントが既に存在する場合は、新しいフォントに置き換えられます。

PDFでテストしたところ、これはまさにあなたの場合に起こったことです。既存のフォントF0はカスタム エンコーディングを使用し、代わりのフォントは標準のエンコーディングを使用しているため、元々F0を使用して書かれたテキストは意味不明に見えます。

上記の回避策は、そのメンバー変数を暗黙的に初期化するため、フォントの置換を防ぎます。

このタスクのために本番環境で PDFBox を使用する予定がある場合は、バグを報告することをお勧めします。

PS: 上記のコメントで述べたように、継承されたリソースのコンテキストで観察すべき別のバグがあります。これは、PDFBox 開発者の注意も引く必要があります。

PPS: 当面の問題は、バージョン 1.8.3 および 2.0.0 の PDFBox で修正されました。PDFBOX-1753 .

于 2013-10-22T08:22:38.243 に答える