一步一步教你寫pdf檔案

2021-06-11 15:57:27 字數 1466 閱讀 9616

pdf作為一種跨平台的檔案格式,越來越受到使用者的歡迎。現在除了adobe官方提供的pdflib有很多第三方的庫可以實現pdf的檔案建立、修改、格式轉換。pdf文件採用的是二進位制和文字混排的方式。近期專案需要,對pdf檔案的結構做了一些研究。最終,領導決定採用第三方庫,沒能用得上。在此,跟大家分享一下,算是拋磚引玉。關於pdf檔案的結構網上有很多介紹,在此不在贅述,請參看。

由於pdf檔案的解析中需要依靠交叉引用表,交叉引用表記錄的是每乙個obj相對於檔案始點的位置(以後稱「位址」),我們可以寫乙個函式,求出當前檔案的位置。

long getobjlocation(file* pfile)

隨著iso標準的變化,pdf的檔案格式也有一些調整。檔案開始的地方標明檔案對應的版本格式。

void writeheader(file* pfile,vector& pdflocation)

解析pdf檔案時,首先會從入口點開始。

void writecatalog(file* pfile,vector& pdflocation)

pdf可以有很多頁,每一頁的頁面大小、內容可以各不相同,本例中只有一頁

void writepages(file* pfile,vector& pdflocation)

建立page。

void writepage(file* pfile,vector& pdflocation)

寫入文字內容。

void writecontents(file* pfile,vector& pdflocation)

定義字型。 

void writefont(file* pfile,vector& pdflocation)

建立交叉引用表。習慣上從第0個obj開始,第0個不存在,標記為刪除。根據情況交叉引用表可以不止乙個。

void writexref(file* pfile,const vectorpdflocation)}

//單個obj的引用位址

void writeobjxref(file* pfile,long objref) 

檔案尾的寫法跟版本的關係不大,指明obj的的個數、入口點、交叉引用表的位址。

void writetraile(file* pfile,const vectorpdflocation)

最後呼叫以上函式,建立乙個完整的pdf檔案。大家可以用記事本開啟生產的pdf檔案,可以看到pdf檔案的組織形式。

void writepdf(const char *filename)

目前市面上已經有很多成熟的第三方庫,基本能滿足大家的需求。鄙人在此拋磚引玉,只是出於幫助大家一起理解pdf檔案結構的目的,不鼓勵重複造輪子。匆忙寫就,如有不當之處,歡迎拍磚。

ps:本文採用c++/cli 託管**,簡單修改可用於c#。為了排版需要,**中插入了很多空格,請不要簡單拷貝執行。

一步一步教你寫DOTA外掛程式

好久木有研究dota了,整理篇小菜文章。首先,我們要提公升外掛程式本身程式許可權,使其能夠有許可權修改war3遊戲的記憶體。這個c 可以使用如下 void enabledebugpriv 提公升程式自身許可權 tkp.privilegecount 1 tkp.privileges 0 luid se...

一步一步教你配置vnc

配置 vnc遠端桌面連線 1.在命令列輸入 init 3 進入純字元介面 2.kill 掉所有與 x有關的程序 用命令ps aux grep x 然後kill 程序號1 程序號2 只要找到的程序都 kill 掉 如果不會使用 kill 命令,直接重啟電腦 3.首先檢查 vncserver 是否安裝使...

教你一步一步用OpenGL寫遊戲 前言

這是乙個系列的教程。在這套教程裡,我將會把之前用opengl qt做過的一款遊戲和大家分享,並且從頭到尾一步步分析整個遊戲的實現過程和架構設計。關於寫這些東西的目的,我想大概有三點吧 其一是想把自己寫過的這個遊戲重新梳理一遍,認真重構重構,真正理解其中用到的技術和演算法,更加深入地把握軟體專案開發技...