使用 itextsharp 将 HTML 转换为 PDF
Posted
技术标签:
【中文标题】使用 itextsharp 将 HTML 转换为 PDF【英文标题】:Convert HTML to PDF using itextsharp 【发布时间】:2022-03-07 21:05:07 【问题描述】:当使用 itextsharp
将 html 转换为 pdf 时,使用 css 为网页应用的样式在转换后的 pdf 中不起作用。
这是我的 css 代码:
<style type="text/css">
.cssformat
width:300px;
height:200px;
border:2px solid black;
background-color:white;
border-top-left-radius:60px 90px;
border-bottom-right-radius:60px 90px;
</style>
这是我的 html 代码:
<div id="divpdf" runat="server">
<table id="tid" runat="server">
<tr>
<td>
<asp:Label ID="Label1" runat="server" Text="this is new way of pdf" CssClass="cssformat"></asp:Label>
</td>
</tr>
</table>
</div>
以下是我用 c# 尝试过的:
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=TestPage.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
Document pdfDoc = new Document(PageSize.A4, 60f, 80f, -2f, 35f);
divpdf.RenderControl(hw);
StringReader sr = new StringReader(sw.ToString());
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
hw1.Parse(new StringReader(sttt));
htmlparser.Parse(sr);
pdfDoc.Close();
Response.Write(pdfDoc);
Response.End();
sw.Close();
sr.Close();
hw.Close();
【问题讨论】:
【参考方案1】:在使用 iTextSharp 将 HTML 转换为 PDF 时我费了一番周折,最终放弃了,因为我无法获得与我的 HTML5/CSS3 页面 100% 相同的转换后的 PDF。所以我给你一个最终对我有用的替代方案。
当您不准备为商业图书馆付费时,可用的选择非常少。我的一位客户也有同样的要求(从 HTML 转换为 PDF),他们不想为任何第三方工具付费,所以我必须制定一个计划。这就是我所做的,不是最好的解决方案,但它完成了工作
我下载了最新版本的wkhtmltopdf。不幸的是,当转换为 PDF 时,wkhtmltopdf 工具没有显示嵌入在我的 HTML 中的一些谷歌图表。所以我使用 wkhtmltoimage 工具也包括在内转换为 PNG,它按预期唤醒并显示所有图形。 然后我下载了最新版本的imagemagick 并将PNG 转换为PDF。 我使用 C# 自动化了这个过程。
很遗憾,这不是最优雅的解决方案,因为您必须执行两次转换并做一些工作以自动化所有内容,但这是我能想到的最佳解决方案,它给了我想要的结果和质量。
当然,有很多商业软件可以做得更快更好。
只是一个旁注:
我必须转换的网页是使用第 3 版引导程序在 HTML5 和 CSS3 中开发的,其中包含一些谷歌图形和图表。一切都已转换,没有任何问题。
【讨论】:
【参考方案2】:以下是转换包含内联 CSS 代码的 HTML 内容的示例。
public static class PdfCreator
public static string ConvertHtmlToPdf(string htmlContent, string fileNameWithoutExtension, string filePath, string cssContent = "")
if (!Directory.Exists(filePath))
Directory.CreateDirectory(filePath);
var fileNameWithPath = Path.Combine(filePath, fileNameWithoutExtension + ".pdf");
using(var stream = new FileStream(fileNameWithPath, FileMode.Create))
using(var document = new Document())
var writer = PdfWriter.GetInstance(document, stream);
document.Open();
// instantiate custom tag processor and add to `HtmlPipelineContext`.
var tagProcessorFactory = Tags.GetHtmlTagProcessorFactory();
tagProcessorFactory.AddProcessor(new TableData(), new string[]
HTML.Tag.TD
);
var htmlPipelineContext = new HtmlPipelineContext(null);
htmlPipelineContext.SetTagFactory(tagProcessorFactory);
var pdfWriterPipeline = new PdfWriterPipeline(document, writer);
var htmlPipeline = new HtmlPipeline(htmlPipelineContext, pdfWriterPipeline);
// get an ICssResolver and add the custom CSS
var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
cssResolver.AddCss(cssContent, "utf-8", true);
var cssResolverPipeline = new CssResolverPipeline(
cssResolver, htmlPipeline);
var worker = new XMLWorker(cssResolverPipeline, true);
var parser = new XMLParser(worker);
using(var stringReader = new StringReader(htmlContent))
parser.Parse(stringReader);
return fileNameWithPath;
【讨论】:
【参考方案3】:<asp:Lable>
的输出格式为“span”,即内联类型的显示。因此,将显示更改为阻止。享受..
【讨论】:
以上是关于使用 itextsharp 将 HTML 转换为 PDF的主要内容,如果未能解决你的问题,请参考以下文章
使用 iTextSharp 将 HTML 样式(点下划线)转换为 PDF
使用itextsharp xmlworker 将html转换为pdf并垂直写入文本
尝试解析 html 以进行 pdf 转换时出现 ItextSharp 错误