如何使用itext将pdf注释设置为只读



我正在尝试制作一个程序,让多个用户可以共享一个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工件。

最新更新