我需要知道是否有可能为 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"));
}
}
使用以下两个小助手类。
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;
}
对于更复杂的 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);
}
}
}
}
顺便说一句,上面的测试生成了一个包含以下内容的 PDF:
...
...
免责声明:我主要使用 Java,之前没有使用过 XmlWorker。因此,此代码可能具有相当大的改进潜力。