从HTML转换为pdf会生成异常

时间:2017-10-20 15:59:53

标签: c# itext xmlworker

我有一个小型的C#桌面应用程序,它创建一个pdf文件,给出一些HTML,从* .eml文件中检索。 这是一个示例:

<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
 <div style="font: normal 13px Arial; color:#000000;">
  <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><font face="Calibri">Some text<o:p></o:p></font></font><br />
  </p>
  <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><o:p><font size="3" face="Calibri">&nbsp;</font></o:p><br />
   <span style="FONT-SIZE: 11pt; FONT-FAMILY: &quot;Calibri&quot;,&quot;sans-serif&quot;; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-US; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-bidi; mso-ansi-language: IT; mso-bidi-language: AR-SA">Some other text</span>
  </p>
 </div>
</body>
</html>

我的机器上的一切正常(Win10 x64),但是当我在客户端的机器上运行相同的代码(Win Server 2008 R2 x64)时,我得到了#34;文档没有页面&# 34;来自iTextsharp例外的消息。

这种情况有时会发生,对于特定的HTML字符串,就像我刚发布的那样;我无法在客户端的计算机上运行调试会话,但我确认该程序接收格式良好的HTML(因为它使用HTML Agility Pack进行了解析)。

这可能是与字体相关的问题吗?我完全没有线索,这些似乎出现在客户的机器上。

以下是我用于创建pdf文档的代码片段(它使用自定义图片代码处理器,但它不应该是问题,因为在给定的代码段中没有任何内容):

using (var document = new Document())
{
    var writer = PdfWriter.GetInstance(document, new FileStream(destinationPath, FileMode.Create));
    writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
    document.Open();

    var tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory();
    tagProcessors.RemoveProcessor(HTML.Tag.IMG);
    tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor());
    CssFilesImpl cssFiles = new CssFilesImpl();
    cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS());
    var cssResolver = new StyleAttrCSSResolver(cssFiles);
    cssResolver.AddCss(@"code { padding: 2px 4px; }", "utf-8", true);
    var charset = Encoding.UTF8;
    var hpc = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider()));
    hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors);
    var htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, writer));                            
    var pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
    var worker = new XMLWorker(pipeline, true);
    var xmlParser = new XMLParser(true, worker, charset);
    xmlParser.Parse(new StringReader(fixedMarkup));
}

2 个答案:

答案 0 :(得分:1)

您应该迁移到pdfHTML,这是将HTML转换为PDF的iText7(最新版iText)插件。 这些年来修复了许多错误(一般与表格,字体和布局相关),因此默认情况下,pdfHTML更有可能进行转换。

示例代码:

while IFS=_ read -a line;do echo "${line[1]} ${line[3]} ${line[5]}";done < your-file

1 4014 1.97676  1   1
1 4014 1.97676  2   1
1 4014 1.97676  3   1
1 4014 1.97676  4   1
1 4014 1.97676  5   1
1 4014 1.97676  6   1
1 4014 1.97676  7   1
1 4014 1.97676  8   1
1 4014 1.97676  9   1
1 4014 1.97676  10  1

答案 1 :(得分:1)

发现了这个问题。我怀疑它与字体有关。

在我的机器上,Calibri字体可以嵌入* .pdf文件中,而在其他机器上则可以嵌入字体嵌入性&#34;属性设置为&#34;受限制&#34;。

我想我必须解析HTML并更改&#34; font family&#34;中的所有值。标签成为非限制性的。