【问题标题】:how to make pdf annotation as read only using itext?如何使用itext将pdf注释设为只读?
【发布时间】:2016-09-13 12:04:30
【问题描述】:

我正在尝试制作一个程序,多个用户可以共享一个 PDF 文档,并且每个人都可以使用添加便笺将他的 cmets 放在 PDF 上,而无需更改/修改其他笔记。 例如 , 程序将该PDF文件传送给另一个人进行审查和检查,审查者将他的cmets放在PDF上并将其发送给审批人。审批者根本无法编辑审阅者 cmets 和更改它,他可以为他的 cmets 添加新的便笺。

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

有什么解决办法吗?

请帮助我并提前感谢

【问题讨论】:

  • 您的用户使用哪些程序?我问是因为如果有适当的程序,仍然可以编辑只读注释。
  • 我正在使用 JSP(java 服务器页面),用户将使用他的 cmets 上传 PDF,系统会将文件转发给被分配的人(比如 B 人)。 B 人无法编辑以前用户的所有 prevoius cmets。他只能将他的评论添加到文件中,然后再次上传到系统。我想知道如何让 cmets 仅在其他人打开 PDF 文件时才能读取。他们只能阅读内容并添加注释。
  • B 不能编辑以前用户的所有以前的 cmets。他只能将他的评论添加到文件中并再次将其上传到系统。 - B 使用哪个程序不能编辑以前的 cmets 但能够添加新的?
  • "B 使用哪个程序不能编辑以前的 cmets 但能够添加新的 cmets?" ,是普通的PDF程序。 B 人将通过电子邮件收到 PDF,他将阅读、检查并将他的 cmets 放在他收到的 PDF 上。他将使用 acrobat reader 或 PDF Professional 或任何打开 PDF 文件的工具正常打开 PDF 文件。当他使用 acrobat reader 打开 PDF 时,他将无法调整其他人的笔记。
  • 使用 acrobat reader 或 PDF Professional 或任何打开 PDF 文件的工具 - 一些此类程序允许忽略注释的只读属性。这就是我问的原因。 当他使用 acrobat reader 打开 PDF 时,他将无法调整其他人的笔记 - 嗯,好的,如果这些笔记不能在 Adob​​e Acrobat Reader(非专业版)中更改就足够了。

标签: java pdf pdf-generation itext itextpdf


【解决方案1】:

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

【讨论】:

  • 如果这对你有用,你可能想接受答案(点击左上角的勾号)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2023-04-10
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多