iText pdf library
Website search

Chapter 11: Choosing the right font

These examples were written in the context of Chapter 11 of the book "iText in Action - Second Edition".

FontTypes.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;
 
public class FontTypes {
 
    /** The resulting PDF file. */
    public static String RESULT
        = "results/part3/chapter11/font_types.pdf";
    /** Some text. */
    public static String TEXT
        = "quick brown fox jumps over the lazy dog\nQUICK BROWN FOX JUMPS OVER THE LAZY DOG";
    
    /** Paths to and encodings of fonts we're going to use in this example */
    public static String[][] FONTS = {
        {BaseFont.HELVETICA, BaseFont.WINANSI},
        {"resources/fonts/cmr10.afm", BaseFont.WINANSI},
        {"resources/fonts/cmr10.pfm", BaseFont.WINANSI},
        //{"c:/windows/fonts/ARBLI__.TTF", BaseFont.WINANSI},
        {"c:/windows/fonts/arial.ttf", BaseFont.WINANSI},
        {"c:/windows/fonts/arial.ttf", BaseFont.IDENTITY_H},
        {"resources/fonts/Puritan2.otf", BaseFont.WINANSI},
        {"c:/windows/fonts/msgothic.ttc,0", BaseFont.IDENTITY_H},
        {"KozMinPro-Regular", "UniJIS-UCS2-H"}
    };
 
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        BaseFont bf;
        Font font;
        for (int i = 0; i < FONTS.length; i++) {
            bf = BaseFont.createFont(FONTS[i][0], FONTS[i][1], BaseFont.EMBEDDED);
            document.add(new Paragraph(
                    String.format("Font file: %s with encoding %s", FONTS[i][0], FONTS[i][1])));
            document.add(new Paragraph(
                    String.format("iText class: %s", bf.getClass().getName())));
            font = new Font(bf, 12);
            document.add(new Paragraph(TEXT, font));
            document.add(new LineSeparator(0.5f, 100, null, 0, -5));
        }
        // step 5
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new FontTypes().createPdf(RESULT);
    }
}
TTCExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class TTCExample {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/ttc_example.pdf";
    /** The path to the font. */
    public static final String FONT = "c:/windows/fonts/msgothic.ttc";
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3: we open the document
        document.open();
        // step 4
 
        BaseFont bf;
        Font font;
        String[] names = BaseFont.enumerateTTCNames(FONT);
        for (int i = 0; i < names.length; i++) {
            bf = BaseFont.createFont(String.format("%s,%s", FONT, i),
                BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            font = new Font(bf, 12);
            document.add(new Paragraph("font " + i + ": " + names[i], font));
            document.add(new Paragraph("Rash\u00f4mon", font));
            document.add(new Paragraph("Directed by Akira Kurosawa", font));
            document.add(new Paragraph("\u7f85\u751f\u9580", font));
            document.add(Chunk.NEWLINE);
        }
        // step 5: we close the document
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new TTCExample().createPdf(RESULT);
    }
}
EncodingNames.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class EncodingNames {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/font_encodings.pdf";
    /** The path to the font. */
    public static final String[] FONT = {
        "c:/windows/fonts/ARBLI__.TTF",
        "resources/fonts/Puritan2.otf",
        "c:/windows/fonts/arialbd.ttf"
    };
    
 
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document(new Rectangle(350, 842));
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        showEncodings(document, FONT[0]);
        showEncodings(document, FONT[1]);
        document.newPage();
        showEncodings(document, FONT[2]);
        // step 5
        document.close();
    }
    
    /**
     * Writes the available encodings of a font to the document.
     * @param document the document to which the encodings have to be written
     * @param font     the font
     * @throws DocumentException
     * @throws IOException
     */
    public void showEncodings(Document document, String font) throws DocumentException, IOException {
        BaseFont bf = BaseFont.createFont(font, BaseFont.WINANSI, BaseFont.EMBEDDED);
        document.add(new Paragraph("PostScript name: " + bf.getPostscriptFontName()));
        document.add(new Paragraph("Available code pages:"));
        String[] encoding = bf.getCodePagesSupported();
        for (int i = 0; i < encoding.length; i++) {
            document.add(new Paragraph("encoding[" + i + "] = " + encoding[i]));
        }
        document.add(Chunk.NEWLINE);
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args)
        throws IOException, DocumentException {
        new EncodingNames().createPdf(RESULT);
    }
}
EncodingExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class EncodingExample {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/encoding_example.pdf";
    /** The path to the font. */
    public static final String FONT
        = "c:/windows/fonts/arialbd.ttf";
    /** Movie information. */
    public static final String[][] MOVIES = {
        {
            "Cp1252",
            "A Very long Engagement (France)",
            "directed by Jean-Pierre Jeunet",
            "Un long dimanche de fian\u00e7ailles"
        },
        {
            "Cp1250",
            "No Man's Land (Bosnia-Herzegovina)",
            "Directed by Danis Tanovic",
            "Nikogar\u0161nja zemlja"
        },
        {
            "Cp1251",
            "You I Love (Russia)",
            "directed by Olga Stolpovskaja and Dmitry Troitsky",
            "\u042f \u043b\u044e\u0431\u043b\u044e \u0442\u0435\u0431\u044f"
        },
        {
            "Cp1253",
            "Brides (Greece)",
            "directed by Pantelis Voulgaris",
            "\u039d\u03cd\u03c6\u03b5\u03c2"
        }
    };
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        BaseFont bf;
        for (int i = 0; i < 4; i++) {
            bf = BaseFont.createFont(FONT, MOVIES[i][0], BaseFont.EMBEDDED);
            document.add(new Paragraph("Font: " + bf.getPostscriptFontName()
                    + " with encoding: " + bf.getEncoding()));
            document.add(new Paragraph(MOVIES[i][1]));
            document.add(new Paragraph(MOVIES[i][2]));
            document.add(new Paragraph(MOVIES[i][3], new Font(bf, 12)));
            document.add(Chunk.NEWLINE);
        }
        // step 5
        document.close();
    }
    
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args)
        throws IOException, DocumentException {
        new EncodingExample().createPdf(RESULT);
    }
}
UnicodeExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class UnicodeExample extends EncodingExample {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/unicode_example.pdf";
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3: we open the document
        document.open();
        // step 4
        BaseFont bf;
        for (int i = 0; i < 4; i++) {
            bf = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            document.add(new Paragraph("Font: " + bf.getPostscriptFontName()
                    + " with encoding: " + bf.getEncoding()));
            document.add(new Paragraph(MOVIES[i][1]));
            document.add(new Paragraph(MOVIES[i][2]));
            document.add(new Paragraph(MOVIES[i][3], new Font(bf, 12)));
            document.add(Chunk.NEWLINE);
        }
        // step 5: we close the document
        document.close();
    }
    
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args)
        throws IOException, DocumentException {
        new UnicodeExample().createPdf(RESULT);
    }
}
FontFileAndSizes.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class FontFileAndSizes {
 
    /** The names of the resulting PDF files. */
    public static final String[] RESULT = {
        "results/part3/chapter11/font_not_embedded.pdf",
        "results/part3/chapter11/font_embedded.pdf",
        "results/part3/chapter11/font_embedded_less_glyphs.pdf",
        "results/part3/chapter11/font_compressed.pdf",
        "results/part3/chapter11/font_full.pdf"
    };
    /** The path to the font. */
    public static final String FONT = "c:/windows/fonts/arial.ttf";
    /** Some text. */
    public static String TEXT
        = "quick brown fox jumps over the lazy dog";
    /** Some text. */
    public static String OOOO
        = "ooooo ooooo ooo ooooo oooo ooo oooo ooo";
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename, BaseFont bf, String text)
        throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        document.add(new Paragraph(text, new Font(bf, 12)));
        // step 5
        document.close();
    }
    
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        FontFileAndSizes ffs = new FontFileAndSizes();
        BaseFont bf;
        bf = BaseFont.createFont(FONT, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
        ffs.createPdf(RESULT[0], bf, TEXT);
        bf = BaseFont.createFont(FONT, BaseFont.WINANSI, BaseFont.EMBEDDED);
        ffs.createPdf(RESULT[1], bf, TEXT);
        ffs.createPdf(RESULT[2], bf, OOOO);
        bf = BaseFont.createFont(FONT, BaseFont.WINANSI, BaseFont.EMBEDDED);
        bf.setCompressionLevel(9);
        ffs.createPdf(RESULT[3], bf, TEXT);
        bf = BaseFont.createFont(FONT, BaseFont.WINANSI, BaseFont.EMBEDDED);
        bf.setSubset(false);
        ffs.createPdf(RESULT[4], bf, TEXT);
    }
}
Type3Example.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.Type3Font;
 
public class Type3Example {
    
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/type3_example.pdf";
 
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        Type3Font t3 = new Type3Font(writer, true);
        PdfContentByte d = t3.defineGlyph('D', 600, 0, 0, 600, 700);
        d.setColorStroke(new BaseColor(0xFF, 0x00, 0x00));
        d.setColorFill(new GrayColor(0.7f));
        d.setLineWidth(100);
        d.moveTo(5, 5);
        d.lineTo(300, 695);
        d.lineTo(595, 5);
        d.closePathFillStroke();
        PdfContentByte s = t3.defineGlyph('S', 600, 0, 0, 600, 700);
        s.setColorStroke(new BaseColor(0x00, 0x80, 0x80));
        s.setLineWidth(100);
        s.moveTo(595,5);
        s.lineTo(5, 5);
        s.lineTo(300, 350);
        s.lineTo(5, 695);
        s.lineTo(595, 695);
        s.stroke();
        Font f = new Font(t3, 12);
        Paragraph p = new Paragraph();
        p.add("This is a String with a Type3 font that contains a fancy Delta (");
        p.add(new Chunk("D", f));
        p.add(") and a custom Sigma (");
        p.add(new Chunk("S", f));
        p.add(").");
        document.add(p);
        // step 5: we close the document
        document.close();
    }
    
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new Type3Example().createPdf(RESULT);
    }
}
CJKExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class CJKExample {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/cjk_example.pdf";
    /** Movies, their director and original title */
    public static final String[][] MOVIES = {
        {
            "STSong-Light", "UniGB-UCS2-H",
            "Movie title: House of The Flying Daggers (China)",
            "directed by Zhang Yimou",
            "\u5341\u950a\u57cb\u4f0f"
        },
        {
            "KozMinPro-Regular", "UniJIS-UCS2-H",
            "Movie title: Nobody Knows (Japan)",
            "directed by Hirokazu Koreeda",
            "\u8ab0\u3082\u77e5\u3089\u306a\u3044"
        },
        {
            "HYGoThic-Medium", "UniKS-UCS2-H",
            "Movie title: '3-Iron' aka 'Bin-jip' (South-Korea)",
            "directed by Kim Ki-Duk",
            "\ube48\uc9d1"
        }
    };
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        BaseFont bf;
        Font font;
        
        for (int i = 0; i < 3; i++) {
            bf = BaseFont.createFont(MOVIES[i][0], MOVIES[i][1], BaseFont.NOT_EMBEDDED);
            font = new Font(bf, 12);
            document.add(new Paragraph(bf.getPostscriptFontName(), font));
            for (int j = 2; j < 5; j++)
                document.add(new Paragraph(MOVIES[i][j], font));
            document.add(Chunk.NEWLINE);
        }
 
        
        // step 5
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new CJKExample().createPdf(RESULT);
    }
}
VerticalTextExample1.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.VerticalText;
 
public class VerticalTextExample1 {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/vertical_text_1.pdf";
    /** A Japanese String. */
    public static final String MOVIE = "\u4e03\u4eba\u306e\u4f8d";
    /** The facts. */
    public static final String TEXT1
       = "You embarrass me. You're overestimating me. "
       + "Listen, I'm not a man with any special skill, "
       + "but I've had plenty of experience in battles; losing battles, all of them.";
    /** The conclusion. */
    public static final String TEXT2
       = "In short, that's all I am. Drop such an idea for your own good.";
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document(new Rectangle(420, 600));
        // step 2
        PdfWriter writer
            = PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3: we open the document
        document.open();
        // step 4
        BaseFont bf = BaseFont.createFont(
            "KozMinPro-Regular", "UniJIS-UCS2-V", BaseFont.NOT_EMBEDDED);
        Font font = new Font(bf, 20);
        VerticalText vt = new VerticalText(writer.getDirectContent());
        vt.setVerticalLayout(390, 570, 540, 12, 30);
        vt.addText(new Chunk(MOVIE, font));
        vt.go();
        vt.addText(new Phrase(TEXT1, font));
        vt.go();
        vt.setAlignment(Element.ALIGN_RIGHT);
        vt.addText(new Phrase(TEXT2, font));
        vt.go();
        // step 5: we close the document
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new VerticalTextExample1().createPdf(RESULT);
    }
}
VerticalTextExample2.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.VerticalText;
 
public class VerticalTextExample2 extends VerticalTextExample1 {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/vertical_text_2.pdf";
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document(new Rectangle(420, 600));
        // step 2
        PdfWriter writer
            = PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3: we open the document
        document.open();
        // step 4
        BaseFont bf = BaseFont.createFont(
            "KozMinPro-Regular", "Identity-V", BaseFont.NOT_EMBEDDED);
        Font font = new Font(bf, 20);
        VerticalText vt = new VerticalText(writer.getDirectContent());
        vt.setVerticalLayout(390, 570, 540, 12, 30);
        font = new Font(bf, 20);
        vt.addText(new Phrase(convertCIDs(TEXT1), font));
        vt.go();
        vt.setAlignment(Element.ALIGN_RIGHT);
        vt.addText(new Phrase(convertCIDs(TEXT2), font));
        vt.go();
        // step 5: we close the document
        document.close();
    }
 
    /**
     * Converts the CIDs of the horizontal characters of a String
     * into a String with vertical characters.
     * @param text The String with the horizontal characters
     * @return A String with vertical characters
     */
    public String convertCIDs(String text) {
        char cid[] = text.toCharArray();
        for (int k = 0; k < cid.length; ++k) {
            char c = cid[k];
            if (c == '\n')
                cid[k] = '\uff00';
            else
                cid[k] = (char) (c - ' ' + 8720);
        }
        return new String(cid);
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new VerticalTextExample2().createPdf(RESULT);
    }
}
RightToLeftExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfWriter;
 
public class RightToLeftExample {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/right_to_left.pdf";
    /** A movie title. */
    public static final String MOVIE
        = "\u05d4\u05d0\u05e1\u05d5\u05e0\u05d5\u05ea \u05e9\u05dc \u05e0\u05d9\u05e0\u05d4";
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document(PageSize.A4);
        // step 2
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        BaseFont bf = BaseFont.createFont(
            "c:/windows/fonts/arial.ttf", BaseFont.IDENTITY_H, true);
        Font font = new Font(bf, 14);
        document.add(new Paragraph("Movie title: Nina's Tragedies"));
        document.add(new Paragraph("directed by Savi Gabizon"));
        ColumnText column = new ColumnText(writer.getDirectContent());
        column.setSimpleColumn(36, 770, 569, 36);
        column.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
        column.addElement(new Paragraph(MOVIE, font));
        column.go();
        // step 5
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new RightToLeftExample().createPdf(RESULT);
    }
 
}
SayPeace.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
 
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.ExceptionConverter;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
 
/**
 * This example was written by Bruno Lowagie. It is part of the book 'iText in
 * Action' by Manning Publications. 
 * ISBN: 1932394796
 * http://www.1t3xt.com/docs/book.php 
 * http://www.manning.com/lowagie/
 */
 
public class SayPeace extends DefaultHandler {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/say_peace.pdf";
    /** The XML file with the text. */
    public static final String RESOURCE
        = "resources/xml/say_peace.xml";
    
    /** The font that is used for the peace message. */
    public Font f;
 
    /** The document to which we are going to add our message. */
    protected Document document;
 
    /** The StringBuffer that holds the characters. */
    protected StringBuffer buf = new StringBuffer();
    
    /** The table that holds the text. */
    protected PdfPTable table;
    
    /** The current cell. */
    protected PdfPCell cell;
 
    /**
     * @see org.xml.sax.ContentHandler#startElement(java.lang.String,
     *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
     */
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if ("message".equals(qName)) {
            buf = new StringBuffer();
            cell = new PdfPCell();
            cell.setBorder(PdfPCell.NO_BORDER);
            if ("RTL".equals(attributes.getValue("direction"))) {
                cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
            }
        }
        else if ("pace".equals(qName)) {
            table = new PdfPTable(1);
            table.setWidthPercentage(100);
        }
    }
 
    /**
     * @see org.xml.sax.ContentHandler#endElement(java.lang.String,
     *      java.lang.String, java.lang.String)
     */
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if ("big".equals(qName)) {
            Chunk bold = new Chunk(strip(buf), f);
            bold.setTextRenderMode(
                    PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE, 0.5f,
                    GrayColor.GRAYBLACK);
            Paragraph p = new Paragraph(bold);
            p.setAlignment(Element.ALIGN_LEFT);
            cell.addElement(p);
            buf = new StringBuffer();
        }
        else if ("message".equals(qName)) {
            Paragraph p = new Paragraph(strip(buf), f);
            p.setAlignment(Element.ALIGN_LEFT);
            cell.addElement(p);
            table.addCell(cell);
            buf = new StringBuffer();
        }
        else if ("pace".equals(qName)) {
            try {
                document.add(table);
            } catch (DocumentException e) {
                throw new ExceptionConverter(e);
            }
        }
    }
 
    /**
     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
     */
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        buf.append(ch, start, length);
    }
 
    /**
     * Replaces all the newline characters by a space.
     * 
     * @param buf
     *            the original StringBuffer
     * @return a String without newlines
     */
    protected String strip(StringBuffer buf) {
        int pos;
        while ((pos = buf.indexOf("\n")) != -1)
            buf.replace(pos, pos + 1, " ");
        while (buf.charAt(0) == ' ')
            buf.deleteCharAt(0);
        return buf.toString();
    }
 
    /**
     * Creates the handler to read the peace message.
     * 
     * @param document
     * @param is
     * @throws FactoryConfigurationError
     * @throws ParserConfigurationException
     * @throws SAXException
     * @throws FactoryConfigurationError
     * @throws ParserConfigurationException
     * @throws IOException
     * @throws DocumentException
     */
    public SayPeace(Document document, InputSource is)
            throws ParserConfigurationException, SAXException,
            FactoryConfigurationError, DocumentException, IOException {
        this.document = document;
        f = new Font(BaseFont.createFont("c:/windows/fonts/arialuni.ttf",
                BaseFont.IDENTITY_H, BaseFont.EMBEDDED));
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        parser.parse(is, this);
    }
 
    /**
     * Generates a PDF with a Peace message in English, Arabic and Hebrew.
     * 
     * @param args no arguments needed
     */
    public static void main(String[] args) {
        // step 1:
        Document document = new Document(PageSize.A4);
        try {
            // step 2:
            PdfWriter.getInstance(document, new FileOutputStream(RESULT));
            // step 3:
            document.open();
            // step 4:
            new SayPeace(document,
                new InputSource(new FileInputStream(RESOURCE)));
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        // step 5: we close the document
        document.close();
    }
}
Diacritics1.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfWriter;
 
public class Diacritics1 {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/diacritics1.pdf";
    /** A movie title. */
    public static final String MOVIE
        = "\u0e1f\u0e49\u0e32\u0e17\u0e30\u0e25\u0e32\u0e22\u0e42\u0e08\u0e23";
    /** Movie poster */
    public static final String POSTER
        = "resources/posters/0269217.jpg";
    /** Fonts */
    public static final String[] FONTS = {
        "c:/windows/fonts/angsa.ttf",
        "c:/windows/fonts/arialuni.ttf"
    };
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        BaseFont bf;
        Font font;
        Image img = Image.getInstance(POSTER);
        img.scalePercent(50);
        img.setBorderWidth(18f);
        img.setBorder(Image.BOX);
        img.setBorderColor(GrayColor.GRAYWHITE);
        img.setAlignment(Element.ALIGN_LEFT | Image.TEXTWRAP);
        document.add(img);
        document.add(new Paragraph(
            "Movie title: Tears of the Black Tiger (Thailand)"));
        document.add(new Paragraph("directed by Wisit Sasanatieng"));
        for (int i = 0; i < 2; i++) {
            bf = BaseFont.createFont(FONTS[i], BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            document.add(new Paragraph("Font: " + bf.getPostscriptFontName()));
            font = new Font(bf, 20);
            document.add(new Paragraph(MOVIE, font));
        }
        // step 5
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new Diacritics1().createPdf(RESULT);
    }
}
Diacritics2.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
 
public class Diacritics2 {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/diacritics2.pdf";
    /** A movie title. */
    public static final String MOVIE
        = "Tomten \u00a8ar far till alla barnen";
    /** Fonts */
    public static final String[] FONTS = {
        "c:/windows/fonts/arial.ttf",
        "c:/windows/fonts/cour.ttf"
    };
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        document.add(new Paragraph("Movie title: In Bed With Santa (Sweden)"));
        document.add(new Paragraph("directed by Kjell Sundvall"));
        BaseFont bf = BaseFont.createFont(FONTS[0], BaseFont.CP1252, BaseFont.EMBEDDED);
        Font font = new Font(bf, 12);
        bf.setCharAdvance('\u00a8', -100);
        document.add(new Paragraph(MOVIE, font));
        bf = BaseFont.createFont(FONTS[1], BaseFont.CP1252, BaseFont.EMBEDDED);
        bf.setCharAdvance('\u00a8', 0);
        font = new Font(bf, 12);
        document.add(new Paragraph(MOVIE, font));
        // step 5
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new Diacritics2().createPdf(RESULT);
    }
}
Monospace.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class Monospace {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/monospace.pdf";
    /** A movie title. */
    public static final String MOVIE
        = "Aanrijding in Moscou";
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3: we open the document
        document.open();
        // step 4
        BaseFont bf1 = BaseFont.createFont("c:/windows/fonts/arial.ttf",
            BaseFont.CP1252, BaseFont.EMBEDDED);
        Font font1 = new Font(bf1, 12);
        document.add(new Paragraph("Movie title: Moscou, Belgium", font1));
        document.add(new Paragraph("directed by Christophe Van Rompaey", font1));
        document.add(new Paragraph(MOVIE, font1));
        BaseFont bf2 = BaseFont.createFont("c:/windows/fonts/cour.ttf",
            BaseFont.CP1252, BaseFont.EMBEDDED);
        Font font2 = new Font(bf2, 12);
        document.add(new Paragraph(MOVIE, font2));
        BaseFont bf3 = BaseFont.createFont("c:/windows/fonts/arialbd.ttf",
            BaseFont.CP1252, BaseFont.EMBEDDED);
        Font font3 = new Font(bf3, 12);
        int widths[] = bf3.getWidths();
        for (int k = 0; k < widths.length; ++k) {
            if (widths[k] != 0)
                widths[k] = 600;
        }
        bf3.setForceWidthsOutput(true);
        document.add(new Paragraph(MOVIE, font3));
        // step 5: we close the document
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new Monospace().createPdf(RESULT);
    }
}
ExtraCharSpace.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class ExtraCharSpace {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/character_spacing.pdf";
    /** A movie title. */
    public static final String MOVIE
        = "Aanrijding in Moscou";
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        BaseFont bf1 = BaseFont.createFont("c:/windows/fonts/arial.ttf",
            BaseFont.CP1252, BaseFont.EMBEDDED);
        Font font1 = new Font(bf1, 12);
        document.add(new Paragraph("Movie title: Moscou, Belgium", font1));
        document.add(new Paragraph("directed by Christophe Van Rompaey", font1));
        Chunk chunk = new Chunk(MOVIE, font1);
        chunk.setCharacterSpacing(10);
        document.add(new Paragraph(chunk));
        // step 5
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new ExtraCharSpace().createPdf(RESULT);
    }
}
Ligatures1.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class Ligatures1 {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/ligatures_1.pdf";
 
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3: we open the document
        document.open();
        // step 4
        BaseFont bf = BaseFont.createFont(
            "c:/windows/fonts/arial.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
        Font font = new Font(bf, 12);
        document.add(new Paragraph("Movie title: Love at First Hiccough (Denmark)", font));
        document.add(new Paragraph("directed by Tomas Villum Jensen", font));
        document.add(new Paragraph("K\u00e6rlighed ved f\u00f8rste hik", font));
        document.add(new Paragraph(ligaturize("Kaerlighed ved f/orste hik"), font));
        // step 5: we close the document
        document.close();
    }
 
    /**
     * Method that makes the ligatures for the combinations 'a' and 'e'
     * and for '/' and 'o'.
     * @param s a String that may have the combinations ae or /o
     * @return a String where the combinations are replaced by a unicode character
     */
    public String ligaturize(String s) {
        int pos;
        while ((pos = s.indexOf("ae")) > -1) {
            s = s.substring(0, pos) + '\u00e6' + s.substring(pos + 2);
        }
        while ((pos = s.indexOf("/o")) > -1) {
            s = s.substring(0, pos) + '\u00f8' + s.substring(pos + 2);
        }
        return s;
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new Ligatures1().createPdf(RESULT);
    }
}
Ligatures2.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfWriter;
 
public class Ligatures2 {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/ligatures_2.pdf";
    /** Correct movie title. */
    public static final String MOVIE
        = "\u0644\u0648\u0631\u0627\u0646\u0633 \u0627\u0644\u0639\u0631\u0628";
    /** Correct movie title. */
    public static final String MOVIE_WITH_SPACES
        = "\u0644 \u0648 \u0631 \u0627 \u0646 \u0633   \u0627 \u0644 \u0639 \u0631 \u0628";
    
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        BaseFont bf = BaseFont.createFont(
            "c:/windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bf, 20);
        document.add(new Paragraph("Movie title: Lawrence of Arabia (UK)"));
        document.add(new Paragraph("directed by David Lean"));
        document.add(new Paragraph("Wrong: " + MOVIE, font));
        ColumnText column = new ColumnText(writer.getDirectContent());
        column.setSimpleColumn(36, 730, 569, 36);
        column.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
        column.addElement(new Paragraph("Wrong: " + MOVIE_WITH_SPACES, font));
        column.addElement(new Paragraph(MOVIE, font));
        column.go();
        // step 5
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new Ligatures2().createPdf(RESULT);
    }
}
FontFactoryExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
public class FontFactoryExample {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/font_factory.pdf";
 
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4:
        Font font = FontFactory.getFont("Times-Roman");
        document.add(new Paragraph("Times-Roman", font));
        Font fontbold = FontFactory.getFont("Times-Roman", 12, Font.BOLD);
        document.add(new Paragraph("Times-Roman, Bold", fontbold));
        document.add(Chunk.NEWLINE);
        FontFactory.register("c:/windows/fonts/garabd.ttf", "my_bold_font");
        Font myBoldFont = FontFactory.getFont("my_bold_font");
        BaseFont bf = myBoldFont.getBaseFont();
        document.add(new Paragraph(bf.getPostscriptFontName(), myBoldFont));
        String[][] name = bf.getFullFontName();
        for (int i = 0; i < name.length; i++) {
            document.add(new Paragraph(name[i][3] + " (" + name[i][0]
                    + "; " + name[i][1] + "; " + name[i][2] + ")"));
        }
        Font myBoldFont2 = FontFactory.getFont("Garamond vet");
        document.add(new Paragraph("Garamond Vet", myBoldFont2));
        document.add(Chunk.NEWLINE);
        document.add(new Paragraph("Registered fonts:"));
        FontFactory.registerDirectory("resources/fonts");
        for (String f : FontFactory.getRegisteredFonts()) {
            document.add(new Paragraph(f, FontFactory.getFont(f, "", BaseFont.EMBEDDED)));
        }
        document.add(Chunk.NEWLINE);
        Font cmr10 = FontFactory.getFont("cmr10");
        cmr10.getBaseFont().setPostscriptFontName("Computer Modern Regular");
        Font computerModern = FontFactory.getFont("Computer Modern Regular", "", BaseFont.EMBEDDED);
        document.add(new Paragraph("Computer Modern", computerModern));
        document.add(Chunk.NEWLINE);
        FontFactory.registerDirectories();
        for (String f : FontFactory.getRegisteredFamilies()) {
            document.add(new Paragraph(f));
        }
        document.add(Chunk.NEWLINE);
        Font garamond = FontFactory.getFont("garamond", BaseFont.WINANSI, BaseFont.EMBEDDED);
        document.add(new Paragraph("Garamond", garamond));
        Font garamondItalic
            = FontFactory.getFont("Garamond", BaseFont.WINANSI, BaseFont.EMBEDDED, 12, Font.ITALIC);
        document.add(new Paragraph("Garamond-Italic", garamondItalic));
        // step 5
        document.close();
    }
 
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new FontFactoryExample().createPdf(RESULT);
    }
}
FontSelectionExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.FontSelector;
import com.itextpdf.text.pdf.PdfWriter;
 
/**
 * This example was written by Bruno Lowagie. It is part of the book 'iText in
 * Action' by Manning Publications. 
 * ISBN: 1932394796
 * http://www.1t3xt.com/docs/book.php 
 * http://www.manning.com/lowagie/
 */
 
public class FontSelectionExample {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/font_selection.pdf";
    /** Some text */
    public static final String TEXT
        = "These are the protagonists in 'Hero', a movie by Zhang Yimou:\n"
            + "\u7121\u540d (Nameless), \u6b98\u528d (Broken Sword), "
            + "\u98db\u96ea (Flying Snow), \u5982\u6708 (Moon), "
            + "\u79e6\u738b (the King), and \u9577\u7a7a (Sky).";
 
    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1
        Document document = new Document(PageSize.A4);
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3: we open the document
        document.open();
        // step 4:
        FontSelector selector = new FontSelector();
        Font f1 = FontFactory.getFont(FontFactory.TIMES_ROMAN, 12);
        f1.setColor(BaseColor.BLUE);
        Font f2 = FontFactory.getFont("MSung-Light",
                "UniCNS-UCS2-H", BaseFont.NOT_EMBEDDED);
        f2.setColor(BaseColor.RED);
        selector.addFont(f1);
        selector.addFont(f2);
        Phrase ph = selector.process(TEXT);
        document.add(new Paragraph(ph));
        // step 5: we close the document
        document.close();
    }
 
    /**
     * Main method.
     *
     * @param    args    no arguments needed
     * @throws DocumentException 
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new FontSelectionExample().createPdf(RESULT);
    }
}
Peace.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
 
package part3.chapter11;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
 
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
 
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.FontSelector;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
 
public class Peace extends DefaultHandler {
 
    /** The resulting PDF file. */
    public static final String RESULT
        = "results/part3/chapter11/peace.pdf";
    
    /** The XML file with the text. */
    public static final String RESOURCE
        = "resources/xml/peace.xml";
    
    /** Paths to and encodings of fonts we're going to use in this example */
    public static String[][] FONTS = {
        {"c:/windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H},
        {"resources/fonts/abserif4_5.ttf", BaseFont.IDENTITY_H},
        {"resources/fonts/damase.ttf", BaseFont.IDENTITY_H},
        {"resources/fonts/fsex2p00_public.ttf", BaseFont.IDENTITY_H}
    };
    
    /** Holds he fonts that can be used for the peace message. */
    public FontSelector fs;
 
    /** The columns that contains the message. */
    protected PdfPTable table;
 
    /** The language. */
    protected String language;
 
    /** The countries. */
    protected String countries;
 
    /** Indicates when the text should be written from right to left. */
    protected boolean rtl;
 
    /** The StringBuffer that holds the characters. */
    protected StringBuffer buf = new StringBuffer();
 
    /**
     * Creates the handler for the pace.xml file.
     */
    public Peace() {
        fs = new FontSelector();
        for (int i = 0; i < FONTS.length; i++) {
            fs.addFont(FontFactory.getFont(FONTS[i][0], FONTS[i][1], BaseFont.EMBEDDED));
        }
        table = new PdfPTable(3);
        table.getDefaultCell().setPadding(3);
        table.getDefaultCell().setUseAscender(true);
        table.getDefaultCell().setUseDescender(true);
    }
 
    /**
     * @see org.xml.sax.ContentHandler#startElement(java.lang.String,
     *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
     */
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if ("pace".equals(qName)) {
            buf = new StringBuffer();
            language = attributes.getValue("language");
            countries = attributes.getValue("countries");
            if ("RTL".equals(attributes.getValue("direction"))) {
                rtl = true;
            } else {
                rtl = false;
            }
        }
    }
 
    /**
     * @see org.xml.sax.ContentHandler#endElement(java.lang.String,
     *      java.lang.String, java.lang.String)
     */
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if ("pace".equals(qName)) {
            PdfPCell cell = new PdfPCell();
            cell.addElement(fs.process(buf.toString()));
            cell.setPadding(3);
            cell.setUseAscender(true);
            cell.setUseDescender(true);
            if (rtl) {
                cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
            }
            table.addCell(language);
            table.addCell(cell);
            table.addCell(countries);
        }
    }
 
    /**
     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
     */
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        buf.append(ch, start, length);
    }
 
    /**
     * Returns the table.
     * 
     * @return the PdfPTable (get it after using the parser)
     */
    public PdfPTable getTable() {
        return table;
    }
 
    /**
     * This example reads a text file written in UTF-8. Each line is a pipe
     * delimited array containing the name of a language, the word 'peace'
     * written in that language
     * 
     * @param args
     *            no arguments needed
     */
    public static void main(String[] args) {
        // step 1
        Document doc = new Document(PageSize.A4.rotate());
        try {
            // step 2
            PdfWriter.getInstance(doc, new FileOutputStream(RESULT));
            // step 3
            doc.open();
            // step 4
            Peace p = new Peace();
            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
            parser.parse(new InputSource(new FileInputStream(RESOURCE)), p);
            doc.add(p.getTable());
        } catch (Exception e) {
            e.printStackTrace();
        }
        // step 5
        doc.close();
    }
}
FontTypes.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.draw;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class FontTypes : IWriter {
// ===========================================================================
    /** Some text. */
    public const string TEXT
        = "quick brown fox jumps over the lazy dog\nQUICK BROWN FOX JUMPS OVER THE LAZY DOG";
    
/** Paths to and encodings of fonts we're going to use in this example;
 * you may have to comment out some of the fonts to run example 
*/
    public readonly string[][] FONTS = {
      new string[] {BaseFont.HELVETICA, BaseFont.WINANSI},
      new string[] {Path.Combine(Utility.ResourceFonts, "cmr10.afm"), BaseFont.WINANSI},
      new string[] {Path.Combine(Utility.ResourceFonts, "cmr10.pfm"), BaseFont.WINANSI},
      //new string[] {"c:/windows/fonts/ARBLI__.TTF", BaseFont.WINANSI},
      new string[] {"c:/windows/fonts/arial.ttf", BaseFont.WINANSI},
      new string[] {"c:/windows/fonts/arial.ttf", BaseFont.IDENTITY_H},
      new string[] {Path.Combine(Utility.ResourceFonts, "Puritan2.otf"), BaseFont.WINANSI},
      new string[] {"c:/windows/fonts/msgothic.ttc,0", BaseFont.IDENTITY_H},
      new string[] {"KozMinPro-Regular", "UniJIS-UCS2-H"}
    };
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf;
        Font font;
        for (int i = 0; i < FONTS.Length; i++) {
          bf = BaseFont.CreateFont(FONTS[i][0], FONTS[i][1], BaseFont.EMBEDDED);
          document.Add(new Paragraph(String.Format("Font file: {0} with encoding {1}", 
            FONTS[i][0], FONTS[i][1]
          )));
          document.Add(new Paragraph(
            String.Format("iText class: {0}", bf.GetType().ToString()
          )));
          font = new Font(bf, 12);
          document.Add(new Paragraph(TEXT, font));
          document.Add(new LineSeparator(0.5f, 100, null, 0, -5));
        }
      }
    }
// ===========================================================================
  }
}
TTCExample.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class TTCExample : IWriter {
// ===========================================================================
  /** The path to the font. */
    public const string FONT = "c:/windows/fonts/msgothic.ttc";
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf;
        Font font;
        String[] names = BaseFont.EnumerateTTCNames(FONT);
        for (int i = 0; i < names.Length; i++) {
          bf = BaseFont.CreateFont(
            String.Format("{0}, {1}", FONT, i),
            BaseFont.IDENTITY_H, BaseFont.EMBEDDED
          );
          font = new Font(bf, 12);
          document.Add(new Paragraph("font " + i + ": " + names[i], font));
          document.Add(new Paragraph("Rash\u00f4mon", font));
          document.Add(new Paragraph("Directed by Akira Kurosawa", font));
          document.Add(new Paragraph("\u7f85\u751f\u9580", font));
          document.Add(Chunk.NEWLINE);
        }
      }
    }
// ===========================================================================
  }
}
EncodingNames.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class EncodingNames : IWriter {
// ===========================================================================
/** The path to the font. 
 *  you may have to comment out some of the fonts to run example 
*/
    public readonly string[] FONT = {
      //"c:/windows/fonts/ARBLI__.TTF",
      Path.Combine(Utility.ResourceFonts, "Puritan2.otf"),
      "c:/windows/fonts/arialbd.ttf"
    };
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        for (int i = 0; i < FONT.Length; ++i) {
          BaseFont bf = BaseFont.CreateFont(FONT[i],  BaseFont.WINANSI, BaseFont.EMBEDDED);
          document.Add(new Paragraph("PostScript name: " + bf.PostscriptFontName));
          document.Add(new Paragraph("Available code pages:"));
          string[] encoding = bf.CodePagesSupported;
          for (int j = 0; j < encoding.Length; j++) {
            document.Add(new Paragraph("encoding[" + j + "] = " + encoding[j]));
          }
          document.Add(Chunk.NEWLINE);        
        }
      }
    }
// ===========================================================================
  }
}
EncodingExample.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class EncodingExample : IWriter {
// ===========================================================================
    /** The path to the font. */
    public const string FONT = "c:/windows/fonts/arialbd.ttf";
    /** Movie information. */
    public readonly string[][] MOVIES = {
      new string[] {
        "Cp1252",
        "A Very long Engagement (France)",
        "directed by Jean-Pierre Jeunet",
        "Un long dimanche de fian\u00e7ailles"
      },
      new string[] {
        "Cp1250",
        "No Man's Land (Bosnia-Herzegovina)",
        "Directed by Danis Tanovic",
        "Nikogar\u0161nja zemlja"
      },
      new string[] {
        "Cp1251",
        "You I Love (Russia)",
        "directed by Olga Stolpovskaja and Dmitry Troitsky",
        "\u042f \u043b\u044e\u0431\u043b\u044e \u0442\u0435\u0431\u044f"
      },
      new string[] {
        "Cp1253",
        "Brides (Greece)",
        "directed by Pantelis Voulgaris",
        "\u039d\u03cd\u03c6\u03b5\u03c2"
      }
    };
// ---------------------------------------------------------------------------
    public virtual void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf;
        for (int i = 0; i < 4; i++) {
          bf = BaseFont.CreateFont(FONT, MOVIES[i][0], BaseFont.EMBEDDED);
          document.Add(new Paragraph(
            "Font: " + bf.PostscriptFontName
            + " with encoding: " + bf.Encoding
          ));
          document.Add(new Paragraph(MOVIES[i][1]));
          document.Add(new Paragraph(MOVIES[i][2]));
          document.Add(new Paragraph(MOVIES[i][3], new Font(bf, 12)));
          document.Add(Chunk.NEWLINE);
        } 
      }
    }
// ===========================================================================
  }
}
UnicodeExample.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class UnicodeExample : EncodingExample {
// ===========================================================================
    public override void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf;
        for (int i = 0; i < 4; i++) {
          bf = BaseFont.CreateFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
          document.Add(new Paragraph(
            "Font: " + bf.PostscriptFontName
            + " with encoding: " + bf.Encoding
          ));
          document.Add(new Paragraph(MOVIES[i][1]));
          document.Add(new Paragraph(MOVIES[i][2]));
          document.Add(new Paragraph(MOVIES[i][3], new Font(bf, 12)));
          document.Add(Chunk.NEWLINE);
        } 
      }
    }
// ===========================================================================
  }
}
FontFileAndSizes.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
 
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class FontFileAndSizes : IWriter {
// ===========================================================================
    /** The names of the resulting PDF files. */
    public string[] RESULT {
      get { return new string[] {
          "font_not_embedded.pdf",
          "font_embedded.pdf",
          "font_embedded_less_glyphs.pdf",
          "font_compressed.pdf",
          "font_full.pdf"
        };
      }
    }
    /** The path to the font. */
    public const string FONT = "c:/windows/fonts/arial.ttf";
    /** Some text. */
    public const string TEXT
        = "quick brown fox jumps over the lazy dog";
    /** Some text. */
    public const string OOOO
        = "ooooo ooooo ooo ooooo oooo ooo oooo ooo";
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      using (ZipFile zip = new ZipFile()) {
        FontFileAndSizes ffs = new FontFileAndSizes();
        BaseFont bf;
        bf = BaseFont.CreateFont(FONT, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
        zip.AddEntry(RESULT[0], ffs.CreatePdf(bf, TEXT));
        bf = BaseFont.CreateFont(FONT, BaseFont.WINANSI, BaseFont.EMBEDDED);
        zip.AddEntry(RESULT[1], ffs.CreatePdf(bf, TEXT));
        zip.AddEntry(RESULT[2], ffs.CreatePdf(bf, OOOO));
        bf = BaseFont.CreateFont(FONT, BaseFont.WINANSI, BaseFont.EMBEDDED);
        bf.CompressionLevel = 9;
        zip.AddEntry(RESULT[3], ffs.CreatePdf(bf, TEXT));
        bf = BaseFont.CreateFont(FONT, BaseFont.WINANSI, BaseFont.EMBEDDED);
        bf.Subset = false;
        zip.AddEntry(RESULT[4], ffs.CreatePdf(bf, TEXT)); 
        zip.Save(stream);             
      }
    }
// ---------------------------------------------------------------------------    
    /**
     * Creates a PDF document.
     */
    public byte[] CreatePdf(BaseFont bf, String text) {
      using (MemoryStream ms = new MemoryStream()) {
        using (Document document = new Document()) {
          PdfWriter.GetInstance(document, ms);
          document.Open();
          document.Add(new Paragraph(text, new Font(bf, 12)));
        }
        return ms.ToArray();
      }
    }    
// ===========================================================================
  }
}
Type3Example.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class Type3Example : IWriter {
// ===========================================================================
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter writer = PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        Type3Font t3 = new Type3Font(writer, true);
        PdfContentByte d = t3.DefineGlyph('D', 600, 0, 0, 600, 700);
        d.SetColorStroke(new BaseColor(0xFF, 0x00, 0x00));
        d.SetColorFill(new GrayColor(0.7f));
        d.SetLineWidth(100);
        d.MoveTo(5, 5);
        d.LineTo(300, 695);
        d.LineTo(595, 5);
        d.ClosePathFillStroke();
        PdfContentByte s = t3.DefineGlyph('S', 600, 0, 0, 600, 700);
        s.SetColorStroke(new BaseColor(0x00, 0x80, 0x80));
        s.SetLineWidth(100);
        s.MoveTo(595,5);
        s.LineTo(5, 5);
        s.LineTo(300, 350);
        s.LineTo(5, 695);
        s.LineTo(595, 695);
        s.Stroke();
        Font f = new Font(t3, 12);
        Paragraph p = new Paragraph();
        p.Add("This is a String with a Type3 font that contains a fancy Delta (");
        p.Add(new Chunk("D", f));
        p.Add(") and a custom Sigma (");
        p.Add(new Chunk("S", f));
        p.Add(").");
        document.Add(p);        
      }
    }
// ===========================================================================
  }
}
CJKExample.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class CJKExample : IWriter {
// ===========================================================================
    /** Movies, their director and original title */
    public readonly string[][] MOVIES = {
      new string[] {
        "STSong-Light", "UniGB-UCS2-H",
        "Movie title: House of The Flying Daggers (China)",
        "directed by Zhang Yimou",
        "\u5341\u950a\u57cb\u4f0f"
      },
      new string[] {
        "KozMinPro-Regular", "UniJIS-UCS2-H",
        "Movie title: Nobody Knows (Japan)",
        "directed by Hirokazu Koreeda",
        "\u8ab0\u3082\u77e5\u3089\u306a\u3044"
      },
      new string[] {
        "HYGoThic-Medium", "UniKS-UCS2-H",
        "Movie title: '3-Iron' aka 'Bin-jip' (South-Korea)",
        "directed by Kim Ki-Duk",
        "\ube48\uc9d1"
      }
    };
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf;
        Font font;
        for (int i = 0; i < 3; i++) {
          bf = BaseFont.CreateFont(
            MOVIES[i][0], MOVIES[i][1], BaseFont.NOT_EMBEDDED
          );
          font = new Font(bf, 12);
          document.Add(new Paragraph(bf.PostscriptFontName, font));
          for (int j = 2; j < 5; j++) {
            document.Add(new Paragraph(MOVIES[i][j], font));
          }
          document.Add(Chunk.NEWLINE);
        }        
      }
    }
// ===========================================================================
  }
}
VerticalTextExample1.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class VerticalTextExample1 : IWriter {
// ===========================================================================
    /** A Japanese String. */
    public const string MOVIE = "\u4e03\u4eba\u306e\u4f8d";
    /** The facts. */
    public const string TEXT1
    = "You embarrass me. You're overestimating me. "
    + "Listen, I'm not a man with any special skill, "
    + "but I've had plenty of experience in battles; losing battles, all of them.";
    /** The conclusion. */
    public const string TEXT2
    = "In short, that's all I am. Drop such an idea for your own good.";
// ---------------------------------------------------------------------------
    public virtual void Write(Stream stream) {
      // step 1
      using (Document document = new Document(new Rectangle(420, 600))) {
        // step 2
        PdfWriter writer = PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf = BaseFont.CreateFont(
          "KozMinPro-Regular", "UniJIS-UCS2-V", BaseFont.NOT_EMBEDDED
        );
        Font font = new Font(bf, 20);
        VerticalText vt = new VerticalText(writer.DirectContent);
        vt.SetVerticalLayout(390, 570, 540, 12, 30);
        vt.AddText(new Chunk(MOVIE, font));
        vt.Go();
        vt.AddText(new Phrase(TEXT1, font));
        vt.Go();
        vt.Alignment = Element.ALIGN_RIGHT;
        vt.AddText(new Phrase(TEXT2, font));
        vt.Go();
      }
    }
// ===========================================================================
  }
}
VerticalTextExample2.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class VerticalTextExample2 : VerticalTextExample1 {
// ===========================================================================
    public override void Write(Stream stream) {
      // step 1
      using (Document document = new Document(new Rectangle(420, 600))) {
        // step 2
        PdfWriter writer = PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf = BaseFont.CreateFont(
          "KozMinPro-Regular", "Identity-V", BaseFont.NOT_EMBEDDED
        );
        Font font = new Font(bf, 20);
        VerticalText vt = new VerticalText(writer.DirectContent);
        vt.SetVerticalLayout(390, 570, 540, 12, 30);
        font = new Font(bf, 20);
        vt.AddText(new Phrase(ConvertCIDs(TEXT1), font));
        vt.Go();
        vt.Alignment = Element.ALIGN_RIGHT;
        vt.AddText(new Phrase(ConvertCIDs(TEXT2), font));
        vt.Go();
      }
    }
// ---------------------------------------------------------------------------
/**
 * Converts the CIDs of the horizontal characters of a String
 * into a String with vertical characters.
 * @param text The String with the horizontal characters
 * @return A String with vertical characters
 */
    public string ConvertCIDs(string text) {
      char[] cid = text.ToCharArray();
      for (int k = 0; k < cid.Length; ++k) {
        char c = cid[k];
        cid[k] = c == '\n' ? '\uff00' : (char) (c - ' ' + 8720);
      }
      return new String(cid);
    }
// ===========================================================================
  }
}
RightToLeftExample.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class RightToLeftExample : IWriter {
// ===========================================================================
    /** A movie title. */
    public const string MOVIE =
    "\u05d4\u05d0\u05e1\u05d5\u05e0\u05d5\u05ea \u05e9\u05dc \u05e0\u05d9\u05e0\u05d4";
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document(PageSize.A4)) {
        // step 2
        PdfWriter writer = PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf = BaseFont.CreateFont(
          "c:/windows/fonts/arial.ttf", BaseFont.IDENTITY_H, true
        );
        Font font = new Font(bf, 14);
        document.Add(new Paragraph("Movie title: Nina's Tragedies"));
        document.Add(new Paragraph("directed by Savi Gabizon"));
        ColumnText column = new ColumnText(writer.DirectContent);
        column.SetSimpleColumn(36, 770, 569, 36);
        column.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
        column.AddElement(new Paragraph(MOVIE, font));
        column.Go();
      }
    }
// ===========================================================================
  }
}
SayPeace.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class SayPeace : IWriter {
// ===========================================================================
    /** The resulting PDF file. */
    public const String RESULT = "say_peace.pdf";
    /** The XML file with the text. */
    public static string RESOURCE = Path.Combine(
      Utility.ResourceXml, "say_peace.xml"
    );
    /** The font that is used for the peace message. */
    public Font f;
    /** The document to which we are going to add our message. */
    protected Document document;
 
    /** The StringBuilder that holds the characters. */
    protected StringBuilder buf = new StringBuilder();
    
    /** The table that holds the text. */
    protected PdfPTable table;
    
    /** The current cell. */
    protected PdfPCell cell; 
// --------------------------------------------------------------------------- 
    public void Write(Stream stream) {
      using (ZipFile zip = new ZipFile()) {
        zip.AddFile(RESOURCE, "");
        
        using (MemoryStream ms = new MemoryStream()) {
          // step 1
          using (document = new Document()) {
            // step 2
            PdfWriter.GetInstance(document, ms);
            // step 3
            document.Open();
            // step 4
            f = new Font(BaseFont.CreateFont("c:/windows/fonts/arialuni.ttf",
              BaseFont.IDENTITY_H, BaseFont.EMBEDDED
            ));
            using (XmlReader xr = XmlReader.Create(RESOURCE)) {
              table = new PdfPTable(1);
              xr.MoveToContent();
              while (xr.Read()) {
                switch (xr.NodeType) {
                  case XmlNodeType.Element:
                    StartElement(xr);
                    break;
                  case XmlNodeType.Text:
                    buf.Append(xr.Value.Trim());
                    break;
                  case XmlNodeType.EndElement:
                    EndElement(xr.Name);
                    break;
                }
              }
            }
          }
          zip.AddEntry(RESULT, ms.ToArray()); 
        }
        zip.Save(stream);             
      }
    }       
// ---------------------------------------------------------------------------
    public void StartElement(XmlReader xr) {
      string name =  xr.Name;
      if ("message".Equals(name)) {
        buf = new StringBuilder();
        cell = new PdfPCell();
        cell.Border = PdfPCell.NO_BORDER;
        string direction = xr.GetAttribute("direction") != null
          ? xr.GetAttribute("direction")
          : ""
        ;
        if ("RTL".Equals(direction)) {
          cell.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
        }
      }
      else if ("pace".Equals(name)) {
        table = new PdfPTable(1);
        table.WidthPercentage = 100;
      }
    }
// ---------------------------------------------------------------------------
    public void EndElement(string name) {
      if ("big".Equals(name)) {
        Chunk bold = new Chunk(Strip(buf), f);
        bold.SetTextRenderMode(
          PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE, 0.5f,
          GrayColor.GRAYBLACK
        );
        Paragraph p = new Paragraph(bold);
        p.Alignment = Element.ALIGN_LEFT;
        cell.AddElement(p);
        buf = new StringBuilder();
      }
      else if ("message".Equals(name)) {
        Paragraph p = new Paragraph(Strip(buf), f);
        p.Alignment = Element.ALIGN_LEFT;
        cell.AddElement(p);
        table.AddCell(cell);
        buf = new StringBuilder();
      }
      else if ("pace".Equals(name)) {
        document.Add(table);
      }
    }
// ---------------------------------------------------------------------------    
  /**
   * Replaces all the newline characters by a space.
   * 
   * @param buf the original StringBuffer
   * @return a String without newlines
   */
    protected string Strip(StringBuilder buf) {
      buf.Replace("\n", " ");
      return buf.ToString();
    }    
// ===========================================================================
  }
}
Diacritics1.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class Diacritics1 : IWriter {
// ===========================================================================
    /** A movie title. */
    public const string MOVIE = 
    "\u0e1f\u0e49\u0e32\u0e17\u0e30\u0e25\u0e32\u0e22\u0e42\u0e08\u0e23";
    /** Movie poster */
    public static string POSTER = Path.Combine(
      Utility.ResourcePosters, "0269217.jpg"
    );
    /** Fonts */
    public readonly string[] FONTS = {
      "c:/windows/fonts/angsa.ttf",
      "c:/windows/fonts/arialuni.ttf"
    };
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf;
        Font font;
        Image img = Image.GetInstance(POSTER);
        img.ScalePercent(50);
        img.BorderWidth = 18f;
        img.Border = Image.BOX;
        img.BorderColor = GrayColor.GRAYWHITE;
        img.Alignment = Element.ALIGN_LEFT | Image.TEXTWRAP;
        document.Add(img);
        document.Add(new Paragraph(
          "Movie title: Tears of the Black Tiger (Thailand)"
        ));
        document.Add(new Paragraph("directed by Wisit Sasanatieng"));
        for (int i = 0; i < 2; i++) {
          bf = BaseFont.CreateFont(
            FONTS[i], BaseFont.IDENTITY_H, BaseFont.EMBEDDED
          );
          document.Add(new Paragraph("Font: " + bf.PostscriptFontName));
          font = new Font(bf, 20);
          document.Add(new Paragraph(MOVIE, font));
        }
      }
    }
// ===========================================================================
  }
}
Diacritics2.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class Diacritics2 : IWriter {
// ===========================================================================
    /** A movie title. */
    public const string MOVIE = "Tomten \u00a8ar far till alla barnen";
    /** Fonts */
    public readonly string[] FONTS = {
      "c:/windows/fonts/arial.ttf",
      "c:/windows/fonts/cour.ttf"
    };
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        document.Add(new Paragraph("Movie title: In Bed With Santa (Sweden)"));
        document.Add(new Paragraph("directed by Kjell Sundvall"));
        BaseFont bf = BaseFont.CreateFont(
          FONTS[0], BaseFont.CP1252, BaseFont.EMBEDDED
        );
        Font font = new Font(bf, 12);
        bf.SetCharAdvance('\u00a8', -100);
        document.Add(new Paragraph(MOVIE, font));
        bf = BaseFont.CreateFont(FONTS[1], BaseFont.CP1252, BaseFont.EMBEDDED);
        bf.SetCharAdvance('\u00a8', 0);
        font = new Font(bf, 12);
        document.Add(new Paragraph(MOVIE, font));
      }
    }
// ===========================================================================
  }
}
Monospace.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class Monospace : IWriter {
// ===========================================================================
    /** A movie title. */
    public const string MOVIE = "Aanrijding in Moscou";
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf1 = BaseFont.CreateFont(
          "c:/windows/fonts/arial.ttf",
          BaseFont.CP1252, BaseFont.EMBEDDED
        );
        Font font1 = new Font(bf1, 12);
        document.Add(new Paragraph("Movie title: Moscou, Belgium", font1));
        document.Add(new Paragraph(
          "directed by Christophe Van Rompaey", font1
        ));
        document.Add(new Paragraph(MOVIE, font1));
        BaseFont bf2 = BaseFont.CreateFont(
          "c:/windows/fonts/cour.ttf",
          BaseFont.CP1252, BaseFont.EMBEDDED
        );
        Font font2 = new Font(bf2, 12);
        document.Add(new Paragraph(MOVIE, font2));
        BaseFont bf3 = BaseFont.CreateFont(
          "c:/windows/fonts/arialbd.ttf",
          BaseFont.CP1252, BaseFont.EMBEDDED
        );
        Font font3 = new Font(bf3, 12);
        int[] widths = bf3.Widths;
        for (int k = 0; k < widths.Length; ++k) {
          if (widths[k] != 0) widths[k] = 600;
        }
        bf3.ForceWidthsOutput = true;
        document.Add(new Paragraph(MOVIE, font3));
      }
    }
// ===========================================================================
  }
}
ExtraCharSpace.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class ExtraCharSpace : IWriter {
// ===========================================================================
    /** A movie title. */
    public const string MOVIE = "Aanrijding in Moscou";      
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf1 = BaseFont.CreateFont(
          "c:/windows/fonts/arial.ttf",
          BaseFont.CP1252, BaseFont.EMBEDDED
        );
        Font font1 = new Font(bf1, 12);
        document.Add(new Paragraph("Movie title: Moscou, Belgium", font1));
        document.Add(new Paragraph(
          "directed by Christophe Van Rompaey", font1
        ));
        Chunk chunk = new Chunk(MOVIE, font1);
        chunk.SetCharacterSpacing(10);
        document.Add(new Paragraph(chunk));
      }
    }
// ===========================================================================
  }
}
Ligatures1.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class Ligatures1 : IWriter {
// ===========================================================================
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf = BaseFont.CreateFont(
          "c:/windows/fonts/arial.ttf", BaseFont.CP1252, BaseFont.EMBEDDED
        );
        Font font = new Font(bf, 12);
        document.Add(new Paragraph(
          "Movie title: Love at First Hiccough (Denmark)", font
        ));
        document.Add(new Paragraph("directed by Tomas Villum Jensen", font));
        document.Add(new Paragraph("K\u00e6rlighed ved f\u00f8rste hik", font));
        document.Add(new Paragraph(
          Ligaturize("Kaerlighed ved f/orste hik"), font
        ));
      }
    }
// ---------------------------------------------------------------------------
  /**
   * Method that makes the ligatures for the combinations 'a' and 'e'
   * and for '/' and 'o'.
   * @param s a String that may have the combinations ae or /o
   * @return a String where the combinations are replaced by a unicode character
   */
    public String Ligaturize(string s) {
      int pos;
      //while ((pos = s.IndexOf("ae")) > -1) {
      //  s = s.Substring(0, pos) + '\u00e6' + s.Substring(pos + 2);
      //}
      while ((pos = s.IndexOf("/o")) > -1) {
        s = s.Substring(0, pos) + "\u00f8" + s.Substring(pos + 2);
      }
      return s;
    }    
// ===========================================================================
  }
}
Ligatures2.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class Ligatures2 : IWriter {
// ===========================================================================
    /** Correct movie title. */
    public const string MOVIE = 
    "\u0644\u0648\u0631\u0627\u0646\u0633 \u0627\u0644\u0639\u0631\u0628";
    /** Correct movie title. */
    public const string MOVIE_WITH_SPACES = 
    "\u0644 \u0648 \u0631 \u0627 \u0646 \u0633   \u0627 \u0644 \u0639 \u0631 \u0628";
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter writer = PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        BaseFont bf = BaseFont.CreateFont(
          "c:/windows/fonts/arialuni.ttf", 
          BaseFont.IDENTITY_H, BaseFont.EMBEDDED
        );
        Font font = new Font(bf, 20);
        document.Add(new Paragraph("Movie title: Lawrence of Arabia (UK)"));
        document.Add(new Paragraph("directed by David Lean"));
        document.Add(new Paragraph("Wrong: " + MOVIE, font));
        ColumnText column = new ColumnText(writer.DirectContent);
        column.SetSimpleColumn(36, 730, 569, 36);
        column.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
        column.AddElement(new Paragraph("Wrong: " + MOVIE_WITH_SPACES, font));
        column.AddElement(new Paragraph(MOVIE, font));
        column.Go();
      }
    }
// ===========================================================================
  }
}
FontFactoryExample.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class FontFactoryExample : IWriter {
// ===========================================================================
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document()) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        Font font = FontFactory.GetFont("Times-Roman");
        document.Add(new Paragraph("Times-Roman", font));
        Font fontbold = FontFactory.GetFont("Times-Roman", 12, Font.BOLD);
        document.Add(new Paragraph("Times-Roman, Bold", fontbold));
        document.Add(Chunk.NEWLINE);
        FontFactory.Register("c:/windows/fonts/garabd.ttf", "my_bold_font");
        Font myBoldFont = FontFactory.GetFont("my_bold_font");
        BaseFont bf = myBoldFont.BaseFont;
        document.Add(new Paragraph(bf.PostscriptFontName, myBoldFont));
        String[][] name = bf.FullFontName;
        for (int i = 0; i < name.Length; i++) {
          document.Add(new Paragraph(
            name[i][3] + " (" + name[i][0]
            + "; " + name[i][1] + "; " + name[i][2] + ")"
          ));
        }
        Font myBoldFont2 = FontFactory.GetFont("Garamond vet");
        document.Add(new Paragraph("Garamond Vet", myBoldFont2));
        document.Add(Chunk.NEWLINE);
        document.Add(new Paragraph("Registered fonts:"));
        FontFactory.RegisterDirectory(Utility.ResourceFonts); 
/*               
        string fontDirectory = Utility.ResourceFonts;
        FontFactory.RegisterDirectory(
          fontDirectory.Substring(0, fontDirectory.Length - 3
        ));
 */
        foreach (String f in FontFactory.RegisteredFonts) {
          document.Add(new Paragraph(
            f, FontFactory.GetFont(f, "", BaseFont.EMBEDDED
          )));
        }
        document.Add(Chunk.NEWLINE);
        Font cmr10 = FontFactory.GetFont("cmr10");
        cmr10.BaseFont.PostscriptFontName = "Computer Modern Regular";
        Font computerModern = FontFactory.GetFont(
          "Computer Modern Regular", "", BaseFont.EMBEDDED
        );
        document.Add(new Paragraph("Computer Modern", computerModern));
        document.Add(Chunk.NEWLINE);
        FontFactory.RegisterDirectories();
        foreach (String f in FontFactory.RegisteredFamilies) {
          document.Add(new Paragraph(f));
        }
        document.Add(Chunk.NEWLINE);
        Font garamond = FontFactory.GetFont(
          "garamond", BaseFont.WINANSI, BaseFont.EMBEDDED
        );
        document.Add(new Paragraph("Garamond", garamond));
        Font garamondItalic = FontFactory.GetFont(
          "Garamond", BaseFont.WINANSI, BaseFont.EMBEDDED, 12, Font.ITALIC
        );
        document.Add(new Paragraph("Garamond-Italic", garamondItalic));
      }
    }
// ===========================================================================
  }
}
FontSelectionExample.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class FontSelectionExample : IWriter {
// ===========================================================================
    /** Some text */
    public readonly string TEXT =
    "These are the protagonists in 'Hero', a movie by Zhang Yimou:\n"
    + "\u7121\u540d (Nameless), \u6b98\u528d (Broken Sword), "
    + "\u98db\u96ea (Flying Snow), \u5982\u6708 (Moon), "
    + "\u79e6\u738b (the King), and \u9577\u7a7a (Sky).";
// ---------------------------------------------------------------------------
    public void Write(Stream stream) {
      // step 1
      using (Document document = new Document(PageSize.A4)) {
        // step 2
        PdfWriter.GetInstance(document, stream);
        // step 3
        document.Open();
        // step 4
        FontSelector selector = new FontSelector();
        selector.AddFont(FontFactory.GetFont(FontFactory.TIMES_ROMAN, 12));
        selector.AddFont(FontFactory.GetFont(
          "MSung-Light", "UniCNS-UCS2-H", BaseFont.NOT_EMBEDDED
        ));
        Phrase ph = selector.Process(TEXT);
        document.Add(new Paragraph(ph));
      }
    }
// ===========================================================================
  }
}
Peace.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */
using System;
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace kuujinbo.iTextInAction2Ed.Chapter11 {
  public class Peace : IWriter {
// ===========================================================================
    /** The resulting PDF file. */
    public const String RESULT = "peace.pdf";
    /** The XML file with the text. */
    public static string RESOURCE = Path.Combine(
      Utility.ResourceXml, "peace.xml"
    );
    public readonly string FONT_PATH = Utility.ResourceFonts;
    /** Paths to and encodings of fonts we're going to use in this example */
    public string[][] FONTS { 
      get { return new string[][] {
          new string[] {
            "c:/windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H
          },
          new string[] {
            string.Format(FONT_PATH, "abserif4_5.ttf"), BaseFont.IDENTITY_H
          },
          new string[] {
            string.Format(FONT_PATH, "damase.ttf"), BaseFont.IDENTITY_H
          },
          new string[] {
            string.Format(FONT_PATH, "fsex2p00_public.ttf"), BaseFont.IDENTITY_H
          }
        };
      }
    }
    /** Holds he fonts that can be used for the peace message. */
    public FontSelector fs;
 
    /** The columns that contains the message. */
    protected PdfPTable table;
 
    /** The language. */
    protected String language;
 
    /** The countries. */
    protected String countries;
 
    /** Indicates when the text should be written from right to left. */
    protected bool rtl; 
    
    /** The StringBuilder that holds the characters. */
    protected StringBuilder buf = new StringBuilder();
// --------------------------------------------------------------------------- 
    public void Write(Stream stream) {
      using (ZipFile zip = new ZipFile()) {
        zip.AddFile(RESOURCE, "");       
        using (MemoryStream ms = new MemoryStream()) {
          using (Document document = new Document(PageSize.A4.Rotate())) {
            // step 2
            PdfWriter.GetInstance(document, ms);
            // step 3
            document.Open();
            // step 4
            fs = new FontSelector();
            for (int i = 0; i < FONTS.Length; i++) {
              fs.AddFont(FontFactory.GetFont(
                FONTS[i][0], FONTS[i][1], BaseFont.EMBEDDED
              ));
            }
            table = new PdfPTable(3);
            table.DefaultCell.Padding = 3;
            table.DefaultCell.UseAscender = true;
            table.DefaultCell.UseDescender = true;
            
            using (XmlReader xr = XmlReader.Create(RESOURCE)) {
              xr.MoveToContent();
              while (xr.Read()) {
                switch (xr.NodeType) {
                  case XmlNodeType.Element:
                    StartElement(xr);
                    break;
                  case XmlNodeType.Text:
                    buf.Append(xr.Value.Trim());
                    break;
                  case XmlNodeType.EndElement:
                    EndElement(xr.Name);
                    break;
                }
              }
            }        
            document.Add(table); 
          }
          zip.AddEntry(RESULT, ms.ToArray());
        }
        zip.Save(stream);             
      }
    }
// ---------------------------------------------------------------------------
    public void StartElement(XmlReader xr) {
      string name =  xr.Name;
      if ("pace".Equals(name)) {
        buf = new StringBuilder();
        language = xr.GetAttribute("language");
        countries = xr.GetAttribute("countries");
        rtl = "RTL".Equals(xr.GetAttribute("direction")) ? true : false;
      }
    }
// ---------------------------------------------------------------------------
    public void EndElement(string name) {
      if ("pace".Equals(name)) {
        PdfPCell cell = new PdfPCell();
        cell.AddElement(fs.Process(buf.ToString()));
        cell.Padding = 3;
        cell.UseAscender = true;
        cell.UseDescender = true;
        if (rtl) {
          cell.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
        }
        table.AddCell(language);
        table.AddCell(cell);
        table.AddCell(countries);
      }    
    }    
// ===========================================================================
  }
}


Contact

Still have questions? 

We're happy to answer your questions. Reach out to us and we'll get back to you shortly.

Contact us
Stay updated

Join 11,000+ subscribers and become an iText PDF expert by staying up to date with our new products, updates, tips, technical solutions and happenings.

Subscribe Now