2010-09-29 16 views
5

फ़ीड-रीडिंग आईफोन ऐप पर काम करने में जो UIWebView में nsdata (html और pdf) प्रदर्शित करता है। मैं कुछ पीडीएफ सत्यापन तर्क में एक झगड़ा मार रहा हूँ। मेरे पास एक NSData ऑब्जेक्ट है जो मुझे पता है .pdf एक्सटेंशन वाली एक फ़ाइल है। मैं अमान्य पीडीएफ को आगे बढ़ने से रोकना चाहता हूं।मैं कैसे सत्यापित करूं कि एनएसडीटा एक पीडीएफ है?

// pdfData is an NSData * 
NSData *validPDF = [[NSString stringWithString:@"%PDF"] dataUsingEncoding: NSASCIIStringEncoding]; 
if (!(pdfData && [[pdfData subdataWithRange:NSMakeRange(0, 4)] isEqualToData:validPDF])) { 
    // error 
} 

दुर्भाग्य से, एक नया पीडीएफ अपलोड किया गया था कुछ दिन पहले: यहाँ मेरी सत्यापन कोड का पहला प्रयास है, जो मामलों के बहुमत के लिए काम करने लगता है है। यह इस अर्थ में मान्य है कि UIWebView इसे ठीक दिखाएगा, फिर भी यह मेरे सत्यापन परीक्षण में विफल रहता है। मैंने इस मुद्दे को इस तथ्य को ट्रैक किया है कि शुरुआत में कचरा बाइट्स का एक गुच्छा था,% पीडीएफ हेक्स वर्णों के 14 वें सेट के माध्यम से मिडवे आ रहा था (25 या% बिल्कुल 54 वां बाइट है):

%PDF: 25504446 
Breaking PDF: 00010000 00ffffff ff010000 00000000 000f0100 0000b5e0 04000200 01000000 ffffffff 01000000 00000000 0f010000 0099e004 00022550 44462d31 etc... 

एनएसडीटा को पीडीएफ होने के लिए मान्य करने का सबसे अच्छा अभ्यास क्या है?
इस विशेष पीडीएफ के साथ क्या गलत हो सकता है (यह दावा करता है कि इसे पेपरपोर्ट 11.0 द्वारा एन्कोड किया गया था, जो कुछ भी है)?

धन्यवाद,

माइक

+0

वहाँ ImageIO में कुछ भी नहीं है कि इस के साथ मदद कर सकते हैं क्या है? – nielsbot

उत्तर

4

यह सवाल काफी उपयोगी लगता है:

Detect if PDF file is correct (header PDF)

या, यदि आप रोमांच महसूस कर रहे हैं, here's the spec

+0

हां, लिंक करने के लिए धन्यवाद। यह बेकार है कि शीर्षलेख के चारों ओर कुछ अस्पष्टता है। तो क्या मैं सिर्फ एनएसडीटा के पहले 1024 बाइट्स को% पीडीएफ, 4 बाइट्स के लिए खोजता हूं, या क्या किसी चरित्र स्ट्रिंग के लिए डेटा का एक हिस्सा खोजने के लिए कुछ है? – TahoeWolverine

+0

आप पहले 1024 वर्णों को एनएसएसटींग में बदल सकते हैं (पहले 1024 बाइट्स प्राप्त करने के लिए NSData के _subdatawithRange: _ का उपयोग करके और फिर एनएसएसटींग की _initWithData: एन्कोडिंग: _ विधि को एनएसएसटींग ऑब्जेक्ट में एन्कोड करने के लिए) और श्रेणीऑफस्ट्रिंग का उपयोग करके उसमें एक खोज करें: देखें कि यह वहां है या नहीं? – deanWombourne

+0

एनबी सुनिश्चित करें कि आपके पास> = 1024 बाइट्स हैं या उनमें से कम से कम एक विधियां अपवाद फेंकने जा रही हैं;) – deanWombourne

2
(Adobe साइट here से)

स्विफ्ट में मेरे पास निम्न है:

var isPDF:Bool = false 
if assetData.length >= 1024 //only check if bigger 
{ 
    var pdfBytes = [UInt8]() 
    pdfBytes = [ 0x25, 0x50, 0x44, 0x46] 
    let pdfHeader = NSData(bytes: pdfBytes, length: 4) 
    let foundRange = assetData.rangeOfData(pdfHeader, options: nil, range: NSMakeRange(0, 1024)) 
    if foundRange.length > 0 
    { 
     isPDF = true 
    } 
} 
2

यह कोशिश की जा सकती है ..

// Validate PDF using NSData 
    - (BOOL)isValidePDF:(NSData *)pdfData { 
     BOOL isPDF = false; 
     if (pdfData.length >= 1024) { 

      int startMetaCount = 4, endMetaCount = 5; 
      // check pdf data is the NSData with embedded %PDF & %%EOF 
      NSData *startPDFData = [NSData dataWithBytes:"%PDF" length:startMetaCount]; 
      NSData *endPDFData = [NSData dataWithBytes:"%%EOF" length:endMetaCount]; 
      // startPDFData, endPDFData data are the NSData with embedded in pdfData 
      NSRange startRange = [pdfData rangeOfData:startPDFData options:0 range:NSMakeRange(0, 1024)]; 
      NSRange endRange = [pdfData rangeOfData:endPDFData options:0 range:NSMakeRange(0, pdfData.length)]; 

      if (startRange.location != NSNotFound && startRange.length == startMetaCount && endRange.location != NSNotFound && endRange.length == endMetaCount) { 
       // This assumes the start & end PDFData doesn't have a specific range in file pdf data 
       isPDF = true; 

      } else { 
       isPDF = false; 
      } 
     } 
     return isPDF; 
    } 
+0

क्या आपको वास्तव में 'malloc()' 4 बाइट्स की आवश्यकता है? संयोग से आप 'pdfBytes' के बजाय'%% पीडीएफ "का उपयोग कर सकते हैं। – trojanfoe

+0

एनएसडीएटा * tempData = [एनएसडीटा डेटाविथबाइट्सओकोपी: पीडीएफबाइट्स लंबाई: 4 फ्रीहेनडोन: हाँ]; जब मैंने सच किया तो मैंने मुफ्त में उपयोग किया है। तो हमें malloc() का उपयोग करने की आवश्यकता है। –

+0

नहीं आप नहीं करते हैं। बस '[NSData डेटाविथबाइट्स: "% पीडीएफ" लंबाई: 4]' का उपयोग करें। – trojanfoe

3
let fileManager = FileManager() 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 
    let rootDirectory = "\(documentsPath)/\(caption!)/" 
    let imageURL = URL(fileURLWithPath: rootDirectory).appendingPathComponent("0") 
    let ns = NSData(contentsOf: imageURL) 
    let fileExists = fileManager.fileExists(atPath: imageURL.path) 
    var isPDF:Bool = false 
    if (ns?.length)! >= 1024 //only check if bigger 
    { 
     var pdfBytes = [UInt8]() 
     pdfBytes = [ 0x25, 0x50, 0x44, 0x46] 
     let pdfHeader = NSData(bytes: pdfBytes, length: 4) 
     let a = ns?.range(of: pdfHeader as Data, options: .anchored, in: NSMakeRange(0, 1024)) 
     if (a?.length)! > 0 
     { 
      isPDF = true 


     } 
     else 
     { 
      isPDF = false 

     } 
    } 
+0

आप, महोदय, एक जीवन बचतकर्ता – Malik

+0

मेरी खुशी श्री मलिक –

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