中文单词不使用itextrenderer出现在pdf中



我正在使用itextrender将html转换为pdf,它适用于西班牙语,法语单词,但是当我尝试中文单词时,它并不是pdf

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

我尝试添加字体,但仍无法正常工作

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

为了管理中文单词,您需要以下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>

编码的汉字的重要部分是用正确的亚洲字体解析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);
            }
        }
    }

有关更多详细信息,您可以访问我的github,我为此问题创建了一个迷你项目:

  • 源代码:https://github.com/iyunbo/stackoverflow/blob/master/src/src/main/java/java/iyunbo/iyunbo/encoding/html2pdf.java
  • 单元测试:https://github.com/iyunbo/stackoverflow/blob/master/src/src/test/java/java/iyunbo/iyunbo/encoding/html2pdftest.java

要查看PDF中的任何其他语言,首先您需要在系统中安装该字体包。Itext可以在生成PDF文件时轻松地将任何语言写入您的PDF文件,但是您的系统应该具有特定的字体包来显示这些字体。

最新更新