使用itextsharp将HTML转换为PDF

时间:2013-10-31 07:01:09

标签: c# html asp.net css pdf

使用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();

3 个答案:

答案 0 :(得分:4)

我使用iTextSharp从HTML转换为PDF,并且最终放弃了,因为我无法获得看起来与我的HTML5 / CSS3页面100%相同的转换PDF。所以我给你最终适合我的替代方案。

当您不准备支付商业图书馆的费用时,可用的选项很少。我的一个客户(从HTML转换为PDF)有同样的要求,不想支付任何第三方工具,所以我不得不制定计划。这就是我所做的,而不是最好的解决方案,但它完成了工作

我下载了wkhtmltopdf的最新版本。不幸的是,wkhtmltopdf工具在转换为PDF时没有显示我的HTML中嵌入的一些谷歌图表。所以我使用了包含的wkhtmltoimage工具转换为PNG,它按预期方式唤醒并显示所有图形。 然后我下载了最新版本的imagemagick并将PNG转换为PDF。 我使用C#自动执行此过程。

不幸的是,这不是最优雅的解决方案,因为你必须执行两次转换并做一些工作来自动化所有内容,但这是我能想出的最佳解决方案,它给了我所需的结果和质量。

当然,有很多商业软件会做得更快更好。

只是旁注:

我必须转换的网页使用引导程序版本3在HTML5和CSS3中发布,它包含一些谷歌图形和图表。一切都没有任何问题。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:-1)

<asp:Lable>的输出格式是“span”,它是内联显示类型。因此将显示更改为阻止。享受..