使用java和itext生成带有Unicode字符的PDF文档 [英] Generate PDF document with Unicode characters using java and itext

查看:119
本文介绍了使用java和itext生成带有Unicode字符的PDF文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



提前致谢!

  / * 
*这些示例由Bruno Lowagie在有关字体的文章中编写。
* /
包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软件)
* /
@WrapToTest
公共类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)抛出IOException,DocumentException {
文件文件=新文件(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 \\\êtes d'o\ u00f9?,font));
document.add(new Paragraph(\ u00c0 tout \\\à l'heure。\ u00c0 bient\\\ôt。,font));
document.add(new Paragraph(Je me pr\\\ésente。,font));
document.add(new Paragraph(C'est un \\\étudiant。,font));
document.add(new Paragraph(\ u00c7a va?,font));
document.add(new Paragraph(Il est ing\\\énieur.Elle est m\\\édecin。,font));
document.add(new Paragraph(C'est une fen\\\être。,font));
document.add(new Paragraph(R\\\ép\ u00e9tez,s'il vous pla\\\ît。,font));
document.add(new Paragraph(Odkud jste?,font));
document.add(new Paragraph(Uvid\\\íme se za chvilku.M\ u011bj se。,font));
document.add(new Paragraph(Dovolte,abych se p\\\ředstavil。,font));
document.add(new Paragraph(To je studentka。,font));
document.add(new Paragraph(V\\\šechno v po\ u0159 \ u00e1dku?,font));
document.add(new Paragraph(On je in\\\žen\ u00fdr.Ona je l\ u00e9ka\ u0159。,font));
document.add(new Paragraph(Toto je okno。,font));
document.add(new Paragraph(Zopakujte to pros\\\ím。,font));
document.add(new Paragraph(\ u041e \ u0442 \ u043a \ u0443 \ u0434 \ u0430 \ u0442 \ u044b?,font));
document.add(新段(\\\У\\\в\\\и\\\д\\\и\\\м\\\с\\\я \\\в \\\н\\\е\\\м\ u043d\\\о\\\г\\\о。\ u0423 \ u0432 \ u0438 \ u0434 \ u0438 \ u043c \ u0441 \ u044f。,font));
document.add(新段(\\\П\\\о\\\з\\\в\\\о\\\л\\\ь\\\т\\\е \\\м\\\н\\\е \ u043f\\\р\\\е\\\д\\\с\\\т\\\а\\\в\\\и\\\т\\\ь\\\с\\\я。,font));
document.add(新段落( \\\Э\\\т\\\о \\\с\\\т\\\у\\\д\\\е\\\н\\\т。,字体));
document.add(new Paragraph(\\\Х\\\о\\\р\\\о\\\ш\\\о?,font));
document.add(新段(\\\О\\\н \\\и\\\н\\\ж\\\е\\\н\\\е\\\р。\\\О\\\н\\\а \\ \\ u0434\\\о \ u043a \ u0442 \ u043e \ u0440。,font));
document.add(new Paragraph(\ u042d \ u0442 \ u043e \\\о \ u043a \ u043d \ u043e。,font));
document.add(新段(\\\П\\\о\\\в\\\т\\\о\\\р\\\и\\\т\\\е,\\\п\\\о\\\ж\\ \\ u0430\\\л\\\у\\\й\\\с\\\т\\\а。,font));
document.add(新段落(和\ u2609是什么?,字体));
document.close();
}
}


解决方案

你想要使用 \\\☉ 字符,称为



事实上这个使用 FreeSans.ttf 替换 Cardo-Regular.ttf 时,字符不会出现 FreeSans.ttf 不包含☉字符。


I try to adapt a standard code from the itext examples printing some additional Unicode symbols. Although the used font supports these characters, I do not get any result. (the last character "\u2609" is not printed to pdf)

Thanks in advance!

    /*
     * 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();
        }
    }

解决方案

You want to use the \u2609 character, known as the SUN character. This character is not present in the font you are using. You are using FreeSans.ttf and that font doesn't contain the SUN symbol.

You claim Although the used font supports these characters, but you don't provide any proof for this allegation. There are 1,114,112 code points available in Unicode, but a composite font can only contain 65,535 characters. It is physically impossible to store 1,114,112 glyphs in a font when you only have 65,535 characters available.

You need to provide a font that knows how to render the \u2609 and FreeSans.ttf isn't such a font. Please take a look at the SunCharacter example:

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();
}

In this case, we use a font that knows how to draw the ☉ character, as can be checked when you open sun_character.pdf:

The fact that this character doesn't appear when you replace Cardo-Regular.ttf with FreeSans.ttf is proof that FreeSans.ttf doesn't contain the ☉ character.

这篇关于使用java和itext生成带有Unicode字符的PDF文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆