java PDFBox:删除签名字段和小部件
java PDFBox : remove Signature field and widget
我正在尝试从 PDF 文档及其关联的小部件 (PDAnnotationWidget) 中删除现有的签名字段 (PDSignatureField)
我正在使用以下答案提供的代码:
我实际上能够检索字段和关联的小部件,并将它们从 PDDocument 中删除(从 AcroForm 中删除字段,从页面注释中删除小部件)
由于我的进程需要使用增量保存,我更新了acroFrom和页面COSObjects如下:
acroForm.getCOSObject().setNeedToBeUpdated(true);
page.getCOSObject().setNeedToBeUpdated(true);
但保存后,文档似乎仍然包含已删除的小部件...即使该字段似乎已被删除。有人可以帮我解决这个问题吗?这是个好方法吗?
编辑:
这是我的问题:
try (PDDocument document = PDDocument.load(file)) {
for (int i = 0; i < document.getNumberOfPages(); i++) {
List<PDAnnotation> annotations = document.getPage(i).getAnnotations();
}
}
这里,“注释”列表returns不是空集,虽然我确实在增量保存之前删除了注释。
谢谢
感谢您的回复。我设法解决了我的问题,正如 mkl 所说,我需要创建一个更改对象的路径。
这就是我所做的:
COSDictionary dictionary = document.getDocumentCatalog().getCOSObject();
dictionary.setNeedToBeUpdated(true);
dictionary = (COSDictionary) dictionary.getDictionaryObject(COSName.ACRO_FORM);
dictionary.setNeedToBeUpdated(true);
COSArray array = (COSArray) dictionary.getDictionaryObject(COSName.FIELDS);
array.setNeedToBeUpdated(true);
// for each changed page
COSDictionary item = page.getCOSObject();
while (item.containsKey(COSName.PARENT)) {
COSBase parent = item.getDictionaryObject(COSName.PARENT);
if (parent instanceof COSDictionary) {
item = (COSDictionary) parent;
item.setNeedToBeUpdated(true);
}
}
page.getCOSObject().setNeedToBeUpdated(true);
我正在尝试从 PDF 文档及其关联的小部件 (PDAnnotationWidget) 中删除现有的签名字段 (PDSignatureField)
我正在使用以下答案提供的代码:
我实际上能够检索字段和关联的小部件,并将它们从 PDDocument 中删除(从 AcroForm 中删除字段,从页面注释中删除小部件)
由于我的进程需要使用增量保存,我更新了acroFrom和页面COSObjects如下:
acroForm.getCOSObject().setNeedToBeUpdated(true);
page.getCOSObject().setNeedToBeUpdated(true);
但保存后,文档似乎仍然包含已删除的小部件...即使该字段似乎已被删除。有人可以帮我解决这个问题吗?这是个好方法吗?
编辑:
这是我的问题:
try (PDDocument document = PDDocument.load(file)) {
for (int i = 0; i < document.getNumberOfPages(); i++) {
List<PDAnnotation> annotations = document.getPage(i).getAnnotations();
}
}
这里,“注释”列表returns不是空集,虽然我确实在增量保存之前删除了注释。
谢谢
感谢您的回复。我设法解决了我的问题,正如 mkl 所说,我需要创建一个更改对象的路径。
这就是我所做的:
COSDictionary dictionary = document.getDocumentCatalog().getCOSObject();
dictionary.setNeedToBeUpdated(true);
dictionary = (COSDictionary) dictionary.getDictionaryObject(COSName.ACRO_FORM);
dictionary.setNeedToBeUpdated(true);
COSArray array = (COSArray) dictionary.getDictionaryObject(COSName.FIELDS);
array.setNeedToBeUpdated(true);
// for each changed page
COSDictionary item = page.getCOSObject();
while (item.containsKey(COSName.PARENT)) {
COSBase parent = item.getDictionaryObject(COSName.PARENT);
if (parent instanceof COSDictionary) {
item = (COSDictionary) parent;
item.setNeedToBeUpdated(true);
}
}
page.getCOSObject().setNeedToBeUpdated(true);