Maison base de données tutoriel mysql Quartz 2D编程指南(14)

Quartz 2D编程指南(14)

Jun 07, 2016 pm 03:15 PM
pdf quartz 指南 文档 编程 解析

咳咳。。。。PDF文档解析 。。。网上找了好久没找到。。。。。自己翻译了。。水平不行。。。大家将就点随便看看了。这可是哥辛苦一下午翻译的

咳咳。。。。PDF文档解析 。。。网上找了好久没找到。。。。。自己翻译了。。水平不行。。。大家将就点随便看看了。这可是哥辛苦一下午翻译的啊。。累死我了。。


PDF文档解析

Quartz提供了让你检查PDF文档结构和内容流(contentstream)的函数.检查文档结构可以让你读取文档目录的条目和与每个条目相关的内容。通过递归地遍历目录,您可以检查整个文档。

一个PDF的内容流(contentstream)正如其名字所暗示的—一个连续的数据流 例如'BT 12 /F71 Tf (draw thistext) Tj . . . '此处PDF操作符以及他们的描述符都混有实际的PDF内容。检查内容流,你需要按顺序访问它。

本章揭示了如何查看PDF文档的结构和解析一个PDF文件的内容。

 

检查PDF文档结构

PDF文件可能包含多个页面的图像和文本。您可以使用Quartz访问文档和页面级别的元数据以及PDF页上的对象。本节提供了一个非常简短的介绍,关于您可以访问的元数据。

 

一个PDF文档对象 (CGPDFDocument)包含了所有的信息,涉及到一个PDF文档,包括它的目录和内容。目录中的条目的递归地描述了PDF文档的内容。你可以访问一个PDF文档的内容通过调用函数CGPDFDocumentGetCatalog

 

一个PDF页面对象(CGPDFPage)代表PDF文档中的一页且包含此特定的页面所有信息,包括页面字典和页面内容。您可以获得一个页面字典通过调用该函数CGPDFPageGetDictionary

 

图 14-1 展示了描述了两张图片的元数据—组成了图13-2的PDF文件。

 Quartz 2D编程指南(14)

你可以通过访问PDF的元数据获得更多有用的信息。图14-1只是一个示例。例如,您可以通过使用图14-1中的代码检查一个PDF是否有缩略图(见图14-2)。

 

清单  14-1  得到PDF的缩略视图

CGPDFDictionaryRef d;
Copier après la connexion
CGPDFStreamRef stream; // represents a sequence of bytes
Copier après la connexion
d = CGPDFPageGetDictionary(page);
Copier après la connexion
// check for thumbnail data
Copier après la connexion
if (CGPDFDictionaryGetStream (d, “Thumb”, &stream)){
Copier après la connexion
    // get the data if it exists
Copier après la connexion
    data = CGPDFStreamCopyData (stream, &format);
Copier après la connexion

Quartz为你执行了所有数据流的解密和解密工作。

 

图 14-2  缩略图片

Quartz 2D编程指南(14) 

Quartz提供了很多的功能,您可以使用它来获得PDF的元数据中对应项的指定值。例如,您使用函数CGPDFObjectGetValue传入一个CGPDFObjectRef,和一个PDF对象类型(kCGPDFObjectTypeBooleankCGPDFObjectTypeInteger, 等等),以及一个存储值的存储空间。返回时,此存储空间就被得到的值填充了。

 

还有很多其他的函数可以用来遍历PDF文件的层次结构来访问各个节点和他们的子节点。例如,CGPDFArray函数(CGPDFArrayGetBooleanCGPDFArrayGet DictionaryCGPDFArrayGetInteger,等等)  允许您访问数组的值,以检索特定类型的值。你可以通过阅读阅读PDF规范来找到更多关于如何使用这些函数。

 

解析PDF内容

 

你使用CGPDFScanner对象(CGPDFScannerRef数据类型)来解析一个PDF内容流。CGPDFScanner对象调用在流中注册了回调方法的任何操作符的回调方法。

 

你可以执行以下部分所描述的任务来解析内容流:

1.“为操作符写回调方法”你需要为你要操作的操作符编写回调方法。

2.“创建和设置操作表”。

3.“打开PDF文档”。

4.“扫描每页的内容流”。

当这么做的时候,你应该确保释放了 the scanner, content stream,and operator table。

 

下面的部分展示如何解析内容流找到标记-内容操作符marked-content operators)(见表14-1)。标记的内容操作符只代表部分用于PDF内容的PDF操作符。当您编写自己的代码时,你最好寻找适合您的应用程序的PDF操作符。

 

表 14-1 标注的内容操作符代表一些你可以解析的PDF操作符

Operator

Description

MP

DP

BMC

标志着一个标记内容序列的开始(开始标记内容)和标志一个内容序列结尾的EMC

BDC

标志着一个标记内容序列的开始和标志一个内容序列结尾的EMC

EMC

标志着一个以BMCBDC

 

为操作符编写回调方法

当Quartz调用你的PDF操作符的回调方法时,它通过你的回调方法传递了一个CGPDFScanner对象和一个指向任何必要信息的指针。通常,你的回调方法检索任何与操作符相关联的项。例如,在14-2所展示的清单中对应于MP操作符的回调方法调用了CGPDFScannerPopName函数从堆栈中检索与操作符相关联的字符串。如果清单中的代码成功的从scanner栈中检索出name,就打印出来。

Quartz有各式各样的CGPDFScannerPop函数用于检索objects,Boolean values, names, numbers, strings, arrays, dictionaries, and streams.每个函数都返回一个布尔值表明是否成功检索了该项。

 

清单14-2 MP操作符的回调方法

static void
Copier après la connexion
op_MP (CGPDFScannerRef s, void *info)
Copier après la connexion
{
Copier après la connexion
    const char *name;
Copier après la connexion
 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
    if (!CGPDFScannerPopName(s, &name))
Copier après la connexion
        return;
Copier après la connexion
 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
    printf("MP /%s\n", name);
Copier après la connexion
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion


创建并设置操作表 

一个CGPDFOperatorTable对象存储了你编写的PDF操作符回调函数。函数CGPDFOperatorTableCreate创建了一个操作符表,如清单14-3所示。当你创建了一个操作符表之后,你要为每个你要加入到表中的回调方法调用函数 CGPDFOperatorTableSetCallback你传入了操作表,指定PDF操作符的字符串,以及一个你编写用来处理指定操作符的回调函数的指针。你可以随意命名这些回调函数。只要确保回调函数的名字和你传入CGPDFOperatorTableSetCallback函数的名字是相同的即可。

 

代码清单14-3为表14-1中列出的每个标记-文本操作符 设置了一个回调方法。你的应用应该为你感兴趣的那些操作符设置回调方法。PDF操作符字符串由Adobe PDF Reference 制定。


清单 14-3 为操作表设置回调方法

CGPDFOperatorTableRef myTable;
Copier après la connexion
 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
myTable = CGPDFOperatorTableCreate();
Copier après la connexion
 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
CGPDFOperatorTableSetCallback (myTable, "MP", &op_MP);
Copier après la connexion
CGPDFOperatorTableSetCallback (myTable, "DP", &op_DP);
Copier après la connexion
CGPDFOperatorTableSetCallback (myTable, "BMC", &op_BMC);
Copier après la connexion
CGPDFOperatorTableSetCallback (myTable, "BDC", &op_BDC);
Copier après la connexion
CGPDFOperatorTableSetCallback (myTable, "EMC", &op_EMC);
Copier après la connexion



打开PDF文档
 

在你扫描PDF文档之前,你必须打开它。清单14-4 展示了 从代码中提供的URL创建一个CGPDFDocument对象的代码片段。注意此清单只是一个代码段,所以不是所有变量都定义了。此清单中用数字标注的代码行都有详细的解释。

 

清单 14-4 从一个URL打开一个PDF文档


CGPDFDocumentRef myDocument;
Copier après la connexion
myDocument = CGPDFDocumentCreateWithURL(url);<span>// 1</span>
Copier après la connexion
if (myDocument == NULL) {<span>// 2</span>
Copier après la connexion
        error ("can't open `%s'.", filename);
Copier après la connexion
        CFRelease (url);
Copier après la connexion
        return EXIT_FAILURE;
Copier après la connexion
Copier après la connexion
Copier après la connexion
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
CFRelease (url);
Copier après la connexion
if (CGPDFDocumentIsEncrypted (myDocument)) {<span>// 3</span>
Copier après la connexion
    if (!CGPDFDocumentUnlockWithPassword (myDocument, "")) {
Copier après la connexion
        printf ("Enter password: ");
Copier après la connexion
        fflush (stdout);
Copier après la connexion
        password = fgets(buffer, sizeof(buffer), stdin);
Copier après la connexion
        if (password != NULL) {
Copier après la connexion
            buffer[strlen(buffer) - 1] = '\0';
Copier après la connexion
            if (!CGPDFDocumentUnlockWithPassword (myDocument, password))
Copier après la connexion
                error("invalid password.");
Copier après la connexion
        }
Copier après la connexion
    }
Copier après la connexion
Copier après la connexion
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
if (!CGPDFDocumentIsUnlocked (myDocument)) {<span>// 4</span>
Copier après la connexion
        error("can't unlock `%s'.", filename);
Copier après la connexion
        CGPDFDocumentRelease(myDocument);
Copier après la connexion
        return EXIT_FAILURE;
Copier après la connexion
Copier après la connexion
Copier après la connexion
    }
Copier après la connexion
Copier après la connexion
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
 if (CGPDFDocumentGetNumberOfPages(document) == 0) {<span>// 5</span>
Copier après la connexion
        CGPDFDocumentRelease(document);
Copier après la connexion
        return EXIT_FAILURE;
Copier après la connexion
Copier après la connexion
Copier après la connexion
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

此处代码做了哪些: 

1. 利用代码中提供的URL创建一个CGPDFDocument对象。

2. 检查以确保CGPDFDocument对象被创建。如果没有,代码退出,因为没有document继续执行没有意义。

3. 检查document是否加密。如果document加密,则代码试图利用空密码打开文档。如果失败,代码要求用户提供密码并试图用此密码解锁文档。

4. 检查document是否解锁,如果没有,代码退出。

5. 检查以确保document至少有一页,否则,代码退出。

 

 

扫描每页的内容流

清单14-5 代码段扫描文档每一页。当此scanner遇到一个注册了回调方法的PDF操作符,Quartz就调用此回调方法。此清单中用数字标注的代码行都有详细的解释。

清单 14-5  扫描文档的每一页

int k;
Copier après la connexion
CGPDFPageRef myPage;
Copier après la connexion
CGPDFScannerRef myScanner;
Copier après la connexion
CGPDFContentStreamRef myContentStream;
Copier après la connexion
 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
numOfPages = CGPDFDocumentGetNumberOfPages (myDocument);<span>// 1</span>
Copier après la connexion
for (k = 0; k 
Copier après la connexion
    myPage = CGPDFDocumentGetPage (myDocument, k + 1 );<span>// 2</span>
Copier après la connexion
    myContentStream = CGPDFContentStreamCreateWithPage (myPage);<span>// 3</span>
Copier après la connexion
    myScanner = CGPDFScannerCreate (myContentStream, myTable, NULL);<span>// 4</span>
Copier après la connexion
    CGPDFScannerScan (myScanner);<span>// 5</span>
Copier après la connexion
    CGPDFPageRelease (myPage);<span>// 6</span>
Copier après la connexion
    CGPDFScannerRelease (myScanner);<span>// 7</span>
Copier après la connexion
    CGPDFContentStreamRelease (myContentStream);<span>// 8</span>
Copier après la connexion
 }
Copier après la connexion
 CGPDFOperatorTableRelease(myTable);
Copier après la connexion

此处代码解释: 

1. 得到你先前打开的document的页数。见“Open thePDF Document.”

2. 检索扫描一页。页数以一开始。

3. 为此页创建内容流。

4. 为内容流创建一个scanner。你必须传入先前创建且在回调方法中设置的内容流和操作表。见“Create andSet Up the Operator Table.” 你也可以传入你的回调方法中需要的任何数据。

5. 解析与scanner相关联的内容流。当Quartz每次遇到你在回调方法中提供的操作符时就会调用相应回调方法。

6. 释放 page

7. 释放 scanner

8. 释放 content stream

9. 释放 operator table 在PDF扫描完所有页之后。

 

原帖地址:http://blog.csdn.net/xiao_se7en/article/details/7620056
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Supprimez les valeurs en double du tableau PHP à l'aide d'expressions régulières Supprimez les valeurs en double du tableau PHP à l'aide d'expressions régulières Apr 26, 2024 pm 04:33 PM

Comment supprimer les valeurs en double du tableau PHP à l'aide d'expressions régulières : utilisez l'expression régulière /(.*)(.+)/i pour faire correspondre et remplacer les doublons. Parcourez les éléments du tableau et vérifiez les correspondances à l'aide de preg_match. S'il y a une correspondance, ignorez la valeur ; sinon, ajoutez-la à un nouveau tableau sans valeurs en double.

A quoi sert la programmation et à quoi sert de l'apprendre ? A quoi sert la programmation et à quoi sert de l'apprendre ? Apr 28, 2024 pm 01:34 PM

1. La programmation peut être utilisée pour développer divers logiciels et applications, notamment des sites Web, des applications mobiles, des jeux et des outils d'analyse de données. Ses domaines d'application sont très larges, couvrant presque tous les secteurs, notamment la recherche scientifique, la santé, la finance, l'éducation, le divertissement, etc. 2. L'apprentissage de la programmation peut nous aider à améliorer nos compétences en résolution de problèmes et nos capacités de réflexion logique. Lors de la programmation, nous devons analyser et comprendre les problèmes, trouver des solutions et les traduire en code. Cette façon de penser peut cultiver nos capacités analytiques et abstraites et améliorer notre capacité à résoudre des problèmes pratiques.

La clé du codage : libérer la puissance de Python pour les débutants La clé du codage : libérer la puissance de Python pour les débutants Oct 11, 2024 pm 12:17 PM

Python est un langage d'introduction à la programmation idéal pour les débutants grâce à sa facilité d'apprentissage et ses fonctionnalités puissantes. Ses bases incluent : Variables : utilisées pour stocker des données (nombres, chaînes, listes, etc.). Type de données : Définit le type de données dans la variable (entier, virgule flottante, etc.). Opérateurs : utilisés pour les opérations mathématiques et les comparaisons. Flux de contrôle : contrôlez le flux d'exécution du code (instructions conditionnelles, boucles).

Java Made Simple : un guide du débutant sur la puissance de programmation Java Made Simple : un guide du débutant sur la puissance de programmation Oct 11, 2024 pm 06:30 PM

Java Made Simple : Guide du débutant sur la puissance de programmation Introduction Java est un langage de programmation puissant utilisé dans tout, des applications mobiles aux systèmes d'entreprise. Pour les débutants, la syntaxe de Java est simple et facile à comprendre, ce qui en fait un choix idéal pour apprendre la programmation. Syntaxe de base Java utilise un paradigme de programmation orienté objet basé sur les classes. Les classes sont des modèles qui organisent ensemble les données et les comportements associés. Voici un exemple simple de classe Java : publicclassPerson{privateStringname;privateintage;

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

Comment convertir un pdf en word Comment convertir un pdf en word Apr 30, 2024 pm 05:58 PM

1. Utilisez des outils de conversion en ligne tels que Smallpdf, Adobe Acrobat ou Zamzar. 2. Ces outils fournissent généralement une interface facile à utiliser, permettant aux utilisateurs de télécharger des fichiers PDF et éventuellement de les convertir au format Word. 3. Une fois la conversion terminée, les utilisateurs peuvent télécharger le document Word et effectuer d'autres modifications. 4. Utilisez un logiciel de conversion PDF professionnel, tel qu'Adobe Acrobat Pro ou Wondershare PDFelement.

Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Oct 11, 2024 pm 08:58 PM

Python permet aux débutants de résoudre des problèmes. Sa syntaxe conviviale, sa bibliothèque complète et ses fonctionnalités telles que les variables, les instructions conditionnelles et les boucles permettent un développement de code efficace. De la gestion des données au contrôle du flux du programme et à l'exécution de tâches répétitives, Python fournit

Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Oct 11, 2024 pm 10:47 PM

C est un choix idéal pour les débutants qui souhaitent apprendre la programmation système. Il contient les composants suivants : fichiers d'en-tête, fonctions et fonctions principales. Un simple programme C capable d'imprimer "HelloWorld" a besoin d'un fichier d'en-tête contenant la déclaration de fonction d'entrée/sortie standard et utilise la fonction printf dans la fonction principale pour imprimer. Les programmes C peuvent être compilés et exécutés à l'aide du compilateur GCC. Après avoir maîtrisé les bases, vous pouvez passer à des sujets tels que les types de données, les fonctions, les tableaux et la gestion des fichiers pour devenir un programmeur C compétent.

See all articles