0

「li」タグと「image」タグを使用して、単純な(今のところ)ビューを変換しようとしています。コントローラーでは、最初にビューを文字列として取得しています

            ViewData.Model = model;
            using (var sw = new StringWriter())
            {
                var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, "Print");
                var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
                viewResult.View.Render(viewContext, sw);
                stringView = sw.GetStringBuilder().ToString();
            }

その後、このドキュメントに従って文字列を解析しようとしています

            Document document = new Document();
        document.SetPageSize(iTextSharp.text.PageSize.A4);
        document.Open();


        PdfWriter writer = PdfWriter.GetInstance(document, Response.OutputStream);

        HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
        htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
        htmlContext.SetImageProvider(new ImageProvider(Server.MapPath(Config.UploadDirectory), Request.Url.ToString()));

        //StyleAttrCSSResolver cssRevolver = new StyleAttrCSSResolver();
        var cssRevolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);

        cssRevolver.AddCssFile(Server.MapPath("~/Content/Site.css"), false);

        IPipeline pipeline = new CssResolverPipeline(cssRevolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
        XMLWorker worker = new XMLWorker(pipeline, true);
        XMLParser parser = new XMLParser(worker);

        var memViewStream = new MemoryStream(Encoding.UTF8.GetBytes(stringView));
        memViewStream.Position = 0;

        parser.Parse(memViewStream); //this line throw the exception

        document.Close();
        writer.Close();

        Response.ContentType = "application/pdf";
        return null;

しかし、このエラーが発生し、何が問題なのかわかりません

オブジェクト参照がオブジェクト インスタンスに設定されていません。

スタック

 at iTextSharp.text.pdf.PdfOutline.InitOutline(PdfOutline parent, String title, Boolean open)
   at iTextSharp.text.pdf.PdfOutline..ctor(PdfOutline parent, PdfDestination destination, Paragraph title, Boolean open)
   at iTextSharp.text.pdf.PdfOutline..ctor(PdfOutline parent, PdfDestination destination, Paragraph title)
   at iTextSharp.tool.xml.html.Header.WriteH.Write(PdfWriter writer, Document doc)
   at iTextSharp.text.pdf.PdfDocument.Add(IElement element)
   at iTextSharp.text.Phrase.Process(IElementListener listener)
   at iTextSharp.text.pdf.PdfDocument.Add(IElement element)
   at iTextSharp.text.List.Process(IElementListener listener)
   at iTextSharp.text.pdf.PdfDocument.Add(IElement element)
   at iTextSharp.text.Document.Add(IElement element)
   at iTextSharp.tool.xml.pipeline.end.PdfWriterPipeline.Write(IWorkerContext context, ProcessObject po)
   at iTextSharp.tool.xml.pipeline.end.PdfWriterPipeline.Close(IWorkerContext context, Tag t, ProcessObject po)
   at iTextSharp.tool.xml.XMLWorker.EndElement(String tag, String ns)
   at iTextSharp.tool.xml.parser.XMLParser.EndElement()

InitOutline が例外をスローしている理由がわかりません。アイデアはありますか? ありがとう

4

1 に答える 1

1

ビューからPDFを印刷したい場合は、ビュー(HTML)の文字列形式を渡すだけです

この関数では、pdfを取得します

String htmlText = html.ToString();   <== Html is a view page html string 
Document document = new Document();
string filePath = HostingEnvironment.MapPath("~/Content/Pdf/");
PdfWriter.GetInstance(document, new FileStream(filePath + "\\pdf-"+Name+".pdf", FileMode.Create));
document.Open();

iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document);
FontFactory.Register(Path.Combine(_webHelper.MapPath("~/App_Data/Pdf/arial.ttf")),  "Garamond");   // just give a path of arial.ttf 
StyleSheet css = new StyleSheet();
css.LoadTagStyle("body", "face", "Garamond");
css.LoadTagStyle("body", "encoding", "Identity-H");
css.LoadTagStyle("body", "size", "12pt");
hw.SetStyleSheet(css);

hw.Parse(new StringReader(htmlText));
于 2014-03-18T11:16:37.910 に答える