ale*_*ros 10 java pdf encoding itext flying-saucer
这是我花在调查上的第二天没有结果.至少现在,我能够提出非常具体的问题.
我想写包含在PDF文件中使用一些非拉丁字符有效的HTML代码的iText和更具体的使用ITextRenderer从飞碟.
我的简短示例/代码首先使用以下值初始化字符串变量doc:
String doc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\">"
+ "<body>Some greek characters: ???????? Some greek characters"
+ "</body></html>";
Run Code Online (Sandbox Code Playgroud)
这是我用于调试目的的代码.我将此字符串保存为HTML文件然后我通过浏览器打开它只是为了仔细检查HTML内容是否有效,我仍然可以读取希腊字符:
//write for debugging purposes in an html file
File newTextFile = new File("C:/work/test.html");
FileWriter fw = new FileWriter(newTextFile);
fw.write(doc);
fw.close();
Run Code Online (Sandbox Code Playgroud)
下一步是尝试在PDF文件中写入此值.这是我的代码:
ITextRenderer renderer = new ITextRenderer();
//add some fonts - if paths are not right, an exception will be thrown
renderer.getFontResolver().addFont("c:/work/fonts/TIMES.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
renderer.getFontResolver().addFont("c:/work/fonts/TIMESBD.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
renderer.getFontResolver().addFont("c:/work/fonts/TIMESBI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
renderer.getFontResolver().addFont("c:/work/fonts/TIMESI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
.newInstance();
documentBuilderFactory.setValidating(false);
DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
builder.setEntityResolver(FSEntityResolver.instance());
org.w3c.dom.Document document = builder.parse(new ByteArrayInputStream(
doc.toString().getBytes("UTF-8")));
renderer.setDocument(document, null);
renderer.layout();
renderer.createPDF(os);
Run Code Online (Sandbox Code Playgroud)
我的代码的最终结果是:
在HTML文件中我得到:一些希腊字符:Καλημέρα一些希腊字符(预期)
在PDF文件中我得到:一些希腊字符:一些希腊字符(意外 - 希腊字符被忽略!!)
依赖关系:
java版"1.6.0_27"
iText的 - 2.0.8.jar
de.huxhorn.lilith.3rdparty.flyingsaucer.core - 渲染 - 8Pre2.jar
我也尝试过更多的字体,但我想我的问题与使用错误的字体无关.任何帮助都非常受欢迎.
感谢名单
小智 9
我来自捷克共和国,与我们的国家符号有同样的问题!经过一番搜索,我设法用这个解决方案来解决它.
特别是(你已经拥有):
renderer
.getFontResolver()
.addFont(fonts.get(i).getFile().getPath(),
BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);
Run Code Online (Sandbox Code Playgroud)
然后在CSS中的重要部分:
* {
font-family: Verdana;
/* font-family: Times New Roman; - alternative. Without ""! */
}
Run Code Online (Sandbox Code Playgroud)
在我看来,如果没有那个css,你的字体就不会被使用了.当我从CSS中删除theese线时,编码再次被破坏.
希望这会有所帮助!
小智 7
添加到您的HTML这样的东西:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
<style type='text/css'>
* { font-family: 'Arial Unicode MS'; }
</style>
</head>
<body>
<span>Some text with š???ž characters</span>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
然后在Java代码中将FontResolver添加到ITextRenderer:
ITextRenderer renderer = new ITextRenderer();
renderer.getFontResolver().addFont("fonts/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Run Code Online (Sandbox Code Playgroud)
非常适合克罗地亚人
用于生成PDF的jar是:
core-renderer.jar
iText-2.0.8.jar
Run Code Online (Sandbox Code Playgroud)
让我们iText从 html 内容中读取它包含的内容的标题信息utf-8。
\n在带有编码的 html 代码中添加meta标签,然后运行生成 PDF 并检查结果。 content-typeutf-8 charsetiText
<?xml version="1.0" encoding="UTF-8"?>\n<html xmlns="http://www.w3.org/1999/xhtml" lang="en">\n <head>\n <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n </head>\n <body>\n Some greek characters: \xce\x9a\xce\xb1\xce\xbb\xce\xb7\xce\xbc\xce\xad\xcf\x81\xce\xb1 Some greek characters\n </body>\n</html>\nRun Code Online (Sandbox Code Playgroud)\n\n更新:
\n如果上述方法不起作用,请参阅http://www.manning.com/lowagie2/iText2E_MEAP_CH02.pdfENCODING VERSUS THE DEFAULT CHARSET USED BY THE JVM上发布的文档
| 归档时间: |
|
| 查看次数: |
18748 次 |
| 最近记录: |