带有 HTML 字符串的 iTextSharp PDF 标题 C#

1 c# itext

我正在尝试使用 iTextSharp 生成包含客户信息、页眉和页脚等的 PDF 报告。所有这些报告均已使用 EVO API 生成。作为迁移过程的一部分,我们计划使用 iTextSharp API 生成这些报告。

我需要知道是否有可能向 iTextSharp PDF 标头提供准备渲染 HTML 字符串(现有 EVO 设计接受 HTML 字符串并构建 PDF),而不是使用 PageEvents 来使用 PDFPTable 和 PDFPCell 进行设计(因为报告数量为巨大并避免返工)

mkl*_*mkl 5

我需要知道是否有可能向 iTextSharp PDF 标头提供准备渲染 HTML 字符串(现有 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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下两个小助手类。

HtmlPageEventHelper是一个页面事件监听器,将给定的 html 片段绘制到页面标题中。显然,它可以替代或附加地写入页脚,只需使用适当的列坐标

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;
}
Run Code Online (Sandbox Code Playgroud)

对于更复杂的 HTML 片段,您可能需要将调用替换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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,上面的测试生成了一个包含以下内容的 PDF:

第 1 页

...

第2页

...


免责声明:我主要使用 Java,XmlWorker以前没有使用过。因此,该代码可能具有相当大的改进潜力。