2017-02-16 4 views
0

J'ai besoin de mettre du texte dynamique sur un pdf. Je dois vérifier que le texte ne déborde pas de la boîte aux lettres que je suis autorisé à utiliser pour placer le texte.iText Détecter le dépassement de texte ou l'ajustement de la copie

  • Y at-il un moyen de détecter si cela se produit?
  • Existe-t-il des règles de copie que je peux utiliser pour le gérer quand cela se produit?

Merci

+0

Utilisez-vous iText5 ou iText7? Le tag itext se réfère généralement à l'ancien. En outre, Java ou .Net? Les deux versions ont un moyen de simuler le placement du contenu, mais la réponse dépend de la version :) –

+0

* "Je dois mettre du texte dynamique sur un pdf" * - Comment cela se fera-t-il? Voulez-vous remplir les champs de texte ** AcroForm **? Ou voulez-vous ajouter des annotations ** FreeText ** (** FreeTextTypeWriter **)? Ou voulez-vous ajouter à la page ** Contenu ** flux? – mkl

+0

Définir "texte dynamique". Est-ce un texte que vous ne connaissez pas la longueur d'avant d'exécuter votre programme? Ou est-ce en tant que messages mkl? –

Répondre

2

iText5 est en mode maintenance et je vous recommande de commencer votre projet à l'aide iText7. iText7 actuellement ne fournit pas de mécanismes prêts à l'emploi pour l'ajustement de la copie, mais cela peut être fait manuellement avec peu d'effort, car le moteur de mise en page est très flexible dans iText7. Techniquement, cela peut être fait aussi en iText5, mais je vais fournir une réponse pour Java pour iText7, et la conversion en C# ne devrait pas poser de problème pour vous. L'idée de base est d'utiliser le concept de Renderers et d'essayer de mettre en forme votre paragraphe dans la zone donnée avec différentes tailles de police jusqu'à ce que vous trouviez la taille qui vous convient. Une approche de recherche binaire s'inscrit parfaitement ici.

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); 
Document doc = new Document(pdfDoc); 

String text = "..."; 
Rectangle area = new Rectangle(100, 100, 200, 200); 
// Just draw a black box around to verify the result visually 
new PdfCanvas(pdfDoc.addNewPage()).rectangle(area).setStrokeColor(Color.BLACK).stroke(); 

Paragraph p = new Paragraph(text); 
IRenderer renderer = p.createRendererSubTree().setParent(doc.getRenderer()); 
LayoutArea layoutArea = new LayoutArea(1, area); 

// lFontSize means the font size which will be definitely small enough to fit all the text into the box. 
// rFontSize is the maximum bound for the font size you want to use. The only constraint is that it should be greater than lFontSize 
// Set rFontSize to smaller value if you don't want the font size to scale upwards 
float lFontSize = 0.0001f, rFontSize = 10000; 

// Binary search. Can be replaced with while (Math.abs(lFontSize - rFontSize) < eps). It is a matter of implementation/taste 
for (int i = 0; i < 100; i++) { 
    float mFontSize = (lFontSize + rFontSize)/2; 
    p.setFontSize(mFontSize); 
    LayoutResult result = renderer.layout(new LayoutContext(layoutArea)); 
    if (result.getStatus() == LayoutResult.FULL) { 
     lFontSize = mFontSize; 
    } else { 
     rFontSize = mFontSize; 
    } 
} 

// lFontSize is guaranteed to be small enough to fit all the text. Using it. 
float finalFontSize = lFontSize; 
System.out.println("Final font size: " + finalFontSize); 
p.setFontSize(finalFontSize); 
// We need to layout the final time with the final font size set. 
renderer.layout(new LayoutContext(layoutArea)); 
renderer.draw(new DrawContext(pdfDoc, new PdfCanvas(pdfDoc.getPage(1)))); 

doc.close(); 

La sortie:

Final font size: 5.7393746 

résultat visuel:

The output PDF looks like this