【发布时间】:2021-05-05 17:38:03
【问题描述】:
我有一个单页 pdf 模板,需要创建一个包含多页的新文档。每个页面都需要作为模板的第一页。然后我需要在每个页面上添加文本。页面被复制,但没有添加文本。
这是我的代码:
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(stream));
PdfDocument cover = new PdfDocument(new PdfReader(templatePath));
//First copy the pages
var totalPages=5;
var coverPage = cover.GetPage(1);
for (int i = 0; i < totalPages; i++)
{
//If i do it to a blank page the text is visible
//pdfDoc.AddNewPage();
//I have tried both methods:
pdfDoc.AddPage(coverPage.CopyTo(pdfDoc));
//cover.CopyPagesTo(1, 1, pdfDoc);
}
//Now i try to add text
Document doc = new Document(pdfDoc);
var font = PdfFontFactory.CreateFont(fontPath);
for (int i = 1; i <= totalPages; i++)
{
//Edited
Rectangle pagesize = pdfDoc.GetPage(i).GetPageSize();
doc.ShowTextAligned(new Paragraph("HEADER").SetFont(font).SetFontSize(22), pagesize.GetLeft(), pagesize.GetBottom(), i, TextAlignment.LEFT, VerticalAlignment.BOTTOM, 0);
//doc.ShowTextAligned(new Paragraph("HEADER").SetFont(font), 100, 700, i, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
}
doc.Close();
cover.Close();
pdfDoc.Close();
我已经尝试过这个选项:
- 画布而不是没有结果的文档(参见下面的代码)
- 如果我使用 AddNewPage() 而不是封面,则文本将添加到空白页(文档和画布方法)。
- 如果我打开并直接写入模板文档,文本是可见的,但大小非常小,文本的位置与 2) 不同
这是 for 指令中的画布代码:
var canvas = new PdfCanvas(pdfDoc.GetPage(i));
canvas.BeginText()
.SetFontAndSize(font, 22) //Edited
.MoveText(100, 700)
.ShowText("HEADER")
.EndText();
//已更新 按照@mkl 提供的解决方案,我改变了添加页面的方式:
var coverPage = cover.GetPage(1);
Rectangle coverSize = coverPage.GetPageSize();
for (int i = 0; i < totalPaginas; i++)
{
//Taken from this example: https://kb.itextpdf.com/home/it7kb/ebooks/itext-7-jump-start-tutorial-for-java/chapter-6-reusing-existing-pdf-documents
PdfPage page = pdfDoc.AddNewPage(PageSize.A4);
PdfCanvas canvas = new PdfCanvas(page);
AffineTransform transformationMatrix = AffineTransform.GetScaleInstance(
page.GetPageSize().GetWidth() / coverSize.GetWidth(),
page.GetPageSize().GetHeight() / coverSize.GetHeight());
canvas.ConcatMatrix(transformationMatrix);
var pageCopy = coverPage.CopyAsFormXObject(pdfDoc);
canvas.AddXObjectAt(pageCopy, 0, 0);
//pdfDoc.AddNewPage();
//pdfDoc.AddPage(coverPage.CopyTo(pdfDoc));
//cover.CopyPagesTo(1, 1, pdfDoc);
}
现在我可以看到添加的文本,但字体大小比我不复制“pdfDoc.AddNewPage()”时要小得多,这是为什么呢?我希望它是正确的字体大小。
【问题讨论】:
-
您复制该原始页面并附加到其内容。这意味着对该内容中图形状态的任何更改(除非被保存图形状态/恢复图形状态信封隐藏)都会影响您的添加。例如,当前变换矩阵可能会以意想不到的方式改变用户空间坐标,或者文本渲染模式可能被设置为不可见。如果您不确定这不会发生,您应该自己包装现有内容。或者将该页面作为 XObject 表单导入并在您的页面上显示该 XObject。
-
关于您的画布代码:您没有设置字体或字体大小。因此,在大小 1 处使用了一些默认值!
-
@mkl,实际上,
ShowText在这种情况下会抛出异常:iText.Kernel.PdfException: 'Font and size must be set before writing any text.' -
@rhens 你是对的......但这意味着,Tito,你显然忘了提到那个代码......
-
谢谢,在我的代码中我设置了字体“.SetFontAndSize(font, 22)”,但为了简化我删除了该行,我不知道它会引发错误