【问题标题】:Generate PDF document with Unicode characters using java and itext使用 java 和 itext 生成带有 Unicode 字符的 PDF 文档
【发布时间】:2016-09-02 19:57:36
【问题描述】:

我尝试从 itext 示例中调整标准代码,打印一些额外的 Unicode 符号。虽然使用的字体支持这些字符,但我没有得到任何结果。 (最后一个字符“\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();
        }
    }

【问题讨论】:

  • 你为什么这么说虽然使用的字体支持这些字符。 Unicode 中的代码点比实际存储在字体中的要多,所以我高度怀疑你的说法。 (顺便说一句:我是您的代码 sn-p 标题中提到的人。)

标签: java pdf unicode itext


【解决方案1】:

您想使用\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 时可以检查:

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

【讨论】:

  • 谢谢。显然 CharSelect(KDE 的)没有向我显示 ttf 文件的正确字体符号内容。但是使用 KFontView 我看到了。
  • @Banish 如果您要求某些工具显示字形,它们会使用替代字体。也许这就是您在寻找该特定角色的工具中发生的情况。
猜你喜欢
  • 2013-06-05
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
相关资源
最近更新 更多