【问题标题】:Apache PDFBox: Get alignment and font from a PDAnnotationWidget or PDTextFieldApache PDFBox:从 ​​PDAnnotationWidget 或 PDTextField 获取对齐方式和字体
【发布时间】:2018-06-02 01:47:10
【问题描述】:

我有一个包含表单域的现有 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 及其大小)?某事。像 font = annotation.getFont()alignment = annotation.getAlignment() 两者都不存在。

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

    1. 17:编辑

我需要的字体是这样的:

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() 调用的字体。

【问题讨论】:

  • 重新对齐,见stackoverflow.com/questions/47767319/…或调用getQ()..
  • re 字体,最简单的方法是调用 getDefaultAppearance() 并调用新字段的设置器。
  • getQ() 工作,谢谢。我的问题的对齐部分现在已经解决了。但是对于字体我仍然需要一个解决方案。在这里复制外观是不可能的,因为我会覆盖目标字段的其他属性。
  • 我不建议复制外观,只复制字段的默认外观。例如,如果是“/Helv 0 Tf 0 g”,那么字体部分就是“/Helv 0 Tf”(“0 g”是颜色)。字体要么已经存在于 /AcroForm/DR 部分(acroform 默认资源)中,要么您必须将其添加到您的字段的外观 stream 的资源中(更棘手 - 询问是否需要, 如果可能,请附上 PDF)。
  • 谢谢,但我还是不知道怎么设置字体。我使用PDPageContentStream。在我的问题中,我添加了一个我想使用字体的示例。

标签: java pdf pdf-generation pdfbox


【解决方案1】:

要获取 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(),另见here

【讨论】:

  • 就可以了。非常感谢。
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 2021-12-16
  • 2016-11-17
  • 2014-05-31
  • 1970-01-01
  • 2018-03-23
  • 2014-01-18
  • 2012-08-22
相关资源
最近更新 更多