如何在固定位置向现有pdf添加文本?

时间:2013-01-30 08:31:58

标签: pdf itext

我必须在现有A4 pdf的固定位置插入一个数字。 我已尝试以下作为第一个测试,但这不起作用(不添加文本)。 出了什么问题? 这是我的代码:

byte[] omrMarks = omrFrame.getOmrImage();
Jpeg img = new Jpeg(omrMarks);
PdfImportedPage page = stamper.getImportedPage(source, pageNum);
PdfContentByte pageContent = stamper.getOverContent(pageNum);

pageContent.addImage(
  img, img.getWidth(), 0, 0, img.getHeight(), 15f, (page.getHeight() - 312));
pageContent.moveTo(10, 200);
pageContent.beginText();
pageContent.setLiteral("Test");
pageContent.endText();

1 个答案:

答案 0 :(得分:3)

这个问题存在很多问题。

这当然是错的:

pageContent.moveTo(10, 200);
pageContent.beginText();
pageContent.setLiteral("Test");
pageContent.endText();
  • moveTo()方法没有意义;它对文本状态对象没有影响。
  • 文本状态对象是非法的,因为没有setFontAndSize()(这很奇怪,这不会引发RuntimeException,你使用的是过时的iText版本吗?)
  • setLiteral()方法只应用于向内容流添加一些文字PDF语法。

例如:

pageContent.setLiteral("\n100 100 m\n100 200 l\nS\n");
只有在您了解以下PDF语法描述一行时才应使用

100 100 m
100 200 l
S

从您的问题中可以清楚地看出,您不了解PDF语法,因此不应使用这些方法。相反,你应该使用方便的方法,如showTextAligned()方法,它隐藏了PDF的复杂性,并为您节省了几行。

也许您有充分的理由选择“艰难的方式”,但在这种情况下,您应该阅读文档,否则您将继续使用setLiteral()而不是showText()等方法,moveTo()代替moveText(),等等,导致您不希望雇主看到的代码。

此外,您假设页面左下角的坐标为(0,0)。对于大多数在野外发现的PDF文档而言,这可能是正确的,但并非所有PDF文档都适用。 MediaBox不一定是[0 0 595 842],也可以是[595 842 1190 1684]。而且:如果有CropBox怎么办?也许你正在添加不可见的内容,因为它被裁掉了......