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:
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 :) –
* "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
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? –