2016-09-11 7 views
0

Ich versuche, Text in ein PDF zu drucken, und ich habe alles eingerichtet und funktioniert so weit. Ich habe eine Linie, die 6-Zoll breit ist, das ist (6 * 72) 432 Gerät Pixel. Was ich versuche zu tun ist, Text auf diese Linie, Mitte-Aliened zu drucken und beide Seiten zu füllen, um die volle Breite der Linie zu besetzen. Beispiel ------ Hallo, das ist mein Text ------. Hier ist ein Ausschnitt meines Codes, in dem ich versuche, den von meinem Text belegten Platz abzuschätzen, damit ich berechnen kann, wie viele Zeichen vor und nach eingefügt werden sollen.Itext7 Text zentrieren und beide Seiten füllen

PdfFont font = PdfFontFactory.createFont(FontConstants.HELVETICA); 
canvas.setFontAndSize(font, 12); 
System.out.println(font.getContentWidth(new PdfString("Hello there, this is my Text"))); 

Dieser Code erzeugt eine Zahl von mehr als zweitausend, die weit mehr als 432. Nicht sicher, was die zurückgegebenen Einheiten. Wie schätze ich die Länge meiner Saite und center-Aline es innerhalb 432dp ? Der zusätzliche Speicherplatz muss mit einem Sonderzeichen gefüllt werden. Es ist sehr ähnlich wie ein Scheck gedruckt wird, wo die Menge in Worten angegeben und auf beiden Seiten gefüllt wird, wenn Platz vorhanden ist.

Ich schaute auf this post und this other post, aber ich komme nirgends mit diesem. Bitte beraten.

Antwort

2

Bitte sehen Sie sich die Tags des Beitrags an, auf den Sie sich beziehen: How can I find the maximum character limit for a text field? Das letzte Tag bezieht sich auf iText 5, während Sie iText 7 verwenden. Mit anderen Worten: Sie sehen sich den falschen FAQ-Eintrag an. Der iText 7 FAQ-Eintrag für diese Frage ist: How can I find the maximum character limit for a text field? Aber das beantwortet Ihre Frage nicht.

Sie lesen sollten How to choose the optimal size for a font?

Der Wert, den Sie erhalten, wenn Sie Text messen wird in Glyphe Raum ausgedrückt:

PdfFont font = PdfFontFactory.createFont(FontConstants.HELVETICA); 
float glyphWidth = font.getContentWidth(new PdfString("Hello there, this is my Text")); 

Es ist normal, dass diese Zeilen nicht ausreichen, um die Breite im User-Space zu erhalten (die ist was du suchst). Warum ist das normal? Weil das Objekt font keine Ahnung von der Schriftgröße hat, die Sie verwenden werden.

In Ihrem Fall verwenden Sie eine Schriftart von 12pt. Daraus ergibt sich die Breite des PdfString ist:

float width = glyphWidth * 0.001f * 12f; 

Das ist die Breite die Sie suchen.

Die Zentrierung dieses Textes an einer absoluten Position kann mit der Methode showTextAligned() erfolgen. Es gibt viele alternative Möglichkeiten, dies zu erreichen. Das könnte das Thema einer anderen Frage sein, weil Sie nicht all das Mathe machen müssen.

Sie können dies nur tun:

/* 
* Example written in answer to a question on StackOverflow. 
* http://stackoverflow.com/questions/39437838 
*/ 
package com.itextpdf.sandbox.text; 

import com.itextpdf.kernel.color.Color; 
import com.itextpdf.kernel.geom.PageSize; 
import com.itextpdf.kernel.geom.Rectangle; 
import com.itextpdf.kernel.pdf.PdfDocument; 
import com.itextpdf.kernel.pdf.PdfWriter; 
import com.itextpdf.kernel.pdf.canvas.PdfCanvas; 
import com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer; 
import com.itextpdf.layout.Document; 
import com.itextpdf.layout.element.Paragraph; 
import com.itextpdf.layout.element.Tab; 
import com.itextpdf.layout.element.TabStop; 
import com.itextpdf.layout.property.TabAlignment; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* @author bruno 
*/ 
public class CenterText { 
    class MyLine implements ILineDrawer { 
     private float lineWidth = 1; 
     private float offset = 5; 
     private Color color = Color.BLACK; 
     @Override 
     public void draw(PdfCanvas canvas, Rectangle drawArea) { 
      canvas.saveState() 
       .setStrokeColor(color) 
       .setLineWidth(lineWidth) 
       .moveTo(drawArea.getX(), drawArea.getY() + lineWidth/2 + offset) 
       .lineTo(drawArea.getX() + drawArea.getWidth(), drawArea.getY() + lineWidth/2 + offset) 
       .stroke() 
       .restoreState(); 
     } 

     @Override 
     public float getLineWidth() { 
      return lineWidth; 
     } 
     @Override 
     public void setLineWidth(float lineWidth) { 
      this.lineWidth = lineWidth; 
     } 
     @Override 
     public Color getColor() { 
      return color; 
     } 
     @Override 
     public void setColor(Color color) { 
      this.color = color; 
     } 
     public float getOffset() { 
      return offset; 
     } 
     public void setOffset(float poffset) { 
      this.offset = offset; 
     } 

    } 

    public static final String DEST = "results/text/center_text.pdf"; 

    public static void main(String[] args) throws IOException { 
     File file = new File(DEST); 
     file.getParentFile().mkdirs(); 
     new CenterText().createPdf(DEST); 
    } 
    public void createPdf(String dest) throws IOException { 
     PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
     PageSize pagesize = PageSize.A4; 
     Document document = new Document(pdf, pagesize); 
     float w = pagesize.getWidth() - document.getLeftMargin() - document.getRightMargin(); 
     MyLine line = new MyLine(); 
     List<TabStop> tabstops = new ArrayList(); 
     tabstops.add(new TabStop(w/2, TabAlignment.CENTER, line)); 
     tabstops.add(new TabStop(w, TabAlignment.LEFT, line)); 
     Paragraph p = new Paragraph(); 
     p.addTabStops(tabstops); 
     p.add(new Tab()).add("Text in the middle").add(new Tab()); 
     document.add(p); 
     document.close(); 
    } 
} 
+0

Warum würden Sie tun Mathe selbst wenn iText kann es für Sie tun? –