java 如何防止表单中的文本发生移位?

6ie5vjzr  于 2023-11-15  发布在  Java
关注(0)|答案(2)|浏览(113)

在iText 7中,您可以创建acro表单,如https://itextpdf.com/en/resources/books/itext-7-jump-start-tutorial-java/chapter-4-making-pdf-interactive所述。
您还可以为字段提供一个值,用户可以编辑该值。
但是当你这样做的时候,当用户输入那个字段的时候,文本的位置就移动了。当用户完成编辑的时候,文本不会移回原来的位置。

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
Document document = new Document(pdfDoc);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
document.add(new Paragraph("Form").setTextAlignment(TextAlignment.CENTER).setFontSize(16));
document.add(new Paragraph("Full Name").setFontSize(12));

Rectangle rect = new Rectangle(99, 753.5F, 425, 15);
// I provide a default value of 
PdfTextFormField nameField = PdfTextFormField.createText(pdfDoc, rect, "name", "My default name");
form.addField(nameField);

// I draw some shapes to make the problem more obvious.
float offset = 65;
rect.setX(rect.getX() - offset);
rect.setWidth(rect.getWidth() + offset);
new PdfCanvas(pdfDoc.getLastPage())
    .rectangle(rect)
    .setStrokeColor(ColorConstants.BLACK)
    .setLineWidth(0.5F)
    .moveTo(rect.getX(), rect.getY() + 4)
    .lineTo(rect.getX() + rect.getWidth(), rect.getY() + 4)
    .stroke();

pdfDoc.close();

Desktop.getDesktop().open(new File(DEST));

字符串


在上图中,您可以看到文本被整齐地排列。


在上图中,用户已经开始编辑字段。它不再整齐对齐


在上图中,用户已完成编辑。文本未恢复到原始位置。
在这个例子中,效果是非常小的。但是根据字段的尺寸,这可能是非常戏剧性的。特别是在表中可能会不和谐。
有没有解决办法?

t9eec4r0

t9eec4r01#

Itext使用动态字体大小,需要静态高度,使字段更高或更长。在查看器中工作良好,但在用户编辑时不工作。
x1c 0d1x的数据
有趣的是,在iText的博客中注意到
在iText 7中。使用替换字体的特定工作流程在iText 7中不再可用,因为1.7和2.0的PDF规范实际上将字段的视觉表示限制为单一样式。如第8章-PDF 1.7的交互功能有关表单字段的参考说明:
字段12.7.3.3显示(字体、大小、颜色等),如DA(默认外观)字符串所指定。
因为你不知道用户系统编辑器默认的字体样式是什么,所以你需要在一个宽大的高度上为任何替换留出足够的空间,不要有任何下划线。
由于某些PDF查看器需要使用表单和正文文本,您甚至可能会看到由于不同外观放置而导致的双重文本,请查看左侧的iText定位。可以说是阅读器位移,但主要问题是右侧的规范化文本看起来更低。


8fsztsew

8fsztsew2#

不知道你是否还需要这个答案,但如果你需要:

PdfAcroForm.SetNeedAppearances(true);

字符串
这应该可以解决文本移位问题。

相关问题