当前位置: 首页 > 知识库问答 >
问题:

Apache PDFBox:从PDAnnotationWidget或PDTextField获取对齐和字体

须志新
2023-03-14

我有一个带有表单字段的现有pdf文件,可以由用户填写。此表单字段具有创建pdf文件时定义的字体和文本对齐方式。

我使用Apache PDFBox在pdf中查找表单字段:

PDDocument document = PDDocument.load(pdfFile);
PDAcroForm form = document.getDocumentCatalog().getAcroForm();

PDTextField textField = (PDTextField)form.getField("anyFieldName");
if (textField == null) {
  textField = (PDTextField)form.getField("fieldsContainer.anyFieldName");
}

List<PDAnnotationWidget> widgets = textField.getWidgets();
PDAnnotationWidget annotation = null;
if (widgets != null && !widgets.isEmpty()) {
  annotation = widgets.get(0);

  /* font and alignment needed here */
}

如果我将表单字段的内容设置为

textField.setValue("This is the text");

然后表单字段中的文本具有与此字段预定义的相同的字体和对齐方式。

但我需要第二个字段的对齐方式和字体(顺便说一句,这不是表单字段)。

如何找出该表单字段定义了哪种对齐方式(左、中、右)和哪种字体(我需要一个PDType1Font及其大小)?Sth. likefon=annotation.getFont()的对齐方式=annotation.get的对齐方式(),两者都不存在。

如何获取字体和对齐方式?

我需要的字体是这样的:

PDPageContentStream content = new PDPageContentStream(document, page, AppendMode.APPEND, false);
content.setFont(font, size); /* Here I need font and size from the text field above */
content.beginText();
content.showText("My very nice text");
content.endText();

我需要setFont()调用的字体。

共有1个答案

司寇阳朔
2023-03-14

要获取PDFont,请执行以下操作:

String defaultAppearance = textField.getDefaultAppearance(); // usually like "/Helv 12 Tf 0 0 1 rg"
Pattern p = Pattern.compile("\\/(\\w+)\\s(\\d+)\\s.*");
Matcher m = p.matcher(defaultAppearance);
if (!m.find() || m.groupCount() < 2)
{
    // oh-oh
}
String fontName = m.group(1);
int fontSize = Integer.parseInt(m.group(2));
PDAnnotationWidget widget = textField.getWidgets().get(0);
PDResources res = widget.getAppearance().getNormalAppearance().getAppearanceStream().getResources();
PDFont fieldFont = res.getFont(COSName.getPDFName(fontName));
if (fieldFont == null)
{
    fieldFont = acroForm.getDefaultResources().getFont(COSName.getPDFName(fontName));
}
System.out.println(fieldFont + "; " + fontSize);

这将从字段的第一个小部件的资源字典的资源字典中检索字体对象。如果字体不存在,则检查默认资源字典。请注意,没有空检查,您需要添加它们。在代码的末尾,您将获得一个PDFont对象和一个数字。

重新对齐,调用getQ(),另请参见此处。

 类似资料:
  • 我正在使用ApachePDFBox(版本:2.0.8)从我的。jspx页面。 在我的. jspx页面表单中,有很多字段,所以我决定将所有字段排列为2列布局。所以,我需要建议使用PDFbox来实现布局。 //我用来生成PDF的示例代码片段如下。 我需要以粗体字体和数值(分别为Rajeev、BNG、KAR、IND)显示标签(即姓名、地址、州和国家),作为普通字体 为了获得标签的粗体字体,我尝试了如下所

  • 本章介绍如何使用Java在Word文档中应用不同的字体样式和对齐方式。 通常,字体样式包含:字体大小,类型,粗体,斜体和下划线。 对齐分为左,中,右和对齐。 字体样式 以下代码用于设置不同的字体样式 - import java.io.File; import java.io.FileOutputStream; import org.apache.poi.xwpf.usermodel.Vertica

  • 问题内容: 我允许用户通过拖放和其他方法将图像加载到页面中。放置图像时,我用来转换为对象URL以显示图像。我没有撤消该URL,因为我确实重复使用了它。 因此,当需要创建一个对象时,我可以允许他们上传其中包含其中一个图像的表单,是否可以通过某种方式将该对象URL反向转换为a ,然后可以将其附加到a 宾语? 问题答案: 正如gengkev在上面的评论中所暗示的那样,似乎最好/唯一的方法是使用异步xhr

  • 我允许用户通过拖动将图像加载到页面中 那么,当需要创建一个对象时,我可以允许他们上传一个包含其中一个图像的表单,有没有什么方法可以将该对象URL反转回或,然后将其附加到对象?

  • 问题内容: 我得到的输出为 控制器中的日期Mon Dec 31 IST 2012 请提出一种以格式输出日期的方法。需要以日期格式而不是字符串形式输出,以便将输出存储在mysql db的字段中 问题答案: 声明后 您有一个对象, 可以将其按原样存储在mysql DB中 (列类型:datetime)。 但是,在打印时,它默认为实现。我认为您希望获得类似Date @的输出,但是toString以用户可读

  • 我正在做一个项目,在那里用户可以写其他用户的邮件。邮件类当前如下所示: 现在,问题是,我需要将所有邮件保存到. yml用户数据文件中。对我来说,最简单的方法是首先将每封邮件转换为字符串,然后将所有邮件保存到