7

PDFBox を使用して既存の PDF テンプレートからドキュメントを作成しているため、ファイルを開き、テキストを追加して保存します。外部 TTF フォントを使用しようとする場合を除いて、これはうまく機能します。私はさまざまなことを試し、解決策を2日間検索しましたが、PDFBoxにはあまりありません。

これは、フォント「Tardy Kid」を使用したコードです。これは、他のものと間違われることがなく、標準ライブラリの一部である可能性が低いためです。

コードは正常に実行され、println から "TardyKid" が表示され (フォントが読み込まれ、名前が取得可能であることを示します)、テキストが表示されますが、それは Helvetica にあります。幅の計算に使用するコードのより洗練された部分はgetStringWidth()、幅テーブルの読み込みが成功したことも示しているようです。正しく表示されないだけです。

このコードは、既存の PDF ドキュメント (テンプレート) を開いてテキストを追加する、より大きなプログラムのコンテキストで実行されます。を除いて、すべて正常に動作しているようです

 public void setText ( PDDocument document, String text ) throws IOException {
     int lastPage = document.getNumberOfPages() - 1;
     PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(lastPage);
     PDPageContentStream contentStream = null;
     try {
         contentStream = new PDPageContentStream(document,page,true,true,false);
         File fontFile = new File(m_fontDir, "Tardy_Kid.ttf");
         PDFont font = PDTrueTypeFont.loadTTF(document, fontFile);
         Color color =  new Color(196, 18, 47);
         float x = 100f, y = 700f;
         System.out.println(font.getBaseFont());
         contentStream.setFont(font, 32);
         contentStream.setNonStrokingColor(color);
         contentStream.beginText();
         contentStream.moveTextPositionByAmount(x,y);
         contentStream.drawString(text);
         contentStream.endText();
     } finally {
         if (contentStream != null) {
             contentStream.close();
         }
     }
 }
4

3 に答える 3

5

私は答えを見つけました。これが PDFBox のバグかどうかはわかりませんが、コンテンツ ストリーム (PDPageContentStream によって返される) を同じページで複数回開いたり閉じたりすると、正しく動作しません。そのため、ルーチンがページで複数回呼び出された場合、setText ルーチン内でコンテンツ ストリームを開いたり閉じたりしても機能しませんでした。ストリームをルーチンの外に移動し、ページ全体で一度開いたり閉じたりすると、この問題 (および他のいくつかの問題) が解決されたようです。

これは、ドキュメントやサンプル コードのどこにも言及されておらず、せいぜい非常にわかりにくいものです。特に「機能する」(例外をスローしない)が、ページに不確定および/または間違った結果を作成するため、これをバグと呼びます。

于 2013-05-31T01:29:13.347 に答える