java - 使用java和itext生成带有Unicode字符的PDF文档

标签 java pdf unicode itext

我尝试从打印一些额外的 Unicode 符号的 itext 示例中改编标准代码。虽然使用的字体支持这些字符,但我没有得到任何结果。 (最后一个字符“\u2609”没有打印成pdf)

提前致谢!

    /*
     * These examples are written by Bruno Lowagie in the context of an article about fonts.
     */
    package sandbox.fonts.tutorial;

    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;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import sandbox.WrapToTest;

    /**
     * @author Bruno Lowagie (iText Software)
     */
    @WrapToTest
    public class F07_Unicode {
        public static final String DEST = "results/fonts/tutorial/f07_unicode.pdf";
        public static final String FONT = "resources/fonts/FreeSans.ttf";

        public static void main(String[] args) throws IOException, DocumentException {
            File file = new File(DEST);
            file.getParentFile().mkdirs();
            new F07_Unicode().createPdf(DEST);
        }

        public void createPdf(String dest) throws IOException, DocumentException {
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream(dest));
            document.open();
            Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            document.add(new Paragraph("Vous \u00eates d'o\u00f9?", font));
            document.add(new Paragraph("\u00c0 tout \u00e0 l'heure. \u00c0 bient\u00f4t.", font));
            document.add(new Paragraph("Je me pr\u00e9sente.", font));
            document.add(new Paragraph("C'est un \u00e9tudiant.", font));
            document.add(new Paragraph("\u00c7a va?", font));
            document.add(new Paragraph("Il est ing\u00e9nieur. Elle est m\u00e9decin.", font));
            document.add(new Paragraph("C'est une fen\u00eatre.", font));
            document.add(new Paragraph("R\u00e9p\u00e9tez, s'il vous pla\u00eet.", font));
            document.add(new Paragraph("Odkud jste?", font));
            document.add(new Paragraph("Uvid\u00edme se za chvilku. M\u011bj se.", font));
            document.add(new Paragraph("Dovolte, abych se p\u0159edstavil.", font));
            document.add(new Paragraph("To je studentka.", font));
        document.add(new Paragraph("V\u0161echno v po\u0159\u00e1dku?", font));
            document.add(new Paragraph("On je in\u017een\u00fdr. Ona je l\u00e9ka\u0159.", font));
            document.add(new Paragraph("Toto je okno.", font));
            document.add(new Paragraph("Zopakujte to pros\u00edm.", font));
            document.add(new Paragraph("\u041e\u0442\u043a\u0443\u0434\u0430 \u0442\u044b?", font));
            document.add(new Paragraph("\u0423\u0432\u0438\u0434\u0438\u043c\u0441\u044f \u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e. \u0423\u0432\u0438\u0434\u0438\u043c\u0441\u044f.", font));
            document.add(new Paragraph("\u041f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043c\u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0441\u044f.", font));
            document.add(new Paragraph("\u042d\u0442\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442.", font));
            document.add(new Paragraph("\u0425\u043e\u0440\u043e\u0448\u043e?", font));
            document.add(new Paragraph("\u041e\u043d \u0438\u043d\u0436\u0435\u043d\u0435\u0440. \u041e\u043d\u0430 \u0434\u043e\u043a\u0442\u043e\u0440.", font));
            document.add(new Paragraph("\u042d\u0442\u043e \u043e\u043a\u043d\u043e.", font));
            document.add(new Paragraph("\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.", font));
            document.add(new Paragraph("and \u2609 what?",font));
            document.close();
        }
    }

最佳答案

您想使用 \u2609 字符,称为 SUN特点。您使用的字体中不存在此字符。您正在使用 FreeSans.ttf 并且该字体不包含 SUN 符号。

你声称​​虽然使用的字体支持这些字符,但你没有提供任何证据证明这一指控。 Unicode 中有 1,114,112 个代码点可用,但复合字体只能包含 65,535 个字符。当您只有 65,535 个可用字符时,实际上不可能在一个字体中存储 1,114,112 个字形。

您需要提供一种知道如何呈现 \u2609 的字体,而 FreeSans.ttf 不是这样的字体。请看SunCharacter示例:

public static final String FONT = "resources/fonts/Cardo-Regular.ttf";
public static final String TEXT = "The Cardo family of fonts supports this character: \u2609";

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    BaseFont bf = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    Font f = new Font(bf, 12);
    Paragraph p = new Paragraph(TEXT, f);
    document.add(p);
    document.close();
}

在这种情况下,我们使用知道如何绘制 ☉ 字符的字体,当您打开 sun_character.pdf 时可以检查到:

enter image description here

当您将 Cardo-Regular.ttf 替换为 FreeSans.ttf 时,此字符不会出现这一事实证明 FreeSans.ttf 不包含 ☉ 字符。

关于java - 使用java和itext生成带有Unicode字符的PDF文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37094480/

相关文章:

java - 使用 Java 访问数据集的最快方法是什么?

java - Spring Security Role Hierarchy 无法使用 Java Config

pdf - ImageMagick 或 GhostScript : convert a multi-page TIFF to a multi-page PDF

java - java中的Docx到PDF转换

unicode - Emacs:打印 UTF-8 缓冲区

text - UTF-8 字符串总是比 UTF-16 短吗?

java - 如何在java中使用informix unload语句?

java - 根据属性而不是值对 HashMap 对象进行排序

php - Tcpdf - 启用滚动

Java Unicode 翻译