Quartz 2D编程指南(14)
咳咳。。。。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文件。
你可以通过访问PDF的元数据获得更多有用的信息。图14-1只是一个示例。例如,您可以通过使用图14-1中的代码检查一个PDF是否有缩略图(见图14-2)。
清单 14-1 得到PDF的缩略视图
CGPDFDictionaryRef d; Salin selepas log masuk |
CGPDFStreamRef stream; // represents a sequence of bytes Salin selepas log masuk |
d = CGPDFPageGetDictionary(page); Salin selepas log masuk |
// check for thumbnail data Salin selepas log masuk |
if (CGPDFDictionaryGetStream (d, “Thumb”, &stream)){ Salin selepas log masuk |
// get the data if it exists Salin selepas log masuk |
data = CGPDFStreamCopyData (stream, &format); Salin selepas log masuk |
Quartz为你执行了所有数据流的解密和解密工作。
图 14-2 缩略图片
Quartz提供了很多的功能,您可以使用它来获得PDF的元数据中对应项的指定值。例如,您使用函数CGPDFObjectGetValue,传入一个CGPDFObjectRef,和一个PDF对象类型(kCGPDFObjectTypeBoolean, kCGPDFObjectTypeInteger, 等等),以及一个存储值的存储空间。返回时,此存储空间就被得到的值填充了。
还有很多其他的函数可以用来遍历PDF文件的层次结构来访问各个节点和他们的子节点。例如,CGPDFArray函数(CGPDFArrayGetBoolean, CGPDFArrayGet Dictionary, CGPDFArrayGetInteger,等等) 允许您访问数组的值,以检索特定类型的值。你可以通过阅读阅读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 |
标志着一个以BMC或BDC |
为操作符编写回调方法
当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 Salin selepas log masuk |
op_MP (CGPDFScannerRef s, void *info) Salin selepas log masuk |
{ Salin selepas log masuk |
const char *name; Salin selepas log masuk |
Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
if (!CGPDFScannerPopName(s, &name)) Salin selepas log masuk |
return; Salin selepas log masuk |
Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
printf("MP /%s\n", name); Salin selepas log masuk |
} Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
创建并设置操作表
一个CGPDFOperatorTable对象存储了你编写的PDF操作符回调函数。函数CGPDFOperatorTableCreate创建了一个操作符表,如清单14-3所示。当你创建了一个操作符表之后,你要为每个你要加入到表中的回调方法调用函数 CGPDFOperatorTableSetCallback。你传入了操作表,指定PDF操作符的字符串,以及一个你编写用来处理指定操作符的回调函数的指针。你可以随意命名这些回调函数。只要确保回调函数的名字和你传入CGPDFOperatorTableSetCallback函数的名字是相同的即可。
代码清单14-3为表14-1中列出的每个标记-文本操作符 设置了一个回调方法。你的应用应该为你感兴趣的那些操作符设置回调方法。PDF操作符字符串由Adobe PDF Reference 制定。
清单 14-3 为操作表设置回调方法
CGPDFOperatorTableRef myTable; Salin selepas log masuk |
Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
myTable = CGPDFOperatorTableCreate(); Salin selepas log masuk |
Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
CGPDFOperatorTableSetCallback (myTable, "MP", &op_MP); Salin selepas log masuk |
CGPDFOperatorTableSetCallback (myTable, "DP", &op_DP); Salin selepas log masuk |
CGPDFOperatorTableSetCallback (myTable, "BMC", &op_BMC); Salin selepas log masuk |
CGPDFOperatorTableSetCallback (myTable, "BDC", &op_BDC); Salin selepas log masuk |
CGPDFOperatorTableSetCallback (myTable, "EMC", &op_EMC); Salin selepas log masuk |
打开PDF文档
在你扫描PDF文档之前,你必须打开它。清单14-4 展示了 从代码中提供的URL创建一个CGPDFDocument对象的代码片段。注意此清单只是一个代码段,所以不是所有变量都定义了。此清单中用数字标注的代码行都有详细的解释。
清单 14-4 从一个URL打开一个PDF文档
CGPDFDocumentRef myDocument; Salin selepas log masuk |
myDocument = CGPDFDocumentCreateWithURL(url);<span>// 1</span> Salin selepas log masuk |
if (myDocument == NULL) {<span>// 2</span> Salin selepas log masuk |
error ("can't open `%s'.", filename); Salin selepas log masuk |
CFRelease (url); Salin selepas log masuk |
return EXIT_FAILURE; Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
} Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
CFRelease (url); Salin selepas log masuk |
if (CGPDFDocumentIsEncrypted (myDocument)) {<span>// 3</span> Salin selepas log masuk |
if (!CGPDFDocumentUnlockWithPassword (myDocument, "")) { Salin selepas log masuk |
printf ("Enter password: "); Salin selepas log masuk |
fflush (stdout); Salin selepas log masuk |
password = fgets(buffer, sizeof(buffer), stdin); Salin selepas log masuk |
if (password != NULL) { Salin selepas log masuk |
buffer[strlen(buffer) - 1] = '\0'; Salin selepas log masuk |
if (!CGPDFDocumentUnlockWithPassword (myDocument, password)) Salin selepas log masuk |
error("invalid password."); Salin selepas log masuk |
} Salin selepas log masuk |
} Salin selepas log masuk Salin selepas log masuk |
} Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
if (!CGPDFDocumentIsUnlocked (myDocument)) {<span>// 4</span> Salin selepas log masuk |
error("can't unlock `%s'.", filename); Salin selepas log masuk |
CGPDFDocumentRelease(myDocument); Salin selepas log masuk |
return EXIT_FAILURE; Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
} Salin selepas log masuk Salin selepas log masuk |
} Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
if (CGPDFDocumentGetNumberOfPages(document) == 0) {<span>// 5</span> Salin selepas log masuk |
CGPDFDocumentRelease(document); Salin selepas log masuk |
return EXIT_FAILURE; Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
} Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
此处代码做了哪些:
1. 利用代码中提供的URL创建一个CGPDFDocument对象。
2. 检查以确保CGPDFDocument对象被创建。如果没有,代码退出,因为没有document继续执行没有意义。
3. 检查document是否加密。如果document加密,则代码试图利用空密码打开文档。如果失败,代码要求用户提供密码并试图用此密码解锁文档。
4. 检查document是否解锁,如果没有,代码退出。
5. 检查以确保document至少有一页,否则,代码退出。
扫描每页的内容流
清单14-5 代码段扫描文档每一页。当此scanner遇到一个注册了回调方法的PDF操作符,Quartz就调用此回调方法。此清单中用数字标注的代码行都有详细的解释。
清单 14-5 扫描文档的每一页
int k; Salin selepas log masuk |
CGPDFPageRef myPage; Salin selepas log masuk |
CGPDFScannerRef myScanner; Salin selepas log masuk |
CGPDFContentStreamRef myContentStream; Salin selepas log masuk |
Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk Salin selepas log masuk |
numOfPages = CGPDFDocumentGetNumberOfPages (myDocument);<span>// 1</span> Salin selepas log masuk |
for (k = 0; k Salin selepas log masuk |
myPage = CGPDFDocumentGetPage (myDocument, k + 1 );<span>// 2</span> Salin selepas log masuk |
myContentStream = CGPDFContentStreamCreateWithPage (myPage);<span>// 3</span> Salin selepas log masuk |
myScanner = CGPDFScannerCreate (myContentStream, myTable, NULL);<span>// 4</span> Salin selepas log masuk |
CGPDFScannerScan (myScanner);<span>// 5</span> Salin selepas log masuk |
CGPDFPageRelease (myPage);<span>// 6</span> Salin selepas log masuk |
CGPDFScannerRelease (myScanner);<span>// 7</span> Salin selepas log masuk |
CGPDFContentStreamRelease (myContentStream);<span>// 8</span> Salin selepas log masuk |
} Salin selepas log masuk |
CGPDFOperatorTableRelease(myTable); Salin selepas log masuk |
此处代码解释:
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

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara mengalih keluar nilai pendua daripada tatasusunan PHP menggunakan ungkapan biasa: Gunakan ungkapan biasa /(.*)(.+)/i untuk memadankan dan menggantikan pendua. Lelaran melalui elemen tatasusunan dan semak padanan menggunakan preg_match. Jika ia sepadan, langkau nilai jika tidak, tambahkannya pada tatasusunan baharu tanpa nilai pendua.

1. Pengaturcaraan boleh digunakan untuk membangunkan pelbagai perisian dan aplikasi, termasuk tapak web, aplikasi mudah alih, permainan dan alat analisis data. Bidang aplikasinya sangat luas, meliputi hampir semua industri, termasuk penyelidikan saintifik, penjagaan kesihatan, kewangan, pendidikan, hiburan, dll. 2. Pembelajaran pengaturcaraan boleh membantu kita meningkatkan kemahiran menyelesaikan masalah dan kemahiran berfikir logik. Semasa pengaturcaraan, kita perlu menganalisis dan memahami masalah, mencari penyelesaian dan menterjemahkannya ke dalam kod. Cara berfikir ini boleh memupuk kebolehan analitikal dan abstrak kita dan meningkatkan keupayaan kita untuk menyelesaikan masalah praktikal.

Python ialah bahasa pengenalan pengaturcaraan yang ideal untuk pemula melalui kemudahan pembelajaran dan ciri yang berkuasa. Asasnya termasuk: Pembolehubah: digunakan untuk menyimpan data (nombor, rentetan, senarai, dll.). Jenis data: Mentakrifkan jenis data dalam pembolehubah (integer, titik terapung, dll.). Operator: digunakan untuk operasi matematik dan perbandingan. Aliran kawalan: Kawal aliran pelaksanaan kod (penyataan bersyarat, gelung).

Java Made Simple: Panduan Permulaan untuk Kuasa Pengaturcaraan Pengenalan Java ialah bahasa pengaturcaraan berkuasa yang digunakan dalam segala-galanya daripada aplikasi mudah alih hingga sistem peringkat perusahaan. Untuk pemula, sintaks Java adalah ringkas dan mudah difahami, menjadikannya pilihan ideal untuk pembelajaran pengaturcaraan. Sintaks Asas Java menggunakan paradigma pengaturcaraan berorientasikan objek berasaskan kelas. Kelas ialah templat yang menyusun data dan tingkah laku yang berkaitan bersama-sama. Berikut ialah contoh kelas Java yang mudah: publicclassPerson{privateStringname;privateintage;

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.

1. Gunakan alat penukaran dalam talian seperti Smallpdf, Adobe Acrobat atau Zamzar. 2. Alat ini biasanya menyediakan antara muka yang ringkas dan mudah digunakan, membolehkan pengguna memuat naik fail PDF dan menukarnya kepada format Word secara pilihan. 3. Selepas penukaran selesai, pengguna boleh memuat turun dokumen Word dan melakukan penyuntingan selanjutnya. 4. Gunakan perisian penukaran PDF profesional, seperti Adobe Acrobat Pro atau Wondershare PDFelement.

Pythonmemperkasakan pemula dalam menyelesaikan masalah.Sintaksnya yang mesra pengguna, perpustakaan luas, dan ciri-ciri seperti pembolehubah, pernyataan bersyarat, dan pembangunan kod yang cekap boleh dilonggarkan. Daripada mengurus data untuk mengawal aliran program dan melaksanakan tugasan berulang, Pythonprovid

C ialah pilihan ideal untuk pemula untuk mempelajari pengaturcaraan sistem Ia mengandungi komponen berikut: fail pengepala, fungsi dan fungsi utama. Program C mudah yang boleh mencetak "HelloWorld" memerlukan fail pengepala yang mengandungi pengisytiharan fungsi input/output standard dan menggunakan fungsi printf dalam fungsi utama untuk mencetak. Program C boleh disusun dan dijalankan dengan menggunakan pengkompil GCC. Selepas anda menguasai asas, anda boleh beralih kepada topik seperti jenis data, fungsi, tatasusunan dan pengendalian fail untuk menjadi pengaturcara C yang mahir.
