2016-08-08 34 views
1

Ich habe ein ziemlich seltsames Problem in iText 7, dass ich hoffe, dass andere Leute in der Vergangenheit behandelt haben. Ich versuche im Wesentlichen nur ein Inhaltsverzeichnis zu erstellen, indem ich eine Reihe von Link-Objekten in ein Paragraph-Objekt einfüge und dann den Absatz in ein Canvas-Objekt ablege. Hier ist ein Beispiel für vereinfachten Code:iText-Fehler beim Hinzufügen von Link auf Canvas

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

Wie Sie sehen können, ist dies ziemlich nackt. Wenn ich dies tue, erhalte ich jedoch eine Nullzeiger-Ausnahme. Ich kann einfachen Text ohne Probleme hinzufügen, aber sobald ich einen Link hinzufüge, gehen die Dinge drunter und drüber. Jede Hilfe würde sehr geschätzt werden. Diese

+0

Warum die Abstimmung unten? Dies ist eine legitime Frage! Ich denke, ich kenne die Antwort, aber ich muss es zuerst testen. (In der Zwischenzeit habe ich das Down-Vote mit einem Up-Vote "rückgängig gemacht".) –

Antwort

4

ist, wie Sie ein Rechteck zeichnen konnte (oder in diesem Fall ein Quadrat) auf einem 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(); 

Sie brauchen nicht ein Document Objekt benötigen. Sie erstellen einfach eine PdfCanvas und zeichnen eine rechteckige Form mit der unteren linken Ecke x = 36; y = 360, die 100 mal 100 Benutzereinheiten misst.

Sie führen ein Document Objekt ein, weil Sie auch ein Link erstellen möchten. Das ist auch nicht notwendig. Sie könnten versuchen, diese (aber das wäre falsch):

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

Wie Sie sehen können, arbeiten wir mit pdf (a PdfDocument) und pdf allein. Es gibt keine Document beteiligt. Sie versuchen jedoch, eine Verknüpfung zu einem Objekt Canvas hinzuzufügen. A Canvas kann verwendet werden, wenn Sie dem Content-Stream PDF-Syntax hinzufügen möchten. Ein Link ist nicht Teil des Content-Streams. Eine Verknüpfung ist eine Anmerkung, die im /Annots-Eintrag des Seitenwörterbuchs gespeichert ist. Kurz gesagt: Sie verwenden Canvas für etwas, das nicht verwendet werden kann.

Ich glaube, Sie versuchen, eine Verbindung zu einer absoluten Position zu bringen, und dass Sie diesen Link, um ein Rechteck setzen wollen um. Das ist nicht mit Canvas getan. Es ist viel einfacher, wenn Sie einfach eine Paragraph an einer absoluten Position setzen.

Zum Beispiel:

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

Dieses Add a Paragraph an Position (x = 36; y = 650) und eine Breite von 80 Benutzereinheiten. Wir fügen einen 0,5 dicken Rand um die Paragraph hinzu.

Dies wird auch nicht funktionieren, weil die Verbindung falsch ist. Sie verwenden eine GoToR (gehen zu Remote) Aktion, die zu einem bestimmten Ziel in einer anderen PDF-Datei gehen soll. Ich glaube, dass Sie eine URI Aktion wollen statt:

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

Wenn Sie wollen, um den Text mehr Platz zu bekommen, können Sie die Polsterung ändern:

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

Das ist viel intuitiver als das, was Sie versucht haben, erreichen.

+0

Vielen Dank für die fantastische Antwort!Du hast mir nicht nur bei meinem Problem geholfen, sondern ich verstehe jetzt viele der zugrunde liegenden Konzepte besser! –