问题描述
我正在使用 iText 7 库生成一个.pdf
文件。我想基本上复制每个页面,最好使用PdfDocumentEvent.END_PAGE
EventHandler。因为我想要每个重复的页面,所以要交替使用不同的页眉/页脚。
我意识到,可以通过首先生成一个实例,然后使用另一个读取器和写入器来复制每个页面并使用某种压模添加页眉/页脚来实现此预期结果。 但是由于不同的要求,我想在生成时解决此问题。但是,我可能无法解决这个问题。
我已经尝试了几件事,但是出现了一些奇怪的行为,我似乎无法自己弄清楚。我将添加一些代码,希望也有助于进一步解释该问题。
这是生成文档的示例代码:
protected void ManipulatePdf(string dest)
{
var writer = new PdfWriter(dest);
var pdfDoc = new PdfDocument(writer);
var doc = new Document(pdfDoc,PageSize.A4);
//Custom EventHandler that adds a page footer
pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE,new CustomEndPageEventHandler(pdfDoc));
//The actual generating of the document
for (int i = 0; i < 3; i++)
{
doc.Add(new Paragraph("Test " + (i + 1)));
if (i != 2)
{
doc.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
}
}
/* I would like to add that in reality it is not known exactly when page-breaks will occur */
doc.Close();
}
下面是我到目前为止添加额外页面的代码。请注意,此代码是不正确的,并且会产生一些奇怪的行为。
尚无用于替换页眉/页脚的代码,仅应将此代码在每页之间插入重复项。
我还将在下面添加具有生成结果的另一张图像,但这不是预期的。
protected class CustomEndPageEventHandler : IEventHandler
{
protected PdfFormXObject placeholder;
protected float side = 20;
protected float x = 300;
protected float y = 25;
protected float space = 4.5f;
protected float descent = 3;
public CustomEndPageEventHandler(PdfDocument pdf) {
placeholder =
new PdfFormXObject(new Rectangle(0,side,side));
}
public void HandleEvent(Event currentEvent)
{
if(!(currentEvent is PdfDocumentEvent docEvent)) return;
var pdf = docEvent.GetDocument();
var page = docEvent.GetPage();
var pageNumber = pdf.GetPageNumber(page);
var pageSize = page.GetPageSize();
var pdfCanvas = new PdfCanvas(
page.GetLastContentStream(),page.GetResources(),pdf);
var canvas = new Canvas(pdfCanvas,pdf,pageSize);
Paragraph p = new Paragraph()
.Add($"{pageNumber}");
canvas.ShowTextAligned(p,x,y,TextAlignment.RIGHT);
pdfCanvas.AddXObject(placeholder,x + space,y - descent);
pdfCanvas.Release();
//Here starts the custom code to insert a duplicate
if ((pageNumber % 2) != 0 && pageNumber < 6)
{
pdf.AddPage(pageNumber + 1,page);
pdf.AddNewPage(pageNumber+2);
}
}
public void WriteTotal(PdfDocument pdf) {
var canvas = new Canvas(placeholder,pdf);
canvas.ShowTextAligned($"/{pdf.GetNumberOfPages()}",descent,TextAlignment.LEFT);
}
}
上面的代码生成something like this。我已经尝试了几种不同的变体,例如,当您删除行pdf.AddNewPage(pageNumber+2);
时,包含Test 2
和Test 3
的页面就会相互重叠。
实际上,我对此很执着,非常想知道是否可以在PdfDocumentEvent.END_PAGE
EventHandler中完成此操作,因此,我很期待看到您能想到的东西。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)