原創|其它|編輯:郝浩|2012-10-17 14:21:06.000|閱讀 1465 次
概述:本文簡單介紹了PDFLib生成PDF文檔(C語言版)的基本使用方法。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
本文簡單介紹了PDFLib生成PDF文檔(C語言版)的基本使用方法。
① 打開、關閉、文檔信息設定:
新建PDFLib對象,PDF_new()
設定錯誤處理的方式,PDF_set_parameter(p, "errorpolicy", "return"),return標示當發生錯誤時直接從Lib函數中返回。
設定文檔信息,PDF_set_value()
新建一個PDF文件,PDF_begin_document()
新建一個頁面,PDF_begin_page_ext()
關閉一個頁面,PDF_end_page_ext()
關閉PDF文件,PDF_end_document()
釋放PDFLib對象,PDF_delete()
例外處理,PDF_TRY()和PDF_CATCH()
② 示例代碼:
#include <stdio.h> #include "pdflib.h" int main(int argc, char *argv[]) { Example(); return 0; } int Example(void) { PDF *p; if ((p = PDF_new()) == (PDF *) 0){ printf("Couldn't create PDFlib object (out of memory)!/n"); return(2); } PDF_TRY(p) { /* This means we must check return values of load_font() etc. */ PDF_set_parameter(p, "errorpolicy", "return"); if (PDF_begin_document(p, "d://hello.pdf", 0, "") == -1) { printf("Error: %s/n", PDF_get_errmsg(p)); return(2); } /* This line is required to avoid problems on Japanese systems */ PDF_set_parameter(p, "hypertextencoding", "host"); PDF_set_parameter(p, "fakebold", "true"); PDF_set_info(p, "Creator", "hello.c"); PDF_set_info(p, "Author", "Thomas Merz"); PDF_set_info(p, "Title", "Hello, world (C)!"); PDF_begin_page_ext(p, a4_width, a4_height, ""); PDF_setcolor(p, "fill", "cmyk", 1, 0,0,0); PDF_rect(p, 250,250, 100, 50); PDF_fill(p); PDF_end_page_ext(p, ""); PDF_end_document(p, ""); } PDF_CATCH(p) { printf("PDFlib exception occurred in sample:/n"); printf("[%d] %s: %s/n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); getchar(); return(2); } PDF_delete(p); return 0; }
① 加載字體
使用PDF_load_font()函數。目前在Windows 平臺下,似乎只能加載可以安裝到Windows系統中的字體。
如果加載已經安裝到系統中的字體(在C:/windows/fonts文件夾下),可以直接通過字體的名字加載,如:
font = PDF_load_font(p, "MS UI Gothic", 0, "host", ""); font = PDF_load_font(p, "MKZ2", 0, "unicode", "");
也可以通過制定字體文件加載字體,如:
PDF_set_parameter(p, "FontOutline", "MKZ2=C://windows//fonts// MKZ2.ttf"); font= PDF_load_font(p, "MKZ2", 0, "unicode", "");
"host"和"unicode"是用于字體編碼的方式,host日文系統下具體與代碼頁cp932等相關,中文系統下與cp936相關。Unicode與PDF所規定的CMAP文件相關,如:UniJIS-UCS2-H、EUC-H等的編碼文件。因為字體已經安裝到了Windows系統中,具體的字體編碼方式,操作系統能夠自動處理,無需我們顯式的指定。
加載字體是一件很耗費時間的工作,大概能占到整個處理的1/4左右。PDFLib已經作了些優化,當一個字體只要加載過一次,再次加載就會使用前面產生的字體句柄,不再重新生成。
PDFLIb加載字體時默認是嵌入的,這樣會增大輸出的PDF文件。好處是當文件被移動到其他系統上時,打開文件時不受字體的影響,否則,打開文件前需要先安裝字體。我們這次的項目,生成的PDF文件需要用FTP轉送到Solaris系統,并且要送入打印機,所以必須以嵌入方式加載的字體。
② 設置字體
使用PDF_setfont()函數,如:
PDF_setfont(p, font, 30);
30指的是字號,也就是字體的高度。但這個和系統的縮放比例相關。如果設字體前設定系統的縮放比例為2,實際輸出的字體的高度為60個單位。PSEdit的字體的輸出過程中,絕大部分采用的是變換系統坐標的方法來確定字體的大小,所以編程中使用了PDF_setfont(p, font, 1)的方式,即字體的大小為當前系統的縮放比例的值相同。
③ 文字輸出
PDFLib的文字處理,較PostScript而言,加強了功能,增加了大量文字及段落等的處理。但本次PSEdit編程中,受于以前軟件框架的限制,只使用了單字輸出的功能PDF_info_textline(),盡管這個函數也能用于輸出一個字符串。
PDF_info_textline函數有個選項列表,提供的功能相當豐富。基本上覆蓋了對字體的所有的變化和變形。如:傾斜、旋轉、縮放、著色、偏移以及指定字體等等。
④ 文字陰影
采用在相互錯開的位置上輸出兩次同樣的字符,實現陰影。
⑤ 空心字
通過指定PDF_info_textline函數的三個選項參數textrendering、strokewidth 、strokecolor來實現。如輸出空心字,邊緣寬1個單位,邊緣色為青色,邊緣線圓頭連接:
PDF_setlinejoin(p, 1); PDF_fit_textline(p, "ABCDEF", 0, 50, 550, "textrendering=1 strokewidth=1 strokecolor={CMYK 1 0 0 0}");
⑥ 立體字和藝術字,這個屬于描畫字的范圍,輸出方式是組合起來的多組直線和曲線,線段封閉后,剪切區域形成字體的輪廓區域,然后再用某中顏色或填充模式進行填充。所以每一個立體字和藝術字,都是一個復雜的剪切圖形。
① 圖像的輸出使用PDF_load_image和PDF_fit_image,輸出圖像變得相當簡單了。當然,簡單的副作用就是,限制了許多對所加載的圖像的處理功能。保留的幾個功能是:著色,縮放,旋轉。這似乎對一般的PDF文件也足夠了。
② 圖像的最小網點,似乎只是報紙打印行業為了使圖像不失真而采取的一種特殊的圖像離散化處理。這種處理功能在很通用的圖像處理中間件LeadTools中沒有提供,可見最小網點并非一種普遍適用的圖像處理手段,應該在更為專業性的圖像處理工具中才有。
① 路徑(path),指的是某個特定區域的邊界。路徑是任何圖形的基礎。
② 能夠長生路徑的操作事實上只有兩種:畫直線(PDF_moveto,PDF_lineto)和畫曲線(圓PDF_circle、弧PDF_arc和PDF_arcn、曲線PDF_curveto)
③ 描邊(PDF_stroke),沿路經使用指定的顏色(PDF_setcolor)和指定的線寬(PDF_setlinewidth)進行著色。
④ 填充(PDF_fill),首先關閉路徑(PDF_closepath把最后一個點和開始點連接直線),然后用指定的顏色(PDF_setcolor)對封閉區域著色。
⑤ 梯度填充(PDF_shfill),是從一種顏色平滑過渡到令一種顏色的填充。填充前先需要生成顏色模式(PDF_shading)。例如梯度填充一個矩形,顏色為從藍色從紅色過渡:
PDF_setcolor(p, "fill", "cmyk", 1, 0, 0, 0); PDF_rect(p, 200 , 500, 200, 100); PDF_clip(p); handle = PDF_shading( p, "axial", 210, 550, 350, 550, 0, 1, 0, 0,"extend0=true extend1=true N=1" ); PDF_shfill( p, handle );
要實現多組顏色梯度填充,只能把區域安相關顏色分成多個區域,每個區域安兩種顏色填充。
⑥ 剪切(PDF_clip),把當前封閉的區域獨立出來,任何超出這個剪切區域的操作都將無效。剪切,尤其是復雜區域的剪切是圖形圖像處理中的高級處理,其低層實現需要極高超的編程技巧和理論水平。剪切處理應當說是PostScript和PDF中最具有技術含量的部分。
剪切時值得注意的是,要恢復到前切前的狀態,只能使用PDF_save和PDF_restore完成。
⑦ 坐標變換:位移(PDF_translate)、旋轉(PDF_rotate)、縮放(PDF_scale)、歪斜(PDF_skew)、應用轉換矩陣(PDF_concate)。這種對于應用者而言比較簡單的坐標系統,其實是整個系統的精華所在,它為各種形式的圖形表現,提供的最基本和堅實的支持。
① 把其他的PDF文件的頁嵌入到當前的PDF文件中,可以指定位置、大小、旋轉,但無法改變顏色。例:
handle = PDF_open_pdi_document(p, "d://font.pdf", 0, ""); if (handle == -1) { printf("Error: %s/n", PDF_get_errmsg(p)); return(2); } page = PDF_open_pdi_page(p, handle, 1, ""); if (handle == -1) { printf("Error: %s/n", PDF_get_errmsg(p)); return(2); } PDF_fit_pdi_page(p, page, 50, 150, ""); PDF_close_pdi_page(p, page); PDF_close_pdi_document(p, handle);
① CMYK色:和本次開發相關的顏色空間是CMYK色彩空間。顏色的值為0~1,全部為0標示白色,全部為1表示黑色。
② 專色:和這個名字反映出來的意思一樣,就是某種特殊的顏色。一般都和打印機相關,指某種超出打印機混合色之外的顏色。
在PSEdit的改造過程中使用了兩個(但不一定都用了)自定義的特色:S1和S2。沒有使用其他的(如工業標準定義的)特色。但為什么要這么做,我還無法理解,也許僅僅是為了分版的需要,
③ 在PDFLib中,每一個特色都得按一個顏色空間的級別對待。比如畫一條線,除了基本的CMYK色要畫一次外,應用幾個特色,就需要重畫幾次,在PDF文件中,可以設定OverPrint屬性,來查看最終的(混合色)顯示效果。
④ 例:
調用內置專色:
handle = PDF_makespotcolor(p, "PANTONE 871 C", 0); PDF_setcolor(p, "stroke", "spot", handle, 0.5, 0, 0); PDF_moveto(p, 100, 620); PDF_lineto(p, 250, 620); PDF_stroke(p);
生成自定義專色:
PDF_setcolor(p, "stroke", "cmyk", 0, 0, 1, 0); handle = PDF_makespotcolor(p, "S1", 0); PDF_setcolor(p, "stroke", "spot", handle, 0.4, 0, 0); PDF_moveto(p, 100, 620); PDF_lineto(p, 250, 620); PDF_stroke(p);
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:Yzhuang的專欄-CSDN