首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用java和itext生成带有Unicode字符的PDF文档

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

Stack Overflow用户
提问于 2016-05-07 22:48:10
回答 1查看 6K关注 0票数 3

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

提前感谢!

代码语言:javascript
运行
复制
    /*
     * 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();
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-08 08:06:40

您希望使用\u2609字符,称为太阳字符。此字符不在您使用的字体中。您使用的是FreeSans.ttf,该字体不包含SUN符号。

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

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

代码语言:javascript
运行
复制
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();
}

在这种情况下,我们使用一种知道如何绘制character.pdf字符的字体,在打开☉时可以进行检查。

当您用Cardo-Regular.ttf替换FreeSans.ttf时,这个字符不会出现,这证明了FreeSans.ttf不包含☉字符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37094480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档