2016-05-23 14 views
0

PDFBoxを使用してJavaでレポートを生成しています。私の要件の1つは、ページの上部に会社ロゴを含むPDFドキュメントを作成することです。私はそれを達成する方法を見つけることができません。私は、Javaクラスで次のメソッドを持っています:Apache PDFBoxを使用して画像をPDFページの先頭に移動する方法

public void createPdf() { 

     PDDocument document = null; 

     PDPage page = null; 

     ServletContext servletContext = (ServletContext) FacesContext 
       .getCurrentInstance().getExternalContext().getContext(); 

     try { 

      File f = new File("Afiliado_2.pdf"); 

      if (f.exists() && !f.isDirectory()) { 
       document = PDDocument.load(new File("Afiliado_2.pdf")); 

       page = document.getPage(0); 
      } else { 

       document = new PDDocument(); 

       page = new PDPage(); 

       document.addPage(page); 
      } 

      PDImageXObject pdImage = PDImageXObject.createFromFile(
        servletContext.getRealPath("/resources/images/logo.jpg"), 
        document); 

      PDPageContentStream contentStream = new PDPageContentStream(
        document, page, AppendMode.APPEND, true); 


      contentStream.drawImage(pdImage, 0, 0); 

      // Make sure that the content stream is closed: 
      contentStream.close(); 

      // Save the results and ensure that the document is properly closed: 
      document.save("Afiliado_2.pdf"); 
      document.close(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

イメージは現在PDFの一番下に表示されています。変更する必要がある行はですが、ページの上部に表示されるように指定する必要のある座標は何ですか?

+0

おそらく 'AppendMode.APPEND'にはこれと関係がありますか? – UDKOX

+2

Maruansの回答に加えて、既存のファイルの場合、5番目のパラメータ(resetContext)を持つPDPageContentStreamコンストラクタを使用する方が安全です。 –

答えて

2

通常、PDFのページの座標系は、左下隅から始まります。したがって、

contentStream.drawImage(pdImage, 0, 0); 

あなたはその時点で画像を描画しています。

page.getMediaBox(); 

を使用してページの境界線を取得し、それを使用して画像の位置を確認します。

PDRectangle mediaBox = page.getMediaBox(); 

// draw with the starting point 1 inch to the left 
// and 2 inch from the top of the page 
contentStream.drawImage(pdImage, 72, mediaBox.getHeight() - 2 * 72); 

ここで、PDFファイルは通常、72ポイントから1物理サイズを指定します。

+0

なぜ72を使用していますか? – Erick

+0

これはPDFの標準的な単位です。 72ポイントは1インチです。申し訳ありませんが、私はそれを当然としています。 –

+1

おそらく、メディアボックスの代わりにクロップボックスを使用するべきです。 – mkl

関連する問題