2016-04-08 24 views
0

hereの例に続いて、PDFBox 1.8.0を使用して印刷することで、一部の認定済みPDFの保護を解除しようとしています。PDFBox - 暗号化されたファイルを印刷

import java.awt.print.PrinterException; 
import java.awt.print.PrinterJob; 
import java.io.IOException; 

import javax.print.PrintException; 
import javax.print.PrintService; 
import org.apache.log4j.Logger; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPageable; 

public class PDFPrinter { 

    private static final Logger LOGGER = Logger.getLogger(PDFPrinter.class); 

    public static void main(String[] args) throws IOException, PrinterException, PrintException { 
    LOGGER.info("Running..."); 
    PDDocument pdDocument = PDDocument.load("C:\\_APPS\\input.pdf"); 
    PrinterJob printerJob = PrinterJob.getPrinterJob(); 
    PrintService printService = null; 
    if (printerJob.printDialog()) { 
     printService = printerJob.getPrintService(); 
     LOGGER.info("Using printer: " + printService.getName()); 
    } 
    printerJob.setPageable(new PDPageable(pdDocument)); 
    printerJob.print(); 
    pdDocument.close(); 
    } 

} 

私はMicrosoft Print to PDFプリンタを使用しています。確かにpdDocument.getCurrentAccessPermission()をチェックする時にnullである

java.lang.NullPointerException 
    at org.apache.pdfbox.pdmodel.PDPageable.<init>(PDPageable.java:74) 
    at org.apache.pdfbox.pdmodel.PDPageable.<init>(PDPageable.java:96) 
    at com.util.pdf.decrypt.Main.decryptAndOcr(Main.java:179) 
    at com.util.pdf.decrypt.Main.main(Main.java:82) 

を: は、私は、この文書に設定された何のアクセス権限を持っていないされていないと言ってPDPageableクラス@ライン74にNPEを取得しています。

AccessPermission accessPermission = new AccessPermission(); 
    accessPermission.setCanPrint(true); 
    StandardProtectionPolicy spp = new StandardProtectionPolicy("", "", accessPermission); 
    try { 
     pdDocument.protect(spp); 
    } catch (BadSecurityHandlerException bhe) { 
     bhe.printStackTrace(); 
    } 

をしかしpdDocument.getCurrentAccessPermission()をチェックするときの権限は、まだヌルです: は、だから私は手動でちょうど印刷権限で、ユーザー名やパスワードなしでいくつかのアクセス権限を設定しようとしました。

質問:PDFへの印刷アクセス権限を設定するにはどうすればよいですか?

注:OSから直接Microsoft Print to PDFプリンタを使用して印刷する場合は、印刷されたPDFから証明書が削除されるため、プロセスは機能します。

答えて

0

上記の例は2.0用です。 2.0(およびない1.8)を使用する、または1.8でこれを行う次のいずれかの

PDDocument doc = PDDocument.load(new File("...")); 
if (doc.isEncrypted()) 
{ 
    doc.openProtection(new StandardDecryptionMaterial("password")); 
} 

か、これはあなたの質問の後半部分を模擬する必要があり、この

PDDocument doc = PDDocument.loadNonSeq(new File("..."), null); 

を使用します。 PDFファイルを保存するときは、protect()を使用します。

1.8.0は使用しないでください。これは数年前です。 1.8を使用する必要がある場合は、現在のバージョン(1.8.11)を使用します。

関連する問題