2014-09-10 5 views
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"); 
    } 
} 

어떤 생각이?

+1

디버깅을 돕기 위해'Document' 객체를 직접 파싱하는 대신 커스텀'IElementHandler'에 쓰기를 시도하여 각 객체를 걸을 수 있도록하십시오. 방법은 [두 번째 및 세 번째 코드 블록 여기] (http://stackoverflow.com/a/24498296/231316)를 참조하십시오. 또한,'output.GetBuffer(); '대신'output.ToArray();'를 사용하십시오. 전자는 실제로 특정 일반 시나리오에서 PDF를 손상시킬 수있는 초기화되지 않은 (정크) 바이트를 포함합니다. –

+0

답장을 보내 주셔서 감사합니다. 나는 이미 커스텀 IElementHandler를 시도해 봤지만 작동하지 않았다. 어쨌든, 아마 HTML에서 이미지를 제거하고 pdf 이미지로 생성합니다. – user1797770

+0

'IElementHandler' 만 제안 했으므로'for' 루프에 중단 점을 넣고 iTextSharp가 실제로 무엇을하는지 볼 수 있습니다. –

답변

0

이미지 원본 태그를 변경하여 전체 URL을 포함시켜 작동 시키도록해야했습니다.

관련 문제