从 HTML 到 pdf 的转换产生异常
Conversion from HTML to pdf generates an exception
我有一个小型 C# 桌面应用程序,它根据从 *.eml 文件中检索到的 HTML 创建一个 pdf 文件。
这是一个示例:
<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"> </font></o:p><br />
<span style="FONT-SIZE: 11pt; FONT-FAMILY: "Calibri","sans-serif"; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; 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) 上使用相同的代码时,我从 "document has no pages" 收到消息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));
}
您应该迁移到 pdfHTML,iText7(iText 的最新版本)插件可以将 HTML 转换为 PDF。
许多错误(通常与表格、字体和布局相关)多年来已得到修复,因此默认情况下 pdfHTML 更有可能进行转换。
示例代码:
HtmlConverter.convertToPdf(
"<b>This text should be written in bold.</b>",
new PdfWriter(new File("C://users/mentre83/output.pdf")));
发现问题。正如我所怀疑的,它与字体有关。
在我的机器上,Calibri 字体可以嵌入到 *.pdf 文档中,而在其他机器上它的 "Font embeddability" 属性 设置为 "Restricted"。
我想我必须解析 HTML 并将 "font family" 标签内的所有值更改为非限制值。
我有一个小型 C# 桌面应用程序,它根据从 *.eml 文件中检索到的 HTML 创建一个 pdf 文件。 这是一个示例:
<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"> </font></o:p><br />
<span style="FONT-SIZE: 11pt; FONT-FAMILY: "Calibri","sans-serif"; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; 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) 上使用相同的代码时,我从 "document has no pages" 收到消息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));
}
您应该迁移到 pdfHTML,iText7(iText 的最新版本)插件可以将 HTML 转换为 PDF。 许多错误(通常与表格、字体和布局相关)多年来已得到修复,因此默认情况下 pdfHTML 更有可能进行转换。
示例代码:
HtmlConverter.convertToPdf(
"<b>This text should be written in bold.</b>",
new PdfWriter(new File("C://users/mentre83/output.pdf")));
发现问题。正如我所怀疑的,它与字体有关。
在我的机器上,Calibri 字体可以嵌入到 *.pdf 文档中,而在其他机器上它的 "Font embeddability" 属性 设置为 "Restricted"。
我想我必须解析 HTML 并将 "font family" 标签内的所有值更改为非限制值。