C# 如何使用XMLWorkerHelper从HTML字符串向pdf添加画布或图像?

C# 如何使用XMLWorkerHelper从HTML字符串向pdf添加画布或图像?,c#,asp.net,asp.net-mvc,itext,C#,Asp.net,Asp.net Mvc,Itext,我将html字符串从razor视图传递到控制器,但当XMLWorkerHelper尝试解析时会显示图像标记关闭错误,如果我直接从代码后面传递图像标记字符串,则不会显示图像 public string GetPDF(string pHTML) { byte[] pdf; // result will be here var cssText = System.IO.File.ReadAllText(HttpContext.Server.MapPath("~

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

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;


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

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;}

最有可能的问题是您提供给XMLWorkerHelper的html/css。请同时显示这些数据,特别是那些负责相关图像的部分。我可以导出数据吗:image/png;base64图像转换为pdf?是的,但您需要使用自定义图像提供程序。如果您不希望结果出现在文件系统中,请不要在其中进行流式处理。引用的示例使用了一个文件流,但这不能阻止您像在代码中那样使用MemoryStream,是吗?谢谢,我刚刚添加了使用var MemoryStream=new MemoryStream{…}的代码,它可以工作
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);
            };
        }());