2010-11-04 4 views
23

Après deux jours en essayant de lire des annotations à partir d'un PDF en utilisant Quartz, j'ai réussi à le faire et posted my code.Recherche PDF sur l'iPhone

Maintenant, je voudrais faire la même chose pour une autre question fréquemment posée: la recherche de documents PDF avec Quartz. Même situation qu'auparavant, cette question a été posée plusieurs fois avec presque aucune réponse pratique. J'ai donc besoin de quelques pointeurs en premier, car je ne l'ai toujours pas implémenté moi-même.

Ce que j'ai essayé:

J'ai essayé avec CGPDFScannerScan la manipulation des TJ et Tj opérateurs - renvoie le texte à droite sur certains PDF, alors que sur d'autres documents, il retourne lettres la plupart du temps au hasard. Peut-être que c'est lié à l'encodage de texte? Quelqu'un pointed out que les blocs de texte (marqués par des opérateurs BT/ET) doivent être traités à la place, mais je n'ai toujours pas réussi à le faire. Quelqu'un a réussi à extraire le texte de n'importe quel PDF? Après cela, la recherche devrait être facile en stockant tout le texte dans un NSMutableString et en utilisant rangeOfString (s'il y a un meilleur moyen s'il vous plaît faites le moi savoir).

Mais alors comment mettre en évidence le résultat? Je sais qu'il y a quelques opérateurs pour trouver les tailles de glyphes, ainsi j'ai pu calculer le rect résultant basé sur ces valeurs, mais j'ai lu la spécification pendant des heures ... c'est un désordre boursouflé et je deviens fou. Quelqu'un avec une explication pratique?

Mise à jour

utilisateur Naveen Thunga trouvé PDFKitten, "un cadre pour extraire des données de fichiers PDF dans iOS". J'ai juste essayé la démo et ça a l'air de marcher comme annoncé. Je vais le tester avec plus de PDF et afficherai bientôt les résultats. En passant, le code me semble très bien - si vous êtes intéressé par le fonctionnement de ce logiciel, c'est plutôt génial.

+0

à cet ensemble des opérateurs pourrait être utile: http://efreedom.com/Question/1-3627745/Getting-Text-Position-Parsing-Pdf-Quartz -2D –

+0

Hey Brainfeeder, Vous avez trouvé une solution pour mettre en évidence le résultat de la recherche? – Sarah

+0

@Sarah: Non, toujours rien, j'ai commencé à me concentrer sur d'autres choses après quelques jours ... – pt2ph8

Répondre

4

Ce n'est pas un problème simple à implémenter, mais c'est simple.

Pour une page donnée, vous devez numériser la page à l'aide de l'API du scanner CGPDF. Vous devez enregistrer les rappels pour les opérateurs PDF qui affectent le texte de la page - pas seulement TJ/Tj, mais aussi ceux qui définissent la police, affectent la matrice de dessin du texte, etc. Vous devez construire un automate à états avec chaque balise rencontrée + paramètres. Vous devez examiner la comptabilisation du texte pour l'encodage de la police en cours. Lorsque vous trouvez du texte que vous souhaitez mettre en surbrillance, vous devez examiner la matrice de dessin de texte que vous avez mise à jour pour déterminer les coordonnées de dessin. Lisez la spécification PDF (la version 1.7 est téléchargeable sur Adobe) pour connaître les opérateurs auxquels vous devez prêter attention.

Le codage de police est peut-être la partie la plus difficile car il existe de nombreuses manières de spécifier le codage, et certaines d'entre elles sont propres à la police. La plupart du temps, vous pouvez tricher et vous rabattre sur un sous-ensemble de l'encodage ANSI - mais cela va casser certains PDF ayant des polices étranges.

Essentiellement, vous traitez la page comme si vous deviez la rendre.

2

J'ai créé utility class en Objective-C en utilisant PDF.js

qui permettra l'affichage ainsi que le fichier PDF de recherche.

La classe utilitaire permet la recherche en utilisant Highlight all search result et les options 'sensibles à la casse'.

ont regarder PDF recherche en action Link