简体   繁体   English

使用 ITextRenderer 的 pdf 中没有中文单词

[英]chinese words not coming in pdf, using ITextRenderer

I am using ItextRenderer to convert html to pdf, its working for spanish, french words but when I am trying for chinese words its not coming in PDF我正在使用 ItextRenderer 将 html 转换为 pdf,它适用于西班牙语、法语单词,但是当我尝试使用中文单词时,它没有出现在 PDF 中

  ITextRenderer renderer = new ITextRenderer();
  renderer.setDocumentFromString(html);
  renderer.layout();

I tried adding font but still not working我尝试添加字体但仍然无法正常工作

   renderer.getFontResolver().addFont("C:\\Windows\\Fonts\\mingliu.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

   renderer.getFontResolver().addFont("C:\\Windows\\Fonts\\simsun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

   renderer.getFontResolver().addFont("C:\\Windows\\Fonts\\batang.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

   renderer.setDocumentFromString(html);
   renderer.layout();
   OutputStream os = 
   Files.newOutputStream(Paths.get("chinese.pdf"));
   renderer.createPDF(os);

In order to manage Chinese words, you will need following 3 libraries:为了管理中文单词,您将需要以下 3 个库:

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.11</version>
        </dependency>

the essential part of the Chinese characters encoding is parsing the html string with correct Asian font, see following as the core code:汉字编码的本质部分是用正确的亚洲字体解析html字符串,核心代码如下:

    void createPDF(final String content, final String filename) {
        final Document document = new Document(PageSize.LETTER);
        try {
            PdfWriter writer = PdfWriter.getInstance(document, Files.newOutputStream(Paths.get("target", filename)));
            document.open();
            InputStream input = new ByteArrayInputStream(content.getBytes());
            XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
            worker.parseXHtml(writer, document, input, Charset.forName("UTF-8"), new AsianFontProvider());
        } catch (DocumentException | IOException e) {
            log.error("Failed to generate PDF for {}", filename, e);
        } finally {
            document.close();
        }
    }
    class AsianFontProvider extends XMLWorkerFontProvider {
        @Override
        public Font getFont(final String fontName, final String encoding, final boolean embedded, final float size, final int style, final BaseColor color) {
            try {
                BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                Font font = new Font(bf, size, style, color);
                font.setColor(color);
                return font;
            } catch (DocumentException | IOException e) {
                log.error("Failed to create font for {} with encoding {}", fontName, encoding, e);
                throw new IllegalArgumentException("incorrect font creation, please check the font parameters", e);
            }
        }
    }

for more details, you can visit my github, I created a mini project for this problem:更多细节,你可以访问我的github,我为这个问题创建了一个小项目

To view any other languages in PDF,first you need to install that font pack in your system.要查看 PDF 中的任何其他语言,首先您需要在系统中安装该字体包。 Itext can easily write any language to your PDF file while generating it, but your system should have that specific font pack to show those fonts. Itext 可以在生成 PDF 文件时轻松地将任何语言写入您的 PDF 文件,但您的系统应该具有特定的字体包来显示这些字体。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM