HTML 到带有西里尔字符的 PDF

HTML to PDF with cyrillic characters

我正在制作 Spring 启动应用程序。我想从 HTML 代码生成 PDF:

        String htmlString = "<!DOCTYPE html>\n" +
                "<html lang=\"ru\">\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\"/>\n" +
                "    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>\n" +
                "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n" +
                "</head>\n" +
                "<body>\n" +
                "    <h3>ПРЕДСТАВЛЕНИЕ</h3>\n" +
                "</body>\n" +
                "</html>";

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        String path = FileSystemView.getFileSystemView().getDefaultDirectory().getPath() + "/A.pdf";
        OutputStream outputStream = new FileOutputStream(path);

        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(htmlString);
        renderer.layout();
        renderer.createPDF(outputStream);

        byteArrayOutputStream.writeTo(outputStream);

如您所见,有一个带有西里尔符号的 h3 标签。问题是在转换和保存后,符号不会以 PDF 格式显示(它只是空的,因为 html 代码中没有其他可见的内容)。顺便说一句,其他符号正在正确显示。

对于 html-to-pdf 转换,我使用:

<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf-itext5</artifactId>
    <version>9.0.1</version>
</dependency>

我想是字符集、字体等有问题。我该如何解决?

这对我有用!

public static void main(String[] args) throws DocumentException, IOException, SAXException, ParserConfigurationException {
        String htmlString = "<!DOCTYPE html>\n" + "<html lang=\"ru\">\n" + "<head>\n"
                + "    <meta charset=\"UTF-8\"/>\n" + "    <meta http-equiv=\"Content-Type\" content=\"text/html\"/>\n"
                + "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n" 
                + "    <style type='text/css'> "
                + "        * { font-family: Verdana; }/n"
                + "    </style>/n"
                + "</head>\n"
                + "<body>\n" + "    <h3>ПРЕДСТАВЛЕНИЕ</h3>\n" + "</body>\n" + "</html>";


    String path = FileSystemView.getFileSystemView().getDefaultDirectory().getPath() + "/A.pdf";
    OutputStream os = new FileOutputStream(path);
    ITextRenderer renderer = new ITextRenderer();
    renderer.getFontResolver().addFont("c:/windows/fonts/verdana.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    renderer.setDocumentFromString(htmlString);
    renderer.layout();
    renderer.createPDF(os);
    os.close();
}

我认为诀窍是将 CSS 添加到 HTML 并且字体必须与您在 PDF 上设置的相匹配。

您必须向渲染器添加支持西里尔文的字体。 (例如Deja Vu。)

String htmlString = getHtml();
ITextRenderer renderer = new ITextRenderer();
renderer.getFontResolver().addFont("font/dejavu-sans/DejaVuSans.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
OutputStream out = new FileOutputStream(new File("so.pdf"));
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(out);
out.close();

并且在您的 HTML 中,您应该将 font-family 设置为使用:

<html>
<head>
    <style>
        body{font-family: "DejaVu Sans", Arial, sans-serif }
    </style>
</head>
<body>
Лорем ипсум долор сит амет, цу вел оратио постеа импедит
</body>
</html>