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

时间:2017-12-19 15:23:58

标签: java pdf pdf-generation pdfbox

我有一个包含表单字段的现有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");

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

但我需要对齐和第二个字段的字体(这不是表格字段btw。)。

如何确定此表单字段的哪个对齐方式(左侧,中间,右侧)和哪种字体(我需要PDType1Font及其大小)? STH。比如font = annotation.getFont()alignment = annotation.getAlignment()都不存在。

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

    1. 17:编辑
  1. 我需要的字体是:

    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 个答案:

答案 0 :(得分:4)

要获取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