使用ITextRenderer不起作用从HTML PDF使用非拉丁字符的代(Generation o

2019-07-29 01:48发布

这是第2天我花没有结果调查。 至少现在,我可以问非常具体的东西。

我想写包含在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>";

下面是我在调试时使用的代码。 我这个字符串保存为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();

下一步是尝试写在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);

我的代码的最终结果是:

在HTML文件中 ,我得到: 一些希腊字符:Καλημέρα一些希腊字符 (预计)

在PDF文件获取: 一些希腊字符:一些希腊字符意外 -希腊字符被忽略!)

依赖关系:

  • Java版本 “1.6.0_27”

  • iText的 - 2.0.8.jar

  • de.huxhorn.lilith.3rdparty.flyingsaucer.core - 渲染 - 8Pre2.jar

我也一直在尝试用更多的字体,但我想,我的问题无关使用错误的字体。 任何帮助都欢迎。

感谢名单

Answer 1:

我是来自捷克共和国,并有同样的问题,与我们国家的象征! 经过一番搜索,我设法与解决它这个解决方案 。

具体有(你已经有了):

renderer
    .getFontResolver()
    .addFont(fonts.get(i).getFile().getPath(), 
             BaseFont.IDENTITY_H, 
             BaseFont.NOT_EMBEDDED);

在CSS然后重要的部分:

* {
  font-family: Verdana;
/*  font-family: Times New Roman; - alternative. Without ""! */
}

在我看来,没有那个CSS,你的字体不被使用。 当我从CSS除去theese线,编码再次破碎。

希望这将有助于!



Answer 2:

添加到您的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>

然后添加FontResolver到ITextRenderer在Java代码:

ITextRenderer renderer = new ITextRenderer();
renderer.getFontResolver().addFont("fonts/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

克罗地亚人物的伟大工程

用于生成PDF罐子是:

core-renderer.jar
iText-2.0.8.jar


Answer 3:

iText读取你的HTML内容的头信息,它包含utf-8的内容。
添加meta标记的content-type与HTML代码utf-8 charset编码,然后运行iText生成PDF和检查结果。

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 </head>
 <body>
  Some greek characters: Καλημέρα Some greek characters
 </body>
</html>

更新
如果以上不工作,则是指ENCODING VERSUS THE DEFAULT CHARSET USED BY THE JVM在发布的文件中http://www.manning.com/lowagie2/iText2E_MEAP_CH02.pdf



文章来源: Generation of PDF from HTML with non-Latin characters using ITextRenderer does not work