使用itextsharp将HTML转换为PDF

5

使用 iTextSharp 将 HTML 转换为 PDF 时,我应用于 web 页面的 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();
3个回答

6
我曾经尝试使用iTextSharp将HTML转换为PDF,但是由于无法得到与我的HTML5/CSS3页面完全相同的转换后的PDF而放弃了。因此,我给出了另一种最终适用于我的备选方案。
当你不想支付商业库费用时,可用的选项非常少。我的一个客户有同样的需求(将HTML转换为PDF),但不想支付任何第三方工具的费用,所以我必须想出一个解决方案。这就是我所做的事情,虽然不是最好的解决方案,但完成了工作。
我下载了最新版本的wkhtmltopdf。不幸的是,在将HTML转换为PDF时,wkhtmltopdf工具无法显示我的嵌入在HTML中的某些谷歌图形。因此,我使用了也包含在其中的wkhtmltoimage工具将其转换为PNG,它按预期显示了所有图形。然后,我下载了最新版本的imagemagick并将PNG转换为PDF。我使用C#自动化了这个过程。
很遗憾,这不是最优雅的解决方案,因为你需要执行两次转换并且需要做一些工作来自动化所有操作,但这是我能想到的最好的解决方案,可以给我所需的结果和质量。当然,有很多商业软件可以更快、更好地完成此任务。
只是顺便提一下:
要转换的网页是使用HTML5和CSS3开发的,使用Bootstrap 3版本,并包含一些Google图表和图形。一切都可以无问题地转换。

0
以下是将包含内联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;
    }
}

-1
< p > <asp:Lable> 的输出格式为 "span",即内联显示类型。因此,请将显示更改为块级元素。享受吧..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接