En travaillant sur une application iPhone de lecture d'alimentation qui affiche Nsdata (HTML et PDF) dans une UIWebView. Je frappe un accroc dans une logique de validation PDF. J'ai un objet Nsdata que je connais contient un fichier avec une extension .pdf. Je voudrais limiter les PDF invalides d'obtenir plus loin. Voici ma première tentative de code de validation, qui semble fonctionner à la majorité des cas: Malheureusement, un nouveau PDF a été téléchargé il y a quelques jours. Il est valable dans le sens où l'UIWebView l'affichera bien, mais elle échoue mon test de validation. J'ai suivi la question du fait qu'il s'agissait d'un groupe d'octets de déchets au début, avec le% PDF à mi-chemin à mi-chemin de la 14e série de caractères hexagonaux (25 ou% est exactement le 54ème octet): P> %PDF: 25504446
Breaking PDF: 00010000 00ffffff ff010000 00000000 000f0100 0000b5e0 04000200 01000000 ffffffff 01000000 00000000 0f010000 0099e004 00022550 44462d31 etc...
5 Réponses :
Cette question semble assez utile: p>
Détecter si le fichier PDF est correct (en-tête PDF) a > p>
ou, si vous vous sentez aventureux, Voici la spécification (du site Adobe ici ) p>
Oui, merci de la liaison. Ça craint qu'il y a du flou autour de l'en-tête. Ainsi, je viens de rechercher les 1024 premiers octets de Nsdata pour% pdf, 4 octets à la fois, ou est-ce qu'il y a de quoi rechercher un morceau de données pour une chaîne de caractères?
Vous pouvez transformer les 1024 1024 caractères en Nstring (à l'aide de Nsdata Subdawithrange: i> pour obtenir les 1024 premiers octets, puis Nstring's initwithdata: coding: codage: i> méthode pour le coder dans un objet Nstring ) et faire une recherche dans cette utilisation de RangeOfstring: pour voir si c'est là?
NB Assurez-vous que vous avez> = 1024 octets ou au moins une de ces méthodes va jeter une exception;)
Ignorer mes commentaires précédents, il y a un moyen beaucoup plus facile. Il suffit d'utiliser RangeofData de Nsdata: Options: Gamme: I> à rechercher;) Peut-être que je ne devrais peut-être pas répondre à des questions pendant que je suis pas à la traîne et que c'est 3h du matin!
Hey j'apprécie l'aide, Dean. Je suis allé de l'avant et j'ai fait cela et cela a fonctionné, mais je vais juste arrêter de valider la validation, étant donné que j'espère que mes rédacteurs de contenu afficheront leurs PDF à l'avance.
dans Swift, j'ai ce qui suit:
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 } }
peut essayer ceci ..
Avez-vous vraiment besoin de MALLOC () CODE> 4 octets? Incidemment, vous pouvez simplement utiliser
"% pdf" code> au lieu de
pdfbytes code>.
Nsdata * tempdata = [nsdata DATAWITHBYTESNOCOPY: PDFBYtes Longueur: 4 FreebReMendone: Oui]; J'ai utilisé gratuitement whendone vrai. Nous devons donc utiliser MALLOC ().
Non tu ne le fais pas. Il suffit d'utiliser [nsdata DatawithBytes: "% pdf" Longueur: 4] code> à la place.
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 } }
Vous, monsieur, êtes un économiseur de vie
Mon plaisir M. Malik
SWIFT 4
extension Data { var isPDF: Bool { guard self.count >= 1024 else { return false } let pdfHeader = Data(bytes: "%PDF", count: 4) return self.range(of: pdfHeader, options: [], in: Range(NSRange(location: 0, length: 1024))) != nil } }
Il n'y a rien dans l'image qui puisse aider avec cela?