【发布时间】:2018-05-21 09:11:21
【问题描述】:
我正在尝试按照https://developers.itextpdf.com/examples/page-events/clone-page-events-headers-and-footers#2656-variableheader.java 中给出的示例创建带有可变标题的 PDF 文档。但是事件没有正确触发。这是我测试过的代码 -
class Program
{
public static String DEST = "test.pdf";
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
manipulatePdf(DEST);
}
public static List<int> getFactors(int n)
{
List<int> factors = new List<int>();
for (int i = 2; i <= n; i++)
{
while (n % i == 0)
{
factors.Add(i);
n /= i;
}
}
return factors;
}
protected static void manipulatePdf(String dest)
{
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
Document doc = new Document(pdfDoc, PageSize.A4, true);
VariableHeaderEventHandler handler = new VariableHeaderEventHandler();
pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE, handler);
List<int> factors;
for (int i = 2; i < 4; i++)
{
factors = getFactors(i);
if (factors.Count == 1)
{
doc.Add(new Paragraph("This is a prime number!"));
}
foreach (int factor in factors)
{
doc.Add(new Paragraph("Factor: " + factor));
}
handler.setHeader(String.Format("THE FACTORS OF {0}", i));
if (300 != i)
{
doc.Add(new AreaBreak());
}
}
doc.Close();
}
protected class VariableHeaderEventHandler : IEventHandler
{
protected String header;
public void setHeader(String header)
{
this.header = header;
}
public void HandleEvent(Event @event)
{
PdfDocumentEvent documentEvent = (PdfDocumentEvent)@event;
try
{
new PdfCanvas(documentEvent.GetPage())
.BeginText()
.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.HELVETICA), 12)
.MoveText(450, 806)
.ShowText(header)
.EndText()
.Stroke();
}
catch (IOException e)
{
}
}
}
}
如果我运行此代码,所有页面都将标题显示为“3 的因素”。但他们应该在第一页显示“2 的因素”,在第二页显示“3 的因素”,在第三页显示“4 的因素”。我不知道如何解决它。有什么建议吗?
【问题讨论】:
-
是的,itext 7 页面事件可能会有一些延迟。您可能需要像this answer 这样的解决方法,它是关于最后一页上的特殊页脚。
-
我已经检查了那个答案。但是我需要每个页面都有唯一的标题,由于页面事件延迟而无法正常工作。