微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

iText 7 C# 从模板创建 pdf 并向其添加文本

如何解决iText 7 C# 从模板创建 pdf 并向其添加文本

我有一个一页的 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,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);
    //pdfDoc.AddNewPage();
    //pdfDoc.AddPage(coverPage.copyTo(pdfDoc));
    //cover.copyPagesTo(1,pdfDoc);
}

现在我可以看到添加的文本,但是字体大小比我做的“pdfDoc.AddNewPage()”要小得多,这是为什么?我希望它是正确的字体大小。

解决方法

您的代码在我的测试中有效。可能 (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 矩形开始计算文本的适当位置。

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。