2016-08-08 61 views
1

我已經遇到了iText 7中一個很奇怪的問題,我希望其他人在過去處理過。我基本上只是試圖通過將一系列Link對象添加到Paragraph對象中,然後將Paragraph放入Canvas對象來創建目錄。這裏有一個簡化代碼示例:將鏈接添加到畫布上時出現iText錯誤

PdfCanvas pdfCanvas = new PdfCanvas(document.getPdfDocument().addNewPage()); 
    Rectangle rectangle = new Rectangle(36, 650, 100, 100); 
    pdfCanvas.rectangle(rectangle); 
    pdfCanvas.stroke(); 
    Canvas canvas = new Canvas(pdfCanvas, document.getPdfDocument(), rectangle); 
    canvas.add(new Paragraph(new Link("Google", PdfAction.createGoToR("HELLO", "www.google.com")))); 

正如你所看到的,這是相當純粹的骨頭。但是,當我這樣做時,我得到一個空指針異常。我可以在沒有任何問題的情況下添加簡單的文本,但是當我添加一個鏈接時,事情就會變得不合時宜。任何幫助將不勝感激。

+0

爲什麼倒票?這是一個合法的問題!我想我知道答案,但我需要先測試它。 (與此同時,我「不負責任」地加入了贊成票。) –

回答

4

這是你如何可以畫一個矩形(或在這種情況下,一個正方形)上PdfCanvas

PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
PdfPage page = pdf.addNewPage(); 
PdfCanvas pdfCanvas = new PdfCanvas(page); 
Rectangle rectangle = new Rectangle(36, 650, 100, 100); 
pdfCanvas.rectangle(rectangle); 
pdfCanvas.stroke(); 
pdf.close(); 

你並不需要一個Document對象。您只需創建一個PdfCanvas,然後繪製一個矩形形狀,其左下角爲x = 36; y = 360,用於測量100乘100個用戶單位。

您會引入Document對象,因爲您還需要創建Link。這也不是必要的。你可以試試這個(但這是錯誤的):

Canvas canvas = new Canvas(pdfCanvas, pdf, rectangle); 
canvas.add(new Paragraph().add("Google")); 
canvas.add(new Paragraph(new Link("Google", PdfAction.createGoToR("HELLO", "www.google.com")))); 
pdf.close(); 

正如你可以看到,我們與pdf(一PdfDocument)和pdf單獨工作。沒有涉及Document。但是,您正試圖添加指向Canvas對象的鏈接。如果您想要將PDF語法添加到內容流,則可以使用Canvas。鏈接不是內容流的一部分。鏈接是存儲在頁面字典的/Annots條目中的註釋。簡而言之:您正在使用Canvas,因爲它無法使用。

我認爲你正在試圖把一個鏈接放在絕對位置,並且你想要在該鏈接周圍放一個矩形。這不是使用Canvas完成的。如果您只將Paragraph置於絕對位置,則更容易。

例如:

public void createPdf(String dest) throws IOException { 
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
    Document document = new Document(pdf); 
    Paragraph p = new Paragraph() 
     .add(new Link("Google", PdfAction.createGoToR("HELLO", "www.google.com"))) 
     .setFixedPosition(36, 650, 80) 
     .setBorder(new SolidBorder(0.5f)); 
    document.add(p); 
    document.close(); 
} 

此添加一個Paragraph(x = 36; y = 650)位置和80個用戶單位的寬度。我們在Paragraph周圍添加了一個0.5厚的邊框。

這也行不通,因爲鏈接都是錯誤的。您正在使用GoToR(轉到遠程)操作,該操作旨在轉到另一個PDF文件中的特定目標。我認爲,你想要一個URI動作來代替:

public void createPdf(String dest) throws IOException { 
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
    Document document = new Document(pdf); 
    Paragraph p = new Paragraph() 
     .add(new Link("Google", PdfAction.createURI("www.google.com"))) 
     .setFixedPosition(36, 650, 80) 
     .setBorder(new SolidBorder(0.5f)); 
    document.add(p); 
    document.close(); 
} 

如果你想獲得周圍的文字更多的空間,你可以改變填充:

public void createPdf(String dest) throws IOException { 
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
    Document document = new Document(pdf); 
    Paragraph p = new Paragraph() 
     .add(new Link("Google", PdfAction.createURI("www.google.com"))) 
     .setFixedPosition(36, 650, 80) 
     .setPadding(10) 
     .setBorder(new SolidBorder(0.5f)); 
    document.add(p); 
    document.close(); 
} 

這比你嘗試過什麼更直觀實現。

+0

謝謝你的回覆!你不僅幫我解決了我的問題,而且現在我更瞭解了很多底層概念! –

相關問題