【问题标题】:iTextSharp - How to add canvas or image to pdf from HTML string using XMLWorkerHelper?iTextSharp - 如何使用 XMLWorkerHelper 从 HTML 字符串将画布或图像添加到 pdf?
【发布时间】:2017-09-23 07:52:02
【问题描述】:
public string GetPDF(string pHTML)
    {

        byte[] pdf; // result will be here

        var cssText = System.IO.File.ReadAllText(HttpContext.Server.MapPath("~/Content/bootstrap.css"));
        cssText=cssText + System.IO.File.ReadAllText(HttpContext.Server.MapPath("~/Content/styles.css"));
        var html = pHTML;

        using (var memoryStream = new MemoryStream())
        {
            var document = new Document(PageSize.A4, 15, 15, 15, 15);
            var writer = PdfWriter.GetInstance(document, memoryStream);
            document.Open();

            using (var cssMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssText)))
            {
                using (var htmlMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)))
                {
                    XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, htmlMemoryStream, cssMemoryStream);
                }
            }

            document.Close();

            pdf = memoryStream.ToArray();
        }
        var temp = Convert.ToBase64String(pdf);
        return temp;


    }

我将 html 字符串从 razor 视图传递到控制器,但是当 XMLWorkerHelper 尝试解析时显示图像标记关闭错误,如果我直接从后面的代码传递图像标记字符串,则不显示图像

【问题讨论】:

  • 问题很可能出在您输入XMLWorkerHelper 的html/css 中。还请显示这些数据,特别是那些负责相关图像的部分。
  • 我可以将 data:image/png;base64 图像导出为 pdf 吗?
  • 可以,但您需要使用自定义图像提供程序。
  • 如果您不希望文件系统中的结果,请不要将其流式传输到那里。引用的示例使用FileStream,但这不能阻止您像在代码中那样使用MemoryStream,可以吗?
  • 谢谢我刚刚添加使用 (var memoryStream = new MemoryStream()) {.... } 并且它有效

标签: c# asp.net asp.net-mvc itext


【解决方案1】:
public string GetPDF(string pHTML)
    {
        byte[] pdf;
        using (var memoryStream = new MemoryStream())
        {
            using (var doc = new Document(PageSize.A4, 15, 15, 15, 15))
            {
                var writer = PdfWriter.GetInstance(doc, memoryStream);
                writer.PageEvent = new PDFEvents();
                doc.Open();

                var html = pHTML;
                var tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory();
                tagProcessors.RemoveProcessor(HTML.Tag.IMG); // remove the default processor
                tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor()); // use our new processor

                CssFilesImpl cssFiles = new CssFilesImpl();
                cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS());
                var cssResolver = new StyleAttrCSSResolver(cssFiles);

                var cssText = System.IO.File.ReadAllText(HttpContext.Server.MapPath("~/Content/bootstrap.css"));
                cssText = cssText + System.IO.File.ReadAllText(HttpContext.Server.MapPath("~/Content/styles.css"));

                cssResolver.AddCss(cssText, "utf-8", true);
                var charset = Encoding.UTF8;
                var hpc = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider()));
                hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors); // inject the tagProcessors
                var htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(doc, writer));
                var pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
                var worker = new XMLWorker(pipeline, true);
                var xmlParser = new XMLParser(true, worker, charset);
                xmlParser.Parse(new StringReader(html));


            }
            pdf = memoryStream.ToArray();
        }

        var str= Convert.ToBase64String(pdf);
        return str;}

还有我的客户端代码 我将 xhtml 传递给 mvc 操作方法

var doc = new DOMParser().parseFromString($('#content').html(), 'text/html');
        var result = new XMLSerializer().serializeToString(doc);

        $.ajax({
            url: '@Url.Content("~/contoller/action")',
            type: "POST",
            dataType: "JSON",
            data: { strHtml: result },
            success: function (response) {
                debugger;
                var sampleBytes = base64ToArrayBuffer(response);
                saveByteArray([sampleBytes], 'test.pdf');
            }
        });


        function base64ToArrayBuffer(base64) {
            var binaryString = window.atob(base64);
            var binaryLen = binaryString.length;
            var bytes = new Uint8Array(binaryLen);
            for (var i = 0; i < binaryLen; i++) {
                var ascii = binaryString.charCodeAt(i);
                bytes[i] = ascii;
            }
            return bytes;
        }

        var saveByteArray = (function () {
            var a = document.createElement("a");
            document.body.appendChild(a);
            a.style = "display: none";
            return function (data, name) {
                var blob = new Blob(data, { type: "octet/stream" }),
                    url = window.URL.createObjectURL(blob);
                a.href = url;
                a.download = name;
                a.click();
                window.URL.revokeObjectURL(url);
            };
        }());

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2013-07-10
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多