2016-05-17 196 views
-2

我試圖製作一個程序,多個用戶可以共享一個PDF文檔,並且每個人都可以使用添加便籤而不改變/修改其他筆記來將他對PDF的評論。 例如, 該程序會將該PDF文件轉移給其他人員進行審閱和檢查,審閱者會將其對PDF的評論發送給Approver人員。批准者無法編輯評論者評論並進行更改,他可以添加新的便籤以徵求他的意見。如何使pdf註釋爲只讀使用itext?

如果我使用PDF上的安全性(〜PdfWriter.AllowModifyAnnotations),我將禁用輸入新的便籤。

有沒有解決方案?

請幫助我,並提前致謝

+0

你的用戶用戶使用哪些程序?我問,因爲給定適當的程序,只讀標註可以編輯。 – mkl

+0

我正在使用JSP(Java服務器頁面),用戶將用他的評論上傳PDF,系統會將該文件轉發給被騙人(比如說B人)。人B不能編輯以前用戶的所有預先評論。他只能將他的評論添加到文件並再次將其上傳到系統。我想知道如何讓其他人打開PDF文件時才能閱讀評論。他們可以閱讀內容並只添加註釋。 –

+0

* B人不能編輯以前用戶的所有prevoius評論。他只能將他的評論添加到文件中並重新上傳到系統中。* - 使用哪個程序,人員B不能編輯以前的評論,但能夠添加新的評論? – mkl

回答

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

+0

非常感謝.. –

+0

如果這對你有效,你可能想接受答案(點擊左上角的勾號)。 – mkl