2015-12-22 6 views
1

Я пытаюсь создавать отчеты PDF с помощью iTextSharp с информацией о клиентах, заголовке и нижнем колонтитуле и т. Д. Все эти отчеты уже созданы с использованием API-интерфейсов EVO. В рамках процесса миграции мы планируем создавать эти отчеты с использованием API iTextSharp.iTextSharp Заголовок PDF с HTML-строкой C#

Мне нужно знать, есть ли возможность предоставить готовый текст HTML для заголовка PDF iTextSharp (существующий проект EVO принимает строку HTML и сборку PDF) вместо использования PageEvents для проектирования с помощью PDFPTable и PDFPCell (как количество отчетов огромно и во избежание переделки)

+0

Если ответ достаточно отвечает на вопрос, который вы разместили здесь, вы должны принять его (щелкнув по галочку в верхнем левом углу ответа). Если это не так, вы должны добавить комментарий, в котором вы описываете, каким образом он не может этого сделать. – mkl

ответ

2

мне нужно знать, если есть возможность обеспечить готовым оказать HTML строку iTextSharp заголовка PDF (Существующее EVO дизайн принимает строку HTML и построить PDF), Вместо того, чтобы использовать PageEvents проектировать с PDFPTable и PDFPCell

Вы должны будете использовать страницу события рисовать заголовок или нижние колонтитулы, но нет никакой необходимости использовать PdfPTable явно там. Фактически вы можете отображать html во время события страницы, например. например:

[Test] 
public void CreatePdfWithHtmlHeader() 
{ 
    string htmlHeader = "<!DOCTYPE html><html><body><table style=\"width: 100%; border: 1px solid black;\"><tr><td>A</td><td>B</td></tr></table></body></html>"; 

    using (FileStream output = new FileStream(@"C:\Temp\test-results\content\html-header.pdf", FileMode.Create, FileAccess.Write)) 
    using (Document document = new Document(PageSize.A4)) 
    { 
     PdfWriter writer = PdfWriter.GetInstance(document, output); 
     writer.PageEvent = new HtmlPageEventHelper(htmlHeader); 
     document.Open(); 
     document.Add(new Paragraph("1")); 
     document.NewPage(); 
     document.Add(new Paragraph("2")); 
    } 
} 

Использование следующих двух небольших вспомогательных классов.

HtmlPageEventHelper - это прослушиватель событий страницы, нарисовавший данный html-sniplet в заголовке страницы. Очевидно, что это может альтернативно или дополнительно записать в колонтитул, просто используйте соответствующий столбец координаты

public class HtmlPageEventHelper : PdfPageEventHelper 
{ 
    public HtmlPageEventHelper(string html) 
    { 
     this.html = html; 
    } 

    public override void OnEndPage(PdfWriter writer, Document document) 
    { 
     base.OnEndPage(writer, document); 

     ColumnText ct = new ColumnText(writer.DirectContent); 
     XMLWorkerHelper.GetInstance().ParseXHtml(new ColumnTextElementHandler(ct), new StringReader(html)); 
     ct.SetSimpleColumn(document.Left, document.Top, document.Right, document.GetTop(-20), 10, Element.ALIGN_MIDDLE); 
     ct.Go(); 
    } 

    string html = null; 
} 

Для более сложного HTML sniplets вы можете захотеть заменить XMLWorkerHelper.GetInstance().ParseXHtml вызов настроенного вызова парсера, представленными в @ ответ Skary в.

ColumnTextElementHandler является IElementHandler реализация, которая добавляет контент (созданный, например, путем разбора HTML) к ColumnText

public class ColumnTextElementHandler : IElementHandler 
{ 
    public ColumnTextElementHandler(ColumnText ct) 
    { 
     this.ct = ct; 
    } 

    ColumnText ct = null; 

    public void Add(IWritable w) 
    { 
     if (w is WritableElement) 
     { 
      foreach (IElement e in ((WritableElement)w).Elements()) 
      { 
       ct.AddElement(e); 
      } 
     } 
    } 
} 

Кстати, тест выше производит PDF с этим содержанием:

page 1

...

page 2

...


Отказ от ответственности: Я в основном работаю с Java и не использовали XmlWorker раньше. Таким образом, этот код может иметь значительный потенциал для улучшения.

+0

благодаря вашему подробному отклику. Другое уточнение, поддерживает ли iTextSharp HTML для преобразования PDF на уровне управления? Ex. Текстовое поле, кнопки в HTML, будет ли оно преобразовано в PDF? В моем случае после преобразования элементы управления не отображаются в PDF – Sam

+0

Как упоминалось в моем заявлении об отказе от ответственности, я раньше не использовал 'XmlWorker'. Таким образом, я не являюсь хорошим источником поддержки HTML-поддержки iText и предполагаю, что вам лучше сделать этот явный новый вопрос о стеке. Я знаю, однако, от других вопросов, пролетающих здесь, что его поддержка легко расширяется, ср. 'CustomImageTagProcessor' в ответе @ Скари. Если некоторые элементы еще не реализованы, вы можете просто добавить соответствующую реализацию. – mkl

1

Я не уверен, что понял ваш вопрос правильно.

Если вы спрашиваете, как разобрать HTML в PDF с помощью iTextSharp вот solutin я нашел время назад:

 using (Document document = new Document(size)) 
     { 
      var writer = PdfWriter.GetInstance(document, stream); 

      document.Open(); 
      document.NewPage(); 
      document.Add(new Chunk("")); 

      var tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory(); 
      tagProcessors.RemoveProcessor(HTML.Tag.IMG); 
      tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor()); 

      var charset = Encoding.UTF8; 

      CssFilesImpl cssFiles = new CssFilesImpl(); 
      cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS()); 
      var cssResolver = new StyleAttrCSSResolver(cssFiles); 
      cssResolver.AddCss(srcCssData, "utf-8", true); 

      var hpc = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider())); 
      hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors); 
      var htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, writer)); 
      var pipeline = new CssResolverPipeline(cssResolver, htmlPipeline); 
      var worker = new XMLWorker(pipeline, true); 
      var xmlParser = new XMLParser(true, worker, charset); 

      xmlParser.Parse(new StringReader(srcFileData)); 

      document.Close(); 
     } 

Чтобы получить его работы вам нужно добавить процессор пользовательского изображения для встроенного изображения в HTML вы обеспечить тх выше функции Converte:

public class CustomImageTagProcessor : iTextSharp.tool.xml.html.Image 
{ 
    public override IList<IElement> End(IWorkerContext ctx, Tag tag, IList<IElement> currentContent) 
    { 
     IDictionary<string, string> attributes = tag.Attributes; 
     string src; 
     if (!attributes.TryGetValue(HTML.Attribute.SRC, out src)) 
      return new List<IElement>(1); 

     if (string.IsNullOrEmpty(src)) 
      return new List<IElement>(1); 

     if (src.StartsWith("data:image/", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      // data:[<MIME-type>][;charset=<encoding>][;base64],<data> 
      var base64Data = src.Substring(src.IndexOf(",") + 1); 
      var imagedata = Convert.FromBase64String(base64Data); 
      var image = iTextSharp.text.Image.GetInstance(imagedata); 

      var list = new List<IElement>(); 
      var htmlPipelineContext = GetHtmlPipelineContext(ctx); 
      list.Add(GetCssAppliers().Apply(new Chunk((iTextSharp.text.Image)GetCssAppliers().Apply(image, tag, htmlPipelineContext), 0, 0, true), tag, htmlPipelineContext)); 
      return list; 
     } 
     else 
     { 
      return base.End(ctx, tag, currentContent); 
     } 
    } 
} 
+0

Настоящий EVO API принимает различные параметры, такие как заголовок в виде строки HTML, body/content как строку html и нижний колонтитул в виде строки HTML. Наконец, используя «PrepareRenderPdfPageEvent», он объединяет и создает полный PDF-шаблон. Используя iTextSharp, я проанализировал HTML-строку тела в PDF с помощью XMLParser. Есть ли способ разбора строки заголовка HTML в PDF-заголовке таким же образом? – Sam

+0

@Sam вы можете предоставить мне пример того, что вы добавили в заголовок PDF из заголовка HTML? – Skary

+1

@Skary Приятное использование специального процессора тегов. Он может решить один или два вопроса без ответа на URL-адреса данных и iText (Sharp). – mkl

Смежные вопросы