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>
我正在制作 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>