ItextSharp PDF Проблема с повторением нижнего колонтитула - PullRequest
0 голосов
/ 19 мая 2019

Я использовал Itextsharp из пакета Nuget, проанализировал HTML-файл в формате PDF и передал байты на веб-сайт веб-сайта и показал файл PDF в iframe.

Во-первых, у меня было два отдельных HTML для PDF, то есть один для заголовка и другой для тела. Когда я использовал для анализа HTML в PDF, возникла проблема с повторением заголовка. Заголовок отлично работает на первой странице, но заголовок второй страницы и тело перекрывают друг друга. Я много пробовал, переопределив функции OnStartPage и OnEndPage, но ничего не получалось.

Во-вторых, я пробовал заголовок через код C # и тело через HTML, но это также, похоже, не работает и имеет ту же проблему.

Я думаю, что главная проблема - разрыв страницы (поправьте меня, если я ошибаюсь). Если кто-то из сообщества может помочь мне, пожалуйста, продолжайте. Я делюсь кодом и очень признателен за помощь.

Пожалуйста, дайте мне знать, если какой-либо код отсутствует. Мне нужен заголовок на каждой странице, которая должна быть согласованной, но с динамическим контентом.

         using System;
         using System.Collections.Generic;
         using iTextSharp.text.html.simpleparser;

         namespace WebApi.Controllers
         {
             using iTextSharp.text;
             using iTextSharp.text.pdf;
             using iTextSharp.tool.xml;
             using iTextSharp.tool.xml.css;
             using iTextSharp.tool.xml.html;
             using iTextSharp.tool.xml.parser;
             using iTextSharp.tool.xml.pipeline.css;
             using iTextSharp.tool.xml.pipeline.end;
             using iTextSharp.tool.xml.pipeline.html;
             using System.IO;
             using System.Text;
             using System.Web.Mvc;

             public class PDFGenerateController : Controller
             {
                 [NonAction]
                 public byte[] Index(IModel iModel)
                 {
                     // get HTML for body
                     var html = GetHtml(iModel, false); 
                     byte[] bytes;
                     Document pdfDocument = new Document(PageSize.A4);

                  using (MemoryStream memoryStream = new MemoryStream())
                    {
                         PdfWriter writer = PdfWriter.GetInstance(pdfDocument, memoryStream);
                         AddImageToHeader pageEventHandler = new AddImageToHeader(GetHtml(processedData, true)); // get html for header right side
                         IHeaderFooter iHeaderFooter = new IHeaderFooter(GetHtml(processedData, true)); // get html for header right side

                         writer.PageEvent = iHeaderFooter;
                         writer.PageEvent = pageEventHandler;
                         writer.PageEvent = new HeaderFooterAdd(iModel);
                         writer.CloseStream = false;

                         pdfDocument.Open();

                         HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
                         htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

                         ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
                         cssResolver.AddCssFile("C:/pdf.css", true);

                         IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext,
                             new PdfWriterPipeline(pdfDocument, writer)));

                         XMLWorker worker = new XMLWorker(pipeline, true);
                         XMLParser xmlParser = new XMLParser(worker);
                         xmlParser.Parse(new MemoryStream(Encoding.UTF8.GetBytes(html)));
                         pdfDocument.Close();

                         bytes = memoryStream.GetBuffer();
                         memoryStream.Close();
                     }

                     return bytes;
                 }

                 public class iHeaderFooter : PdfPageEventHelper
                 {

                     private readonly string _html;


                     public iHeaderFooter(string html)
                     {
                         _html = html;
                     }

                     public override void OnStartPage(PdfWriter writer, Document document)
                     {
                         var cssResolver = new StyleAttrCSSResolver();
                         XMLWorkerFontProvider fontProvider =
                             new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
                         CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
                         HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
                         htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

                         PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
                         HtmlPipeline html1 = new HtmlPipeline(htmlContext, pdf);

                         CssResolverPipeline css = new CssResolverPipeline(cssResolver, html1);
                         XMLWorker worker = new XMLWorker(css, true);
                         XMLParser p = new XMLParser(worker);
                         p.Parse(new StringReader(_html));

                        //for page break but didn't worked out
                         /*using (TextReader htmlViewReader = new StringReader(_html))
                         {
                             using (var htmlWorker = new HeaderFooterAdd.HTMLWorkerExtended(document))
                             {
                                 htmlWorker.Open();
                                 htmlWorker.Parse(htmlViewReader);
                             }
                         }*/

                         base.OnStartPage(writer, document);
                     }
                 }
             }

            // Add logo image to header left side
             public class AddImageToHeader : PdfPageEventHelper
             {
                 private readonly string _html;

                 public AddImageToHeader(string html)
                 {
                     _html = html;
                 }

                 public override void OnStartPage(PdfWriter writer, Document document)
                 {
                     iTextSharp.text.Image imghead = iTextSharp.text.Image.GetInstance("C:/logo.png");
                     imghead.ScaleAbsolute(189f, 79f);
                     imghead.SetAbsolutePosition(30, 0);

                     PdfContentByte cbhead = writer.DirectContent;
                     PdfTemplate tp = cbhead.CreateTemplate(320, 100);
                     tp.AddImage(imghead);

                     cbhead.AddTemplate(tp, 0, 830 - 95);

                     base.OnStartPage(writer, document);
                 }
             }

             public class HeaderFooterAdd : PdfPageEventHelper
             {
                //C# Header 
                 public override void OnEndPage(PdfWriter writer, Document document)
                 {
                     PdfPTable tbHeader = new PdfPTable(2);
                     tbHeader.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
                     tbHeader.DefaultCell.Border = Rectangle.NO_BORDER;
                     tbHeader.DefaultCell.BorderWidth = 0;
                     tbHeader.DefaultCell.Top = 100;
                     tbHeader.DefaultCell.Bottom = 100;
                     tbHeader.AddCell(new Paragraph());

                     Phrase datePhrase = new Phrase(new Chunk($"{"Label"}: {"Text"}\n", FontFactory.GetFont(FontFactory.TIMES, 10, Font.NORMAL, BaseColor.BLACK)));

                     PdfPCell _cell = new PdfPCell(datePhrase);
                     _cell.HorizontalAlignment = Element.ALIGN_RIGHT;

                     _cell.BorderWidthBottom = 0f;
                     _cell.BorderWidthLeft = 0f;
                     _cell.BorderWidthTop = 0f;
                     _cell.BorderWidthRight = 0f;
                     _cell.PaddingTop = 45f;
                     _cell.ExtraParagraphSpace = 2f;

                     tbHeader.AddCell(_cell);
                     tbHeader.AddCell(new Paragraph());

                     tbHeader.WriteSelectedRows(0, -1, document.Left, 
 writer.PageSize.GetTop(document.TopMargin) + 40,
                         writer.DirectContent);
                 }

                //for page break but didn't worked out
                 /*public class HTMLWorkerExtended : HTMLWorker
                 {
                     public HTMLWorkerExtended(IDocListener document) : 
 base(document)
                     {

                     }
                     public override void StartElement(string tag, 
IDictionary<string, string> str)
                     {
                         if (tag.Equals("newpage"))
                             document.Add(Chunk.NEXTPAGE);
                         else
                             base.StartElement(tag, str);
                     }
                 }*/
         }
...