2016-05-17 5 views
-2

Ich versuche, ein Programm zu erstellen, dass mehrere Benutzer ein PDF-Dokument teilen können, und jeder kann seine Kommentare auf die PDF-Datei mit hinzufügen Haftnotiz, ohne andere Notizen ändern/ändern. Zum Beispiel, Das Programm wird diese PDF-Datei an eine andere Person zur Überprüfung und Überprüfung übertragen, der Prüfer wird seine Kommentare auf die PDF-Datei setzen und an die genehmigende Person senden. Der Genehmigende kann die Kommentare des Rezensenten nicht bearbeiten und ändert sie auch nicht. Er kann eine neue Notiz für seine Kommentare hinzufügen.wie PDF-Annotation als nur lesen mit itext machen?

Wenn ich die Sicherheit auf der PDF (~ PdfWriter.AllowModifyAnnotations) verwende, werde ich die Eingabe neuer Haftnotiz deaktivieren.

Gibt es eine Lösung dafür?

bitte helfen Sie mir und Dank im Voraus

+0

Welche Programme verwenden Ihre Benutzer? Ich frage, da mit dem entsprechenden Programm eine schreibgeschützte Annotation trotzdem editiert werden kann. – mkl

+0

Ich benutze JSP (Java-Server-Seite), ein Benutzer wird PDF mit seinen Kommentaren hochladen und das System wird die Datei an die betreffende Person (sagen Person B). Person B kann nicht alle vorherigen Kommentare von vorherigen Benutzern bearbeiten. Er kann seinen Kommentar nur zur Datei hinzufügen und sie erneut auf das System hochladen. Ich möchte wissen, wie ich die Kommentare nur lesen kann, wenn andere Leute die PDF-Datei öffnen. Sie können den Inhalt lesen und nur Notizen hinzufügen. –

+0

* Person B kann nicht alle vorherigen Kommentare von vorherigen Benutzern bearbeiten. er kann seinen Kommentar nur der Datei hinzufügen und sie erneut auf das System hochladen. * - Mit welchem ​​Programm soll Person B vorherige Kommentare nicht bearbeiten können, aber neue hinzufügen können? – mkl

Antwort

0

PDF Annotation Objekte können Flags haben; Eines dieser Flags ist ein Nur-Lese-Flag. Daher müssen Sie nur alle Anmerkungen auf allen Seiten durchlaufen und ihr jeweiliges schreibgeschütztes Flag setzen.

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)


In iText 7.0.x kann es wie geschehen:


In iText 5.5.x kann dies wie folgt durchgeführt werden diese

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)

Es wird nur der Kernel iText 7 Artefakt benötigt.

+0

vielen Dank .. –

+0

Wenn dies für Sie funktioniert, möchten Sie vielleicht die Antwort akzeptieren (klicken Sie auf das Häkchen in der oberen linken Ecke). – mkl