2016-05-23 5 views
0

Ich verwende PDFBox, um Berichte in Java zu generieren. Eine meiner Anforderungen besteht darin, ein PDF-Dokument zu erstellen, das das Firmenlogo oben auf der Seite enthält. Ich bin nicht in der Lage, den Weg zu finden, dies zu erreichen. Ich habe die folgende Methode in einer Java-Klasse:wie man Bild an den Anfang der PDF-Seite mit Hilfe von Apache PDFBox verschieben

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(); 
     } 

    } 

Das Bild wird derzeit im unteren Teil der PDF angezeigt. Ich weiß, dass die Zeile, die ich ändern muss, contentStream.drawImage(pdImage, 0, 0); ist, aber welche Koordinaten muss ich angeben, damit sie oben auf der Seite angezeigt wird?

+0

Vielleicht hat 'AppendMode.APPEND' etwas damit zu tun? – UDKOX

+2

Zusätzlich zu Maruans Antwort - für vorhandene Dateien kann es sicherer sein, den PDPageContentStream-Konstruktor mit dem 5. Parameter (resetContext) zu verwenden. –

Antwort

2

Normalerweise beginnt das Koordinatensystem für eine PDF-Seite in der unteren linken Ecke. Also mit

contentStream.drawImage(pdImage, 0, 0); 

Sie zeichnen Ihr Bild an diesem Punkt. Sie können die Grenzen Ihrer Seite mit

und verwenden, um Ihr Bild z.

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); 

wobei PDF-Dateien normalerweise 72 Punkte auf 1 physikalischen Zoll angeben.

+0

Warum benutzen Sie 72? – Erick

+0

Das ist die Standardeinheit für PDF. 72 Punkte sind ein Zoll. Entschuldigung, dass ich das als gegeben angenommen habe. –

+1

Sie sollten wahrscheinlich die Crop-Box anstelle der Medienbox verwenden. – mkl

Verwandte Themen