使用 Apache PDFBox 访问 PDF 字段的 COSArray

Accessing a COSArray for PDF fields with Apache PDFBox

我正在尝试访问 PDF 文件中的所有表单域 - 所以我可以使用代码来填写它们 - 这是我所获得的:

PDDocumentCatalog pdCatalog = pdf.getDocumentCatalog();
PDAcroForm pdAcroForm = pdCatalog.getAcroForm();

List<PDField> fieldList = pdAcroForm.getFields(); // fieldList.size() = 1

PDField field = fieldList.get(0);

COSDictionary dictionary = field.getCOSObject();
System.out.println("dictionary size = " + dictionary.size());

// my attempt to iterate through fields
for ( Map.Entry<COSName,COSBase> entry : dictionary.entrySet() )
{
    COSName key = entry.getKey();
    COSBase val = entry.getValue();

    if ( val instanceof COSArray )
    {
        System.out.println("COSArray size = " + ((COSArray)val).size());
    }
    System.out.println("key = " + key);
    System.out.println("val = " + val);
}

输出为:

dictionary size = 3
COSArray size = 2
key = COSName{Kids}
val = COSArray{[COSObject{110, 0}, COSObject{108, 0}]}
key = COSName{T}
val = COSString{form1[0]}
key = COSName{V}
val = COSString{}

有谁知道如何访问 COSArray 中的两个 COSObject?我也不知道符号 COSObject{x, y} 是什么意思,也找不到任何相关文档。如果那些是字典或数组值元素,我也想知道如何访问它们。

您使用 get(index) 获取对象以获取 COSObject(间接引用)或使用 getObject(index) 获取由 COSObject 引用的取消引用对象。

COSObject{110, 0}是对象编号和世代编号(通常为0)。使用 NOTEPAD++ 打开您的 PDF 文件并查找“110 0 obj”以找到它,或查找“110 0 R”以查看谁引用了该对象。