2017-09-07 1 views
0

Je suis nouveau à PDFBox et Boxable et j'espère que quelqu'un pourrait m'aider avec cela! Cette question est en référence à une question posée ici (Ref: https://github.com/dhorions/boxable/issues/89) En cela, flurinBoonea a présenté un petit exemple de code pour mettre du texte, de l'image et de la table tous dans la même page. Ma question est, si je veux créer une table (qui a une hauteur dynamique en fonction du contenu à l'intérieur), puis je dois mettre du texte après la table. Comment suis-je capable de faire ça?!? Quelque part Je l'ai lu tout en tirant la table que j'utilise quelque chose de similaire pour obtenir le YPosition pour l'élément suivant,Tableau disparaît lorsque dessiné avant contentStream - PDFBox avec Boxable

float yPosition = table.draw() 

et ensuite utiliser cette position pour l'élément suivant, mais chaque fois que je l'utilise table.draw avant le morceau de code suivant

PDPageContentStream contentStream = new PDPageContentStream(doc, page); 
contentStream.beginText(); 
contentStream.setFont(font, 18); 
contentStream.moveTextPositionByAmount(0, yPosition - 20); 
contentStream.drawString("This is a test message"); 
contentStream.endText(); 
contentStream.close(); 

La table disparaît et seul le texte est affiché. Je ne sais pas comment contourner cela. Quelqu'un pourrait m'aider avec ça. Je suis en quelque sorte coincé avec ce problème depuis un bon moment maintenant. Nous vous remercions à l'avance

Répondre

1

Vous créez un flux de contenu supplémentaire pour la page en question à l'aide

PDPageContentStream contentStream = new PDPageContentStream(doc, page); 

Ce constructeur est documenté comme:

/** 
* Create a new PDPage content stream. This constructor overwrites all existing content streams 
* of this page. 
* 
* @param document The document the page is part of. 
* @param sourcePage The page to write the contents to. 
* @throws IOException If there is an error writing to the page contents. 
*/ 
public PDPageContentStream(PDDocument document, PDPage sourcePage) throws IOException 

Lors de la création de ce flux de contenu, par conséquent, vous jeter tout le contenu que vous aviez sur cette page. Chaque fois que vous souhaitez ajouter au contenu existant, utilisez un constructeur différent, par exemple.

PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, true, true); 

qui est documenté comme

/** 
* Create a new PDPage content stream. 
* 
* @param document The document the page is part of. 
* @param sourcePage The page to write the contents to. 
* @param appendContent Indicates whether content will be overwritten, appended or prepended. 
* @param compress Tell if the content stream should compress the page contents. 
* @param resetContext Tell if the graphic context should be reset. This is only relevant when 
* the appendContent parameter is set to {@link AppendMode#APPEND}. You should use this when 
* appending to an existing stream, because the existing stream may have changed graphic 
* properties (e.g. scaling, rotation). 
* @throws IOException If there is an error writing to the page contents. 
*/ 
public PDPageContentStream(PDDocument document, PDPage sourcePage, AppendMode appendContent, 
          boolean compress, boolean resetContext) throws IOException 

En aparté: Vous dites que vous êtes nouveau à PDFBox et boxable, donc je suppose que vous utilisez une version actuelle, en particulier PDFBox 2.0.x. Si pour une raison quelconque vous avez choisi d'utiliser une ancienne version (par exemple 1.8.x), vous avez besoin de

PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true, true); 

à la place.