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

由 iTextrender 创建的 PDF 中缺少的 html 中的内容

漆雕奇
2023-03-14

我正在尝试从一个具有中文字符的html创建pdf,在这个我有奇怪的概率,来自html的具有中文字符的行并不完全显示在从中生成的pdf中。

以下是我的html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1?DTD/transitional.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>some title.</title>

<style type="text/css">
     .name
   {
         font-family: "Arial Unicode MS";
         color:red;
         margin-left: 5px;
         margin-right: 5px
     }
</style>
</head>
<body>
 <b class="name">

LLTRN,DEBIT,,,6841,FXW,,CNY,PAY,C,,,,DD,,ord par nm,,,,,,,CN,百威英博雪津(三明)啤酒有限公司,,,,,,,CN,20140617,,CNY,647438.24,OUR,,,,,,,,SHANGHAI,CN,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

    <br>

RDF,FTX,TEXT
<br>
</b>
<br>
</body></html>

下面是我的itext渲染器代码:

StringWriter writer = new StringWriter();
Tidy tidy = new Tidy();
tidy.setTidyMark(false);
tidy.setDocType("omit");
tidy.setXHTML(true);
tidy.setInputEncoding("utf-8");
tidy.setOutputEncoding("utf-8");
//tidy.parse(new StringReader(documentJsoup.toString()), writer);
tidy.parse(new StringReader(inputFileString), writer);
writer.close();
String  pdfContent = writer.toString();

// Creating an instance of iText renderer which will be used to generate the pdf from the html document.
ITextRenderer renderer = new ITextRenderer();           

/*renderer.setDocument(doc, baseurl);
renderer.layout();
renderer.createPDF(os);
os.flush();         

// close all the streams
//fis.close();
//os.close();
//instream.close();
 */
ITextFontResolver resolver = renderer.getFontResolver();

//renderer.getFontResolver().addFont("C:\\Windows\\Fonts\\arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
resolver.addFont("C:\\Windows\\Fonts\\arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.setDocumentFromString(pdfContent);
renderer.layout();
renderer.createPDF(os);

由于我使用了字体解析器和添加字体,中文字符显示....但是pdf显示缺少内容....该行的最后几个字符(即“上海”中的“AI”和下一个“CN、、、、、、、、、、、、、、、、、、、、、、、、、、“)不可见....它看起来像是:

我试了很多,想看看哪里出了问题,但找不到解决办法。你有人能帮我解决这个问题吗??TIA!

共有3个答案

酆君墨
2023-03-14

我尝试将以下css规则添加到body类中,效果非常好。

单词换行:断开单词;单词断开:全部断开;

添加空格”有时有效(我尝试在. or等符号后添加空格),但有时当没有符号时,它仍然会溢出。

楚流觞
2023-03-14

这里您需要在应用程序中添加字体类型或字体文件。

你可以在这里找到代码 itextSharp - html到pdf一些土耳其语字符丢失

这个问题也和你的问题一样。。

如果这有助于你,那么请给点。

刘永望
2023-03-14

问题是飞碟不管理中文文本中的换行符。它只在空格上插入换行符。在您的例子中,这意味着它不能在“nm、、、”之后插入换行符,并且它不适合该行。

这是飞碟中的一个已知错误(见此处),但它不太可能很快被修复。

唯一的解决方法是在字符串中的中文字符后插入一个空格。这将使所有文本可见。

 类似资料:
  • 我有两个不同的JTextPanes,第一个是不同线程发送消息的日志。在html文件中有保存的会话,当用户加载它们时,这些文件被用作第二个JTextPane的内容。这两个JTextPanes都具有html内容类型。 表格和空格还在。 表格和空格都不见了。我尝试使用而不是简单的空格,但结果是一样的。 第二个JTextPane的代码:

  • 如何从此PDF文件中获取字段?它是由Adobe LiveCycle Designer创建的动态PDF。如果在web浏览器中打开链接,您可能会看到一个以“请稍候…”开头的页面如果您下载文件并通过Adobe Reader(5.0或更高版本)打开,您应该可以看到所有8页。 因此,当通过阅读时,您会得到一个空字典,因为它将文件呈现为单个页面,就像您通过Web浏览器看到的那样。 您可以使用Java依赖库ti

  • 我想用Java创建一个PDF(我更喜欢在这里使用PDFBox,但这不是一个严格的要求)。部分内容必须 在屏幕上可见 但打印时不可见 (把它想象成标题,它已经预先打印在纸上,但是PDF的数字版本应该在屏幕上显示这个标题,而不是打印它) 我看到了这篇文章,它展示了一个很好的内容示例,即仅打印但在屏幕上不可见:创建一个仅在使用PDFBox打印时显示的水印(pdf可选内容) 现在我需要完全相反的:在屏幕上

  • 我的STS版本:3.7.1.RELEASE,内部版本Id:201510041213,平台:Eclipse Mars。1(4.5.1)在选择例如Spring Starter project时没有创建正确的项目 当与我现有的一个项目进行比较时,我可以看到缺少了Builder。创建的项目仅包含Maven Builder 我的参考项目有Maven、Java和Spring project Builders。

  • 假设我有三节课: 我的问题是: 在这种情况下创建了多少个对象? 如果创建了一个对象,那么Super()如何在内部调用父类构造函数?