我正在尝试制作一个程序,让多个用户可以共享一个PDF文档,每个用户都可以使用添加便签在PDF上发表自己的评论,而无需更改/修改其他注释。例如该程序将把该PDF文件传输给另一个人进行审查和检查,审查人员将在PDF上发表意见并将其发送给审批人。审批者根本无法编辑和更改审阅者的评论,他可以为自己的评论添加新的便笺。
如果我在PDF上使用安全性(~PdfWriter.AllowModifyAnnotations),我将禁止输入新的便笺。
有什么解决办法吗?
请帮助我并提前感谢
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工件。