可以使用 iText 或其他一些 API 将 PDF 中的可填写字段定位到坐标吗?

Possible to position fillable field in PDF to a coordinate using iText or some other API?

我有一个将图像嵌入 PDF 的要求。 PDF 大小和图像大小相同(到目前为止,我已经完成了所有工作)。困难的部分是最终用户需要在图像的某些区域上方输入一些文本,这些区域将是预定义的,但进入这些位置的文本不是。我知道可以使用像 iText 这样的工具创建可填写字段。我已经搜索了几天如何使用 iText 来完成设置可填写字段并将任何类型的文本定位到绝对位置,但令人沮丧的是取得了零进展。所以我真的可以利用某人在这个问题上的专业知识。 谢谢

你的问题不是很清楚,如果你做出不同的假设,答案也会不同。

假设 1:假设您有一个 PDF,其中包含一张填满整个页面的图像。您现在想要在预先知道的位置添加文本字段。

在这种情况下,您将使用 PdfStamperaddAnnotation() 方法,就像在 Whosebug 问题 How can I add a new AcroForm field to a PDF?

的答案中所做的那样
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
// create a field for which you define the coordinates using a Rectangle
stamper.addAnnotation(field, 1);
stamper.close();

这里我们使用 addAnnotation() 方法将 field 添加到第 1 页。

现在的问题是:如何创建 field 对象。这很简单。例如,参见 ReadOnlyField 示例:

Rectangle rect = new Rectangle(36, 720, 144, 806);
TextField tf = new TextField(stamper.getWriter(), rect, "text");
tf.setOptions(TextField.MULTILINE);
PdfFormField field = tf.getTextField();

注意我用左下角坐标(36, 720)和右上角坐标(144, 806)创建了一个Rectangle对象。我使用 stamperPdWriter 实例创建了一个 TextField,即 rect,我将该字段命名为 text。假设您希望将输入的文本换行,我将文本字段设为 MULTILINE 字段。然后我从 TextField 对象获得一个 PdfFormField 实例。

假设 2: 您正在从头开始创建 PDF 文档,您在其中创建了一个页面,并向该页面添加了与该页面大小相同的图像。现在您只想添加表单域来添加文本。 iText 官方网站上有许多关于如何定义和添加文本字段的示例:MultiLineField, TextFields, GenericFields, CreateFormInTable,还有更多。

您还会在问题 How to add a hidden text field? 中找到一个很好的例子。问题中的示例显示了如何添加可见文本字段;答案显示了如何隐藏它。

在这个例子中,xy是左下角的坐标,而wh是宽和高字段:

TextField field = new TextField(writer, new Rectangle(x, y - h, x + w, y), name);
field.BackgroundColor = new BaseColor(bgcolor[0], bgcolor[1], bgcolor[2]);
field.BorderColor = new BaseColor(
    bordercolor[0], bordercolor[1], bordercolor[2]);
field.BorderWidth = border;
field.BorderStyle = PdfBorderDictionary.STYLE_SOLID;
field.Text = text;
writer.AddAnnotation(field.GetTextField());

这是一个 iTextSharp 示例(用 C# 编写),但很容易将其移植到 Java。

最后:也许你已经知道了这一切。也许你只是想知道所有这些坐标是关于什么的。这个问题的答案也可以在iText官方网站找到:

我回答中的几乎所有链接都引用了在回答 Whosebug 上的先前问题时编写的示例和答案。请不要说我已经搜索了几天如何使用 iText 来完成设置可填写字段并将任何类型的文本定位到绝对位置,因为人们很难相信谁知道所有的答案都可以在official iText web site上找到。您的老板可能想知道您一直在搜索哪些网站。