Heim Datenbank MySQL-Tutorial 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;
Nach dem Login kopieren
CGPDFStreamRef stream; // represents a sequence of bytes
Nach dem Login kopieren
d = CGPDFPageGetDictionary(page);
Nach dem Login kopieren
// check for thumbnail data
Nach dem Login kopieren
if (CGPDFDictionaryGetStream (d, “Thumb”, &stream)){
Nach dem Login kopieren
    // get the data if it exists
Nach dem Login kopieren
    data = CGPDFStreamCopyData (stream, &format);
Nach dem Login kopieren

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
Nach dem Login kopieren
op_MP (CGPDFScannerRef s, void *info)
Nach dem Login kopieren
{
Nach dem Login kopieren
    const char *name;
Nach dem Login kopieren
 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
    if (!CGPDFScannerPopName(s, &name))
Nach dem Login kopieren
        return;
Nach dem Login kopieren
 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
    printf("MP /%s\n", name);
Nach dem Login kopieren
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren


创建并设置操作表 

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

 

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


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

CGPDFOperatorTableRef myTable;
Nach dem Login kopieren
 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
myTable = CGPDFOperatorTableCreate();
Nach dem Login kopieren
 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
CGPDFOperatorTableSetCallback (myTable, "MP", &op_MP);
Nach dem Login kopieren
CGPDFOperatorTableSetCallback (myTable, "DP", &op_DP);
Nach dem Login kopieren
CGPDFOperatorTableSetCallback (myTable, "BMC", &op_BMC);
Nach dem Login kopieren
CGPDFOperatorTableSetCallback (myTable, "BDC", &op_BDC);
Nach dem Login kopieren
CGPDFOperatorTableSetCallback (myTable, "EMC", &op_EMC);
Nach dem Login kopieren



打开PDF文档
 

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

 

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


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

此处代码做了哪些: 

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

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

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

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

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

 

 

扫描每页的内容流

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

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

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

此处代码解释: 

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
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Entfernen Sie doppelte Werte mithilfe regulärer Ausdrücke aus dem PHP-Array Entfernen Sie doppelte Werte mithilfe regulärer Ausdrücke aus dem PHP-Array Apr 26, 2024 pm 04:33 PM

So entfernen Sie doppelte Werte mithilfe regulärer Ausdrücke aus einem PHP-Array: Verwenden Sie den regulären Ausdruck /(.*)(.+)/i, um Duplikate abzugleichen und zu ersetzen. Durchlaufen Sie die Array-Elemente und prüfen Sie mit preg_match, ob Übereinstimmungen vorliegen. Wenn es eine Übereinstimmung gibt, überspringen Sie den Wert; andernfalls fügen Sie ihn einem neuen Array ohne doppelte Werte hinzu.

Wozu dient das Programmieren und welchen Nutzen hat es, es zu lernen? Wozu dient das Programmieren und welchen Nutzen hat es, es zu lernen? Apr 28, 2024 pm 01:34 PM

1. Mithilfe der Programmierung können verschiedene Software- und Anwendungsprogramme entwickelt werden, darunter Websites, mobile Anwendungen, Spiele und Datenanalysetools. Seine Anwendungsbereiche sind sehr breit gefächert und decken nahezu alle Branchen ab, darunter wissenschaftliche Forschung, Gesundheitswesen, Finanzen, Bildung, Unterhaltung usw. 2. Das Erlernen des Programmierens kann uns helfen, unsere Fähigkeiten zur Problemlösung und unser logisches Denkvermögen zu verbessern. Beim Programmieren müssen wir Probleme analysieren und verstehen, Lösungen finden und diese in Code übersetzen. Diese Denkweise kann unsere analytischen und abstrakten Fähigkeiten fördern und unsere Fähigkeit verbessern, praktische Probleme zu lösen.

Der Schlüssel zum Programmieren: Die Leistungsfähigkeit von Python für Anfänger freischalten Der Schlüssel zum Programmieren: Die Leistungsfähigkeit von Python für Anfänger freischalten Oct 11, 2024 pm 12:17 PM

Python ist aufgrund seiner einfachen Erlernbarkeit und leistungsstarken Funktionen eine ideale Einführungssprache in die Programmierung für Anfänger. Zu seinen Grundlagen gehören: Variablen: werden zum Speichern von Daten (Zahlen, Zeichenfolgen, Listen usw.) verwendet. Datentyp: Definiert den Datentyp in der Variablen (Ganzzahl, Gleitkomma usw.). Operatoren: werden für mathematische Operationen und Vergleiche verwendet. Kontrollfluss: Kontrollieren Sie den Fluss der Codeausführung (bedingte Anweisungen, Schleifen).

Java leicht gemacht: Ein Leitfaden für Anfänger zur Programmierleistung Java leicht gemacht: Ein Leitfaden für Anfänger zur Programmierleistung Oct 11, 2024 pm 06:30 PM

Java leicht gemacht: Ein Leitfaden für Anfänger zur leistungsstarken Programmierung Java ist eine leistungsstarke Programmiersprache, die in allen Bereichen von mobilen Anwendungen bis hin zu Systemen auf Unternehmensebene verwendet wird. Für Anfänger ist die Syntax von Java einfach und leicht zu verstehen, was es zu einer idealen Wahl zum Erlernen des Programmierens macht. Grundlegende Syntax Java verwendet ein klassenbasiertes objektorientiertes Programmierparadigma. Klassen sind Vorlagen, die zusammengehörige Daten und Verhaltensweisen organisieren. Hier ist ein einfaches Java-Klassenbeispiel: publicclassPerson{privateStringname;privateintage;

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

So konvertieren Sie PDF in Word So konvertieren Sie PDF in Word Apr 30, 2024 pm 05:58 PM

1. Verwenden Sie Online-Konvertierungstools wie Smallpdf, Adobe Acrobat oder Zamzar. 2. Diese Tools bieten normalerweise eine benutzerfreundliche Oberfläche, die es Benutzern ermöglicht, PDF-Dateien hochzuladen und diese optional in das Word-Format zu konvertieren. 3. Nachdem die Konvertierung abgeschlossen ist, können Benutzer das Word-Dokument herunterladen und weitere Bearbeitungen vornehmen. 4. Verwenden Sie professionelle PDF-Konvertierungssoftware wie Adobe Acrobat Pro oder Wondershare PDFelement.

Problemlösung mit Python: Erschließen Sie leistungsstarke Lösungen als Programmieranfänger Problemlösung mit Python: Erschließen Sie leistungsstarke Lösungen als Programmieranfänger Oct 11, 2024 pm 08:58 PM

Python unterstützt Anfänger bei der Problemlösung. Seine benutzerfreundliche Syntax, umfangreiche Bibliothek und Funktionen wie Variablen, bedingte Anweisungen und Schleifen ermöglichen eine effiziente Codeentwicklung. Von der Datenverwaltung über die Steuerung des Programmablaufs bis hin zur Ausführung wiederkehrender Aufgaben bietet Python

C entmystifizieren: Ein klarer und einfacher Weg für neue Programmierer C entmystifizieren: Ein klarer und einfacher Weg für neue Programmierer Oct 11, 2024 pm 10:47 PM

C ist eine ideale Wahl für Anfänger, um die Systemprogrammierung zu erlernen. Es enthält die folgenden Komponenten: Header-Dateien, Funktionen und Hauptfunktionen. Ein einfaches C-Programm, das „HelloWorld“ drucken kann, benötigt eine Header-Datei mit der Standard-Eingabe-/Ausgabe-Funktionsdeklaration und verwendet zum Drucken die printf-Funktion in der Hauptfunktion. C-Programme können mit dem GCC-Compiler kompiliert und ausgeführt werden. Nachdem Sie die Grundlagen beherrschen, können Sie mit Themen wie Datentypen, Funktionen, Arrays und Dateihandhabung fortfahren, um ein kompetenter C-Programmierer zu werden.

See all articles