我正在尝试创建一个程序,多个用户可以共享一个PDF文档,并且每个人都可以使用添加便笺在不改变/修改其他注释的情况下将他的注释放在PDF上。 例如 , 该程序将该PDF文件转移给另一个人进行审查和检查,审阅者将对PDF进行评论并将其发送给审批人。批准者无法编辑评论者评论并进行更改,他可以为其添加新的便签以供他发表评论。
如果我使用PDF上的安全性(~pdfWriter.AllowModifyAnnotations),我将禁用输入新的便签。
有什么解决方案吗?
请帮助我,并提前致谢
答案 0 :(得分:0)
PDF注释对象可以有标记;其中一个标志是只读标志。因此,您只需遍历所有页面上的所有注释并设置其各自的只读标志。
在iText 5.5.x中可以这样做:
PdfReader reader = new PdfReader(resourceStream);
PdfStamper stamper = new PdfStamper(reader, outputStream);
for (int page = 1; page <= reader.getNumberOfPages(); page++)
{
PdfDictionary pageDictionary = reader.getPageN(page);
PdfArray annotationArray = pageDictionary.getAsArray(PdfName.ANNOTS);
if (annotationArray == null)
continue;
for (PdfObject object : annotationArray)
{
PdfObject directObject = PdfReader.getPdfObject(object);
if (directObject instanceof PdfDictionary)
{
PdfDictionary annotationDictionary = (PdfDictionary) directObject;
PdfNumber flagsNumber = annotationDictionary.getAsNumber(PdfName.F);
int flags = flagsNumber != null ? flagsNumber.intValue() : 0;
flags |= PdfAnnotation.FLAGS_READONLY;
annotationDictionary.put(PdfName.F, new PdfNumber(flags));
}
}
}
stamper.close();
(iText 5 MarkAnnotationReadOnly.java)
在iText 7.0.x中可以像这样完成
try ( PdfReader pdfReader = new PdfReader(resourceStream);
PdfWriter pdfWriter = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter) )
{
for (int page = 1; page <= pdfDocument.getNumberOfPages(); page++)
{
PdfPage pdfPage = pdfDocument.getPage(page);
for (PdfAnnotation pdfAnnotation : pdfPage.getAnnotations())
{
pdfAnnotation.setFlag(PdfAnnotation.READ_ONLY);
}
}
}
(iText 7 MarkAnnotationReadOnly.java)
只需要内核iText 7工件。