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

时间:2016-05-17 11:47:53

标签: java pdf pdf-generation itext itextpdf

我正在尝试创建一个程序,多个用户可以共享一个PDF文档,并且每个人都可以使用添加便笺在不改变/修改其他注释的情况下将他的注释放在PDF上。 例如 , 该程序将该PDF文件转移给另一个人进行审查和检查,审阅者将对PDF进行评论并将其发送给审批人。批准者无法编辑评论者评论并进行更改,他可以为其添加新的便签以供他发表评论。

如果我使用PDF上的安全性(~pdfWriter.AllowModifyAnnotations),我将禁用输入新的便签。

有什么解决方案吗?

请帮助我,并提前致谢

1 个答案:

答案 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工件。