我是Itext的新手,并使用html字符串创建pdf。现在我需要在每个页面上添加页脚和页眉。我有一个html字符串,我想添加为页眉和页脚。
我浏览了java中的许多帖子和文档,但由于没有人使用html字符串作为页脚或标题,因此会让人感到困惑。
更新添加代码
这是我正在使用的代码。现在我可以添加页眉和页脚,但html呈现为字符串而不是html UI。
public class TestPDF
{
public static void GeneratePDF(string html)
{
try
{
Guid random_guid;
random_guid = Guid.NewGuid();
string fileName = random_guid.ToString() + ".pdf";
string filename_with_folder = @"Temp\" + fileName;
string DEST = System.IO.Path.Combine(HttpContext.Current.Request.PhysicalApplicationPath, filename_with_folder);
new TestPDF().CreatePdf(DEST, html);
}
catch (Exception ex)
{
throw;
}
}
public void CreatePdf(String dest, string html)
{
//Initialize PDF document
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
string header = "Header HTmL HERE";
Header headerHandler = new Header(header);
PageXofY footerHandler = new PageXofY(pdf);
//Assign event-handlers
pdf.AddEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, footerHandler);
// Initialize document
Document document = new Document(pdf);
Paragraph p = new Paragraph(html);
document.Add(p);
document.Close();
}
}
//Header event handler
public class Header : IEventHandler
{
string header;
public Header(string header)
{
this.header = header;
}
public void HandleEvent(Event e)
{
//Retrieve document and
PdfDocumentEvent docEvent = (PdfDocumentEvent)e;
PdfDocument pdf = docEvent.GetDocument();
PdfPage page = docEvent.GetPage();
Rectangle pageSize = page.GetPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(
page.GetLastContentStream(), page.GetResources(), pdf);
Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
canvas.SetFontSize(18f);
//Write text at position
canvas.ShowTextAligned(header,
pageSize.GetWidth() / 2,
pageSize.GetTop() - 30, TextAlignment.CENTER);
}
}
//Footer handler
public class PageXofY : IEventHandler
{
public PdfFormXObject placeholder;
public float side = 20;
public float x = 300;
public float y = 25;
public float space = 4.5f;
public float descent = 3;
public PageXofY(PdfDocument pdf)
{
placeholder =
new PdfFormXObject(new Rectangle(0, 0, side, side));
}
public void HandleEvent(Event e)
{
PdfDocumentEvent docEvent = (PdfDocumentEvent)e;
PdfDocument pdf = docEvent.GetDocument();
PdfPage page = docEvent.GetPage();
int pageNumber = pdf.GetPageNumber(page);
Rectangle pageSize = page.GetPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(
page.GetLastContentStream(), page.GetResources(), pdf);
Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
//Paragraph p = new Paragraph()
// .Add("Page ").Add(pageNumber.ToString()).Add(" of");
Paragraph p = new Paragraph()
.Add("Footer html will here");
canvas.ShowTextAligned(p, x, y, TextAlignment.RIGHT);
pdfCanvas.AddXObject(placeholder, x + space, y - descent);
pdfCanvas.Release();
}
public void writeTotal(PdfDocument pdf)
{
Canvas canvas = new Canvas(placeholder, pdf);
canvas.ShowTextAligned(pdf.GetNumberOfPages().ToString(),
0, descent, TextAlignment.LEFT);
}
}
这里不是itext的专家,但是我发现this tutorial就如何使用c#库为每个页面添加标题。
基本上,您创建一个事件处理程序类以将标头添加到页面并设置pdf对象以在相应的事件(页面开始或页面结束)上使用该事件处理程序。事件处理程序创建一个新的画布对象,填充它想要在页面上显示的内容,对其进行定位,然后将其呈现给页面。如果您的标题看起来与顶部或底部的内容重叠,则可能需要调整主要内容的页边距以为页眉和页脚腾出空间。
我不确定如何直接将html内容放入画布,但由于它不是页面内容的一部分,也许你可以放弃使用静态内容。
Bruno Lowagie更新:
如果使用@page
规则在HTML中定义页眉/页脚,那么您只需在this tutorial中描述的HTML的CSS中定义页眉/页脚中需要的内容。
如果页眉/页脚稍微复杂一些,那么您需要创建一个事件处理程序类。 jump-start tutorial解释了如何将Paragraph
等对象添加到Canvas
对象中。它不包括HTML。但是,PDF to HTML tutorial解释了如何将HTML转换为iText对象(例如,滚动到该页面的底部)。
通过结合本答案的不同方面,您将能够解决问题。如果您已尝试过但未成功,请告诉我们您尝试过的内容,我们可以为您提供进一步的帮助。