2016-08-08 4 views
1

J'ai rencontré un problème assez étrange dans iText 7 avec lequel j'espère que d'autres personnes ont déjà eu affaire. Essentiellement, j'essaie simplement de créer une table des matières en ajoutant une série d'objets Link dans un objet Paragraphe, puis en déposant le paragraphe dans un objet Canvas. Voici un exemple de code simplifié:Erreur iText lors de l'ajout de Link on 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")))); 

Comme vous pouvez le voir, ce sont des os assez nus. Lorsque je fais cela, cependant, j'obtiens une exception de pointeur nul. Je peux ajouter un texte simple sans aucun problème, mais au moment où j'ajoute un lien, les choses vont mal. Toute aide serait grandement appréciée.

+0

Pourquoi le vote négatif? C'est une question légitime! Je pense que je connais la réponse, mais je dois d'abord la tester. (Pendant ce temps, j'ai "défait" le vote négatif avec une mise à jour.) –

Répondre

4

Voici comment vous pouvez dessiner un rectangle (ou dans ce cas, un carré) sur un 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(); 

Vous n'avez pas besoin d'un objet Document. Vous venez de créer un PdfCanvas et vous dessinez une forme rectangulaire avec comme coin inférieur gauche x = 36; y = 360 mesurant 100 par 100 unités d'utilisateur. Vous introduisez un objet Document, car vous souhaitez également créer un Link. Ce n'est pas non plus nécessaire. Vous pouvez essayer cela (mais ce serait une erreur):

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

Comme vous pouvez le voir, nous travaillons avec pdf (un PdfDocument) et pdf seul. Il n'y a pas de Document impliqués. Cependant, vous essayez d'ajouter un lien vers un objet Canvas. Un Canvas peut être utilisé si vous souhaitez ajouter une syntaxe PDF au flux de contenu . Un lien ne fait pas partie du flux de contenu. Un lien est une annotation stockée dans l'entrée /Annots du dictionnaire de pages. En bref: vous utilisez Canvas pour quelque chose qu'il ne peut pas être utilisé.

Je pense que vous essayez de mettre un lien à une position absolue et que vous voulez mettre un rectangle autour de ce lien. Ce n'est pas fait en utilisant Canvas. C'est beaucoup plus facile si vous mettez simplement un Paragraph à une position absolue.

Par exemple:

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

Cette ajouter une Paragraph à la position (x = 36; y = 650) et une largeur de 80 unités utilisateur. Nous ajoutons une bordure d'épaisseur 0,5 autour du Paragraph.

Cela ne fonctionnera pas non plus, car le lien est tout faux. Vous utilisez une action GoToR (aller à distance) qui est destinée à aller à une destination spécifique dans un autre fichier PDF. Je pense que vous voulez une action URI à la place:

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

Si vous souhaitez obtenir plus d'espace autour du texte, vous pouvez modifier le rembourrage:

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

Cela est beaucoup plus intuitif que ce que vous avez essayé atteindre.

+0

Merci pour la réponse fantastique!Vous m'avez non seulement aidé avec mon problème, mais je comprends beaucoup de concepts sous-jacents maintenant! –