2017-12-07 35 views
0

テンプレートを使用して新しいPDFを作成し、新しいPDFをテンプレートPDFにオーバーレイし、その結果をストリームに書き込むコードがあります。このすべてはPDFBox 2.0.4を使用しています。生成されたPDFからテキストをコピーしてPDF形式のガベージにコピーする

問題は、生成されたPDFのテキストをテキストエディタにコピーして貼り付けた結果、ガベージテキストが表示されることです。

これは、自分のコードで追加されたテキストに対してのみ発生し、元のテンプレートのテキストは正常に機能します。私が追加するテキストは、カスタムフォントを使用して追加されます。

テキストをコピー貼り付けできるように、生成されたPDFを修正するにはどうすればよいですか?

SSCCE:

public class PDFTest { 

    private static final String FONT = "/fonts/font.ttf"; 

    public static void main(final String... args) throws IOException, FontFormatException { 
     final Overlay overlay = new Overlay(); 
     overlay.setInputPDF(newDocument("Input text", 400)); 
     overlay.setAllPagesOverlayPDF(newDocument("Test text", 200)); 

     try (final PDDocument document = overlay.overlay(new HashMap<>())) { 
      document.save("example.pdf"); 
     } 
    } 

    private static PDDocument newDocument(final String text, final int offsetY) throws IOException, FontFormatException { 
     final PDDocument document = new PDDocument(); 
     document.addPage(insertTextInPage(document, text, offsetY)); 
     return document; 
    } 

    private static PDPage insertTextInPage(final PDDocument document, final String text, final int offsetY) throws IOException, FontFormatException { 
     try (final InputStream fontStream = PDFTest.class.getResourceAsStream(FONT)) { 
      final PDFont normalFont = PDType0Font.load(document, fontStream); 

      final PDPage page = new PDPage(); 
      try (final PDPageContentStream contentStream = new PDPageContentStream(document, page, APPEND, false)) { 
       addTextBlock(contentStream, normalFont, text, offsetY); 
      } 
      return page; 
     } 
    } 

    private static void addTextBlock(final PDPageContentStream contentStream, final PDFont font, final String text, final int offsetY) 
      throws IOException { 
     contentStream.beginText(); 
     contentStream.setFont(font, 16); 
     contentStream.newLineAtOffset(20, offsetY); 
     contentStream.showText(text); 
     contentStream.endText(); 
    } 
} 
+0

操作の前後に例のPDFペアを共有してください。また、問題の再現を可能にする十分なコード(つまり、[sscce](http://sscce.org)が望ましい)を表示してください。 – mkl

+0

使用しているPDFBoxのバージョンをお知らせください。 @ Tilman done。 –

+0

私はまたバージョン2.0.8を使用しようとしましたが、テキストが文字化けしてしまったので、始めたバージョンに戻しました。 –

答えて

0

これは、既知の問題(PDFBOX-3243)、ファイルはサブセット・フォント(あなたは非常に効率的であるPDType0Font.load()を使用している)、それらが保存されるまで、である、中間の状態にあるで構成されていますサブセッティングが行われる時間。

解決策:保存して再読み込みするか、ダミーに保存します。 Windowsでは、私はnewDocumentをこのように変更して動作させました。

+0

はい私のためにも動作します。私はこれをしましたが、実際のファイルの書き込みを防ぐために 'document.save(new ByteArrayOutputStream());')しました。 –

+1

PDDocumentがハングアップしたり、このOutputStreamを何らかの方法で必要としないことが分かります。だから、私はNopOutputstreamを使いました。 public void write(byte b []、int off、int len)throws IOException {0} {0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} IOExceptionをスローする{} } ' –

関連する問題