【问题标题】:iText 7 C# creating a pdf from a template and adding text to itiText 7 C# 从模板创建 pdf 并向其中添加文本
【发布时间】: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();

我已经尝试过这个选项:

  1. 画布而不是没有结果的文档(参见下面的代码)
  2. 如果我使用 AddNewPage() 而不是封面,则文本将添加到空白页(文档和画布方法)。
  3. 如果我打开并直接写入模板文档,文本是可见的,但大小非常小,文本的位置与 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)”,但为了简化我删除了该行,我不知道它会引发错误

标签: c# itext7


【解决方案1】:

您的代码在我的测试中有效。可能(100,700) 在可视页面区域之外,如果您的模板页面的左下角不在(0,0),通常会出现这种情况。

这应该把文字放在左下角:

Rectangle pagesize = pdfDoc.GetPage(i).GetPageSize();
doc.ShowTextAligned(new Paragraph("HEADER"), pagesize.GetLeft(),
    pagesize.GetBottom(), i, TextAlignment.LEFT, VerticalAlignment.BOTTOM, 0);

如果可行,您可以从pagesize 矩形计算文本的适当位置。

【讨论】:

  • 谢谢,但没用...我猜它是关于@mkl 在他关于坐标的回答中所说的
【解决方案2】:

我在底部的问题中更新了为什么文本不出现的解决方案。 坐标不匹配且尺寸如此小的原因是源模板 pdf 以非常高的 px/inch 导出以进行高级打印。将其降低到 72ppp 是解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多