2009-07-25 4 views
0

Wir haben pdf-Vorlagen der folgenden Art, die von einer Web-Anwendung erzeugt werden müssen:Generieren von PDFs in Java mit iText. Unterstützung für Frei fließende Text

Probe Absatz:

Lieber {customer.name},

Ihr Anwalt, {customer.lawyer.name} hat uns bezüglich Ihres Kontos {customer.account.number} kontaktiert, um die sofortige Schließung des Kontos zu beantragen.

...

Die {...} Felder oben erwähnt sind die verschiedenen Acro Felder aufzunehmen, die als Platzhalter einsetzen würde, so dass sie mit Daten gefüllt werden können.

Aber das Problem ist, dass der {customer.lawyer.name} Feld unterschiedlicher Länge sein können, 10 Zeichen zu 50 Zeichen,

iText verwenden, wie können wir eine pdf für die obige Vorlage erzeugen, so dass variierende Längen der Variable können untergebracht werden? Wickeln Sie den Text vielleicht sogar richtig herum?

Antwort

1

Ich habe iText-Spalten verwendet, um Buchstaben zu formatieren. Hier ist ein Beispiel aus meiner Arbeit. Beachten Sie, dass ich dies nur in Stack Overflow eingegeben habe. Ich habe es nicht kompiliert oder getestet.

Stellen Sie sich eine Datei vor, in der zwei Zeilenumbrüche in einer Zeile einen Absatz angeben. Der Text wird ansonsten vom Texteditor umschlossen. Die folgende Klasse hat eine Methode namens generate, die die Datei liest und eine US-Letter-PDF-Datei mit einem Rand von 1 Zoll oben und unten und 1 1/2 Zoll Rand auf jeder Seite ausgibt.

/** Generates a letter. */ 
public class LetterGenerator 
{ 
    /** One inch is 72 points. */ 
    private final static int INCH = 72; 

    /** Generate a letter. */ 
    public void generate() throws DocumentException, IOException 
    { 
     BufferedReader in = new BufferedReader(new FileReader("letter.txt")); 
     Document document = new Document(PageSize.LETTER); 
     PdfWriter.getInstance(document, new FileOutputStream("letter.pdf")); 
     PdfContentByte cb = writer.getDirectContent(); 
     ColumnText ct = new ColumnText(cb); 
     String para; 
     int spacingBefore = 0; 
     while ((para = in.readLine()) != null) 
     { 
      line = line.trim(); 
      if (line.length() != 0) 
      { 
       // Shekhar, do your place-holder replacement here. 
       Paragraph p = new Paragraph(line); 
       p.setSpacingBefore(spacingBefore); 
       ct.addElement(p); 
       spacingBefore = 8; 
      } 
     } 
     ct.setSimpleColumn(INCH, INCH * 1.5f, 7.5f * INCH, 9.5f * INCH); 
     int status = ColumnText.START_COLUMN; 
     while ((status & ColumnText.NO_MORE_TEXT) == 0) 
     { 
      status = ct.go(); 
      ct.setYLine(PageSize.LETTER.getHeight() - INCH); 
      ct.setSimpleColumn(INCH, INCH * 1.5f, 7.5f * INCH, 9.5f * INCH); 
      document.newPage(); 
     } 
     document.close(); 
    } 
} 

Für das Leben von mir kann ich mich nicht erinnern, warum ich die Y-Linie zurücksetzte.

iText ist eine nette Bibliothek. Ich habe das meiste von dem, was ich darüber weiß, durch Lesen der Tutorials aus dem iText in Action Buch gelernt.

http://developers.itextpdf.com/examples/

Leider habe ich nie zu kaufen das Buch herumkommen.