1
MVC 응용 프로그램을 개발 중이며 XMLWorker 및 ImageProvider에 문제가 있습니다. 내 이미지는 수신하는 pdf afrer 렌더링 html에 표시되지 않습니다. 여기ITextSharp XMLWorker가 이미지를 표시하지 않습니다.
var bytes = Encoding.UTF8.GetBytes(html);
string cssPath = HttpContext.Current.Server.MapPath("~/Content");
using (MemoryStream input = new MemoryStream(bytes))
{
MemoryStream output = new MemoryStream();
using (Document pdfDoc = new Document(PageSize.LETTER, 50, 50, 50, 50))
{
using (PdfWriter pdfWrt = PdfWriter.GetInstance(pdfDoc, output))
{
pdfWrt.CloseStream = false;
pdfWrt.PageEvent = new PdfWriterEvents("watermark");
pdfDoc.Open();
HtmlPipelineContext context = new HtmlPipelineContext(null);
context.SetTagFactory(iTextSharp.tool.xml.html.Tags.GetHtmlTagProcessorFactory());
context.SetImageProvider(new MyImageProvider());
var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
cssResolver.AddCssFile(cssPath + "\\main.css", true);
IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(context, new PdfWriterPipeline(pdfDoc, pdfWrt)));
var worker = new XMLWorker(pipeline, true);
var parser = new XMLParser();
parser.AddListener(worker);
using (TextReader sr = new StringReader(html))
{
parser.Parse(sr);
}
pdfDoc.Close();
byte[] test = output.GetBuffer();
File.WriteAllBytes(HttpContext.Current.Server.MapPath("~/Content/PDFs/test.pdf"), test);
}
}
}
그리고 내 ImageProvider 구현 한 것입니다 : 여기
코드입니다public class MyImageProvider : AbstractImageProvider
{
public override string GetImageRootPath()
{
return HttpContext.Current.Server.MapPath("~/Content/Images");
}
}
어떤 생각이?
디버깅을 돕기 위해'Document' 객체를 직접 파싱하는 대신 커스텀'IElementHandler'에 쓰기를 시도하여 각 객체를 걸을 수 있도록하십시오. 방법은 [두 번째 및 세 번째 코드 블록 여기] (http://stackoverflow.com/a/24498296/231316)를 참조하십시오. 또한,'output.GetBuffer(); '대신'output.ToArray();'를 사용하십시오. 전자는 실제로 특정 일반 시나리오에서 PDF를 손상시킬 수있는 초기화되지 않은 (정크) 바이트를 포함합니다. –
답장을 보내 주셔서 감사합니다. 나는 이미 커스텀 IElementHandler를 시도해 봤지만 작동하지 않았다. 어쨌든, 아마 HTML에서 이미지를 제거하고 pdf 이미지로 생성합니다. – user1797770
'IElementHandler' 만 제안 했으므로'for' 루프에 중단 점을 넣고 iTextSharp가 실제로 무엇을하는지 볼 수 있습니다. –