C# 如何使用XMLWorkerHelper从HTML字符串向pdf添加画布或图像?
我将html字符串从razor视图传递到控制器,但当XMLWorkerHelper尝试解析时会显示图像标记关闭错误,如果我直接从代码后面传递图像标记字符串,则不会显示图像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("~
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);
};
}());