2012-10-17 86 views
4

我正在使用iText來生成PDF。我創建了一個自定義的PdfPageEventHelper,爲每個頁面添加一個頁眉(和頁腳)。如何在iText生成的PDF中將圖像添加到我的標題中?

我的問題是我不知道如何添加圖像,以便它顯示在「標題框」中。我只知道如何將圖像添加到文檔內容本身(如果有意義的話)。

下面是一些代碼片段...

public static void main(String[] args) { 
    Rectangle headerBox = new Rectangle(36, 54, 559, 788); 
    /* ... */ 
    Document document = new Document(PageSize.A4, 36, 36, 154, 54); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILENAME)); 
    HeaderFooter event = new HeaderFooter(); 
    writer.setBoxSize("headerBox", headerBox); 
    writer.setPageEvent(event); 
    document.open(); 
    addContent(); 
    document.close(); 
} 

static class HeaderFooter extends PdfPageEventHelper { 

    public void onEndPage(PdfWriter writer, Document document) { 
    Rectangle rect = writer.getBoxSize("headerBox"); 
    // add header text 
    ColumnText.showTextAligned(writer.getDirectContent(), 
     Element.ALIGN_RIGHT, new Phrase("Hello", fontHeader1), 
     rect.getLeft(), rect.getTop(), 0); 

    // add header image 
    try { 
     Image img = Image.getInstance("c:/mylogo.PNG"); 
     img.scaleToFit(100,100); 
     document.add(img); 
    } catch (Exception x) { 
     x.printStackTrace(); 
    } 

    } 

} 

到圖像添加到標題中的適當的方式任何建議都非常感謝!

羅布

+0

應該'writer'在'onEndPage'與'pdfWriter'交換? –

+0

@denisk這是一個錯字,抱歉 - 但感謝您的好眼睛。 –

回答

11

你犯了兩個重大錯誤。

  1. 您正在爲每個新頁面創建對象的新實例。這將導致臃腫的PDF,因爲圖像字節將被添加到頁面的次數。請在onEndPage()方法之外創建Image對象,並重新使用它。這樣,圖像字節將只添加到PDF一次。
  2. 如文檔所述,Document傳遞給onEndPage()方法,因爲參數應被視爲只讀參數。禁止向其添加內容。這是一個與您使用new Document(PageSize.A4, 36, 36, 154, 54)創建的對象不同的對象。實際上,它是由PdfWriter實例在內部創建的PdfDocument類的一個實例。要添加圖片,您需要從作者處獲得PdfContentByte,並使用addImage()添加圖片。

通過閱讀文檔可以輕鬆避免這樣的錯誤。您可以通過閱讀我的書iText in Action節省大量時間。

+0

爲什麼地球上這是低調? –

+0

@BrunoLowagie非常有幫助!謝謝。我會花更多時間在你的書上。與此同時,你(和Denisk)建議的工作,但它有一個副作用。當我添加'img.setAbsolutePosition(35,742); writer.getDirectContent()。addImage(img);'把圖片放在每個頁面的頂部,我的所有文檔內容(標題除外)都被推送到第二頁。第一頁是空白的。任何想法我做錯了什麼?如果有幫助,我可以用詳細的代碼發佈一個新的stackoverflow問題。 –

+0

@RobertHume發佈一個新問題的方法是 –

5

您可以嘗試

img.setAbsolutePosition(10, 10); 
writer.getDirectContent().addImage(img); 

代替

document.add(img); 

onPageEnd

+0

謝謝,非常有用,在一天結束時布魯諾的答案更詳細和有幫助,所以我不得不「檢查」他 - 我希望你明白!再次感謝。 –

+0

@RobertHume我完全同意你對這個 –

1

我設置abolute位置和排列的圖像(在這種情況下,我把我的形象在頭)

try { 
     Image img = Image.getInstance("url/logo.png"); 
     img.scaleToFit(100,100); 
     img.setAbsolutePosition((rect.getLeft() + rect.getRight())/2 - 45, rect.getTop() - 50); 
     img.setAlignment(Element.ALIGN_CENTER);   
     writer.getDirectContent().addImage(img); 
     } catch (Exception x) { 
     x.printStackTrace(); 
     } 

爲了我還調整了文檔頁邊距已分隔空間文檔的頁眉和頁腳。

document.setMargins(20, 20, 100, 100); 
1

在頁面頂部添加圖像的通用解決方案。我們也可以通過將圖像置於頂部來實現。它可能會解決您的要求

public static void main(String[] args) throws MalformedURLException, IOException, DocumentException { 
     Document document = new Document(); 
     try { 
      PdfWriter.getInstance(document, 
        new FileOutputStream("HelloWorld.pdf")); 
      document.open(); 

      // 
      // Scale the image to a certain percentage 
      // 
      String filename = "image.jpg"; 
      Image image = Image.getInstance(filename); 
      image = Image.getInstance(filename); 
      image.scalePercent(200f); 
      image.setAbsolutePosition(0, (float) (PageSize.A4.getHeight() - 20.0)); 
      System.out.println(image.getScaledHeight()); 
      document.add(image); 

      // 
      // Scales the image so that it fits a certain width and 
      // height 
      // 
      image.scaleToFit(100f, 200f); 
      document.add(image); 
      document.add(new Chunk("This is chunk 3. ")); 
      System.out.println("created"); 
     } catch (DocumentException | IOException e) { 
      e.printStackTrace(); 
     } finally { 
      document.close(); 
     } 
} 

}

+0

OP正在討論在頁面事件監聽器中添加圖像,而在這樣的監聽器中,您不應該直接通過'document.add'添加任何內容,參見參考資料。例如@布魯諾的答案,第2項。因此,您的解決方案並不適用於當前的情況。 – mkl

相關問題