当前位置: 首页 > 知识库问答 >
问题:

生成PDF从超文本标记语言与非拉丁字符使用ITextRenader不工作

池阳伯
2023-03-14

这是我调查的第二天,没有任何结果。至少现在,我能够问一些非常具体的问题。

我试图编写一个有效的超文本标记语言代码,其中包含一些非拉丁字符在PDF文件中使用iText,更具体地说,使用飞碟的IText渲染器。

我的简短示例/代码首先使用以下值初始化字符串变量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>";

这是我用于调试的代码。我将此字符串保存到超文本标记语言文件中,然后通过浏览器打开它,只是为了仔细检查超文本标记语言内容是否有效,我仍然可以读取希腊字符:

//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文件中,我得到:一些希腊字符:一些希腊字符(意外-希腊字符被忽略!!)

依赖关系:

> < li>

java版本" 1.6.0_27 "

itext-2.0.8.jar

de.huxhorn.lilith.3rdparty.flyingsaucer.core-renderer-8Pre2.jar

我也尝试过更多的字体,但我想我的问题与使用错误的字体无关。非常欢迎任何帮助。

Thanx公司

共有3个答案

景永望
2023-03-14

iText 从包含 utf-8 内容的 html 内容中读取标头信息。
在 html 代码中添加具有 utf-8 字符集编码的内容类型的元标记,然后运行 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>

更新:< br >如果上述内容不起作用,请参考http://www.manning.com/lowagie2/iText2E_MEAP_CH02.pdf发布的文档中的< code >编码与JVM使用的默认字符集

濮阳默
2023-03-14

将以下内容添加到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>

然后在java代码中将FontResolver添加到ITextRenader:

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
申屠涛
2023-03-14

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

具体来说(你已经有了):

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中删除这些行时,编码再次被破坏。

希望这能有所帮助!

 类似资料:
  • 我正在使用ITextRenderer从html生成PDF。然而,我得到以下异常: 你能帮帮我吗? 任何帮助都将不胜感激。 先谢谢你。

  • 我使用库创建一个带有文本可填充字段的PDF文档。包含多语言文本。创建PDF文档后,我在Adobe Acrobat Reader中打开它,非拉丁符号从文本字段中消失,我只看到拉丁符号,但如果我单击该字段,整个文本将可见,包括非拉丁符号。[!打开文档后的PDF文本字段] 1.[!点击后的PDF文本字段到字段] 2.对于创建PDF文档,我使用如下代码: 我试图解决这个问题,我甚至在它的博客上找到了这篇文

  • 我之所以发布这个问题,是因为许多开发人员或多或少地以不同的形式问同一个问题。我会自己回答这个问题(我是iText Group的创始人/首席技术官),这样它就可以成为“维基答案”如果堆栈溢出的“文档”特性仍然存在,那么这将是文档主题的一个很好的候选者。 我正在尝试将以下HTML文件转换为PDF: 在浏览器中,这种超文本标记语言如下所示: HTMLWorker根本不考虑CSS 当我使用时,我需要创建一

  • 我们有一个基于Java的系统,它从数据库中读取数据,用预设的标记合并单个数据字段,并用将结果转换为。 在格式中,它看起来像这样: 现在我正在寻找一种方法来允许一些字段包含静态超文本标记语言格式的内容。此内容将由我们启用超文本标记语言的编辑器(类似、等的东西)生成或从外部粘贴。 我的计划是遵循这篇JavaWorld文章的配方: < li >使用< code>JTidy将HTML格式的字符串转换为正确

  • 我将html表格从网页复制到excel,并尝试使用下面的代码,但没有结果。请就如何解决这个问题提出建议。我做了所有的实验,但没有得到正确的结果。

  • 对于上面的html内容,我如何使用Jsoup解析并获取文本 当我使用 我得到了这样的东西