2012-10-25 10 views
5

का उपयोग करके पीडीएफ की सुरक्षा करना वास्तव में पीडीएफबॉक्स के लिए प्रलेखन के साथ संघर्ष कर रहा हूं। ऐसा लगता है कि इस तरह की एक लोकप्रिय लाइब्रेरी जानकारी जमीन पर थोड़ा पतली लगती है (मेरे लिए!)।पीडीएफबॉक्स

वैसे भी समस्या आईपी पीडीएफ की सुरक्षा से संबंधित है। फिलहाल मैं चाहता हूं कि उपयोगकर्ताओं की एक्सेस अनुमतियों को नियंत्रित किया जाए। विशेष रूप से मैं उपयोगकर्ता को पीडीएफ को संशोधित करने में सक्षम होने से रोकना चाहता हूं।

यदि मैं एक्सेस अनुमति कोड को छोड़ देता हूं तो सब कुछ पूरी तरह से काम करता है। मैं बाहरी संसाधन से पीडीएफ में पढ़ रहा हूं। मैं फिर नए पीडीएफ को बचाने से पहले कुछ छवियों को जोड़कर खेतों को पढ़ रहा हूं और पॉप्युलेट कर रहा हूं। यह सब पूरी तरह से काम करता है।

/* Secure the PDF so that it cannot be edited */ 
try { 
    String ownerPassword = "DSTE$gewRges43"; 
    String userPassword = ""; 

    AccessPermission ap = new AccessPermission(); 
    ap.setCanModify(false); 

    StandardProtectionPolicy spp = new StandardProtectionPolicy(ownerPassword, userPassword, ap); 
    pdf.protect(spp); 
} catch (BadSecurityHandlerException ex) { 
    Logger.getLogger(PDFManager.class.getName()).log(Level.SEVERE, null, ex); 
} 

मुझे इस कोड की सभी पाठ जोड़ने के लिए, और छवियों को बाहर जाने वाले पीडीएफ से धारीदार रहे हैं:

समस्या जब मैं पहुँच प्रबंधन करने के लिए निम्न कोड जोड़ आता है। फ़ील्ड अभी भी दस्तावेज़ में मौजूद हैं लेकिन वे सभी खाली हैं और सभी टेक्स्ट और छवियां हैं जहां मूल पीडीएफ का हिस्सा और कोड में गतिशील रूप से जोड़े गए थे।

अद्यतन: ठीक है, जैसा कि मैं समस्या बता सकता हूं उतना ही फॉर्म फ़ील्ड से संबंधित बग से आ रहा है। मैं फार्म फ़ील्ड के बिना एक अलग दृष्टिकोण की कोशिश करने जा रहा हूं और देखता हूं कि यह क्या देता है।

+0

मुझे यादृच्छिक पीडीएफ लौटने वाले रिक्त स्थान के साथ एक ही समस्या है। कोई विचार? – NightWolf

+0

मुझे इस समस्या के निचले भाग तक कभी नहीं मिला। अंत में मुझे एक अलग पुस्तकालय का उपयोग करना पड़ा! – tarka

+0

धन्यवाद। मुझे आपके लिए एक समाधान मिला। – NightWolf

उत्तर

7

मुझे इस समस्या का समाधान मिला। ऐसा लगता है कि यदि पीडीएफ बाहरी स्रोत से आता है, तो कभी-कभी पीडीएफ सुरक्षित या एन्क्रिप्टेड होता है।

यदि बाहरी स्रोत से पीडीएफ दस्तावेज लोड करते समय आपको रिक्त आउटपुट मिलता है और सुरक्षा को जोड़ते हैं तो आप शायद एन्क्रिप्टेड दस्तावेज़ के साथ काम कर रहे हैं। मेरे पास पीडीएफ दस्तावेज़ों पर काम कर रहे एक स्ट्रीम प्रोसेसिंग सिस्टम है। तो निम्नलिखित कोड मेरे लिए काम करता है। यदि आप सिर्फ पीडीएफ इनपुट के साथ काम कर रहे हैं तो आप नीचे दिए गए कोड को अपने प्रवाह के साथ एकीकृत कर सकते हैं।

public InputStream convertDocument(InputStream dataStream) throws Exception { 
    // just acts as a pass through since already in pdf format 
    PipedOutputStream os = new PipedOutputStream(); 
    PipedInputStream is = new PipedInputStream(os); 

    System.setProperty("org.apache.pdfbox.baseParser.pushBackSize", "2024768"); //for large files 

    PDDocument doc = PDDocument.load(dataStream, true); 

    if (doc.isEncrypted()) { //remove the security before adding protections 
     doc.decrypt(""); 
     doc.setAllSecurityToBeRemoved(true); 
    } 
    doc.save(os); 
    doc.close(); 
    dataStream.close(); 
    os.close(); 
    return is; 
} 

अब उस इनपुटस्ट्रीम को वापस ले जाएं और इसे अपने सुरक्षा एप्लिकेशन के लिए उपयोग करें;

PipedOutputStream os = new PipedOutputStream(); 
    PipedInputStream is = new PipedInputStream(os); 

    System.setProperty("org.apache.pdfbox.baseParser.pushBackSize", "2024768"); 
    InputStream dataStream = secureData.data(); 

    PDDocument doc = PDDocument.load(dataStream, true); 
    AccessPermission ap = new AccessPermission(); 
    //add what ever perms you need blah blah... 
    ap.setCanModify(false); 
    ap.setCanExtractContent(false); 
    ap.setCanPrint(false); 
    ap.setCanPrintDegraded(false); 
    ap.setReadOnly(); 

    StandardProtectionPolicy spp = new StandardProtectionPolicy(UUID.randomUUID().toString(), "", ap); 

    doc.protect(spp); 

    doc.save(os); 
    doc.close(); 
    dataStream.close(); 
    os.close(); 

अब यह एक खाली दस्तावेज़ के साथ एक उचित दस्तावेज वापस नहीं करना चाहिए!

चाल एन्क्रिप्शन को पहले हटाने के लिए है!

+0

सिंगल-थ्रेडेड कोड में 'पाइपडऑटपुटस्ट्रीम' और 'पाइपड इनपुटस्ट्रीम' का उपयोग थोड़ा सा विचित्र है। – mkl

+0

क्षमा करें। इस उदाहरण में पाइपडिनपूटस्ट्रीम रेफ वास्तव में किसी अन्य धागे को पारित किया जाता है (यह कोड पिन किए गए अक्का अभिनेताओं में रहता है)। मैंने ऊपर दिए गए कोड में भेज दिया। – NightWolf

संबंधित मुद्दे