ABCpdf.NET 的简易使用指南
簡單介紹
? iTextSharp是一個很強大的動態(tài)創(chuàng)建pdf的工具, 可是缺少一個可以直接轉(zhuǎn)換html到pdf的功能, 而這個功能用ABCpdf.NET輕而易舉的實現(xiàn), 特此向大家介紹一下ABCpdf的用法
? 當(dāng)然, iTextSharp是免費的, ABCpdf是需要付費的
First, 我們要把ABCpdf這個dll加入到工程的引用
Secod,? 然后using其命名空間
??using?WebSupergoo.ABCpdf5.Objects;
??using?WebSupergoo.ABCpdf5.Atoms;?
安裝和分發(fā):
ABCpdf的功能全部是2個DLL提供的
ABCpdfCE5.DLL 核心引擎庫
ABCpdf.DLL dotNET接口庫
它的安裝程序會自動的把ABCpdf.dll加入到GAC, 把ABCpdfCE5.dll復(fù)制到System32目錄下
對于我們開發(fā)來說,最簡單的莫過于將這2個DLL都放置到BIN目錄下即可
開始使用:?
?
XSettings.License?=?"change?this?text?to?your?key";?//分發(fā)正式程序的時候需要設(shè)置License如果是分發(fā)演示程序, 則可以設(shè)置為從PDFSettings這個程序里取得的試用授權(quán)碼
??? theDoc.SetInfo(0,?"License",?"cd9b5c07db69df2bf57c0a04d9bca58b10c44889c9fb197984e592f49addfce5ec5fe85d7b9205bc");字體和語言
如果你要輸出的是英文文檔,一般直接用其內(nèi)置的基本字體就可以了。
基本字體包括:
? Times-Roman
? Times-Bold
? Times-Italic
? Times-BoldItalic
? Helvetica
? Helvetica-Bold
? Helvetica-Oblique
? Helvetica-BoldOblique
? Courier
? Courier-Bold
? Courier-Oblique
? Courier-BoldOblique
? Symbol
? ZapfDingbats
pdf的中文字體有2種實現(xiàn),一種是內(nèi)嵌字體(Embed),就是把用到的漢字的字體部分保存到pdf,這樣即使在沒有安裝那種字體的機器上也能看到正確的字體顯示,優(yōu)點是文檔在不同機器上的效果都能保持一致, 且顯示的效率也比較高, 缺點就是文檔會變大一點, 嵌入字體的時候可以通過設(shè)置subset來確定是否嵌入整個字體還是只有用到的部分?
??int?theFont?=?theDoc.EmbedFont("Verdana",?"Latin",?false,?true);??theDoc.FontSize?=?12;?//設(shè)置默認(rèn)字體大小
這句表示嵌入一個Verdana的拉丁字體, false 代表水平顯示, true 代表嵌入子集(這個我也沒搞太明白)
theFont是返回字體的Object ID,這個ID可以直接賦給theDoc.Font來設(shè)置其為默認(rèn)字體
另一種是引用字體(Refs), 這種方式因為是引用, 所以不會導(dǎo)致文檔變大, 但是引用的方式必須要求觀看文檔的時候需要用較新版本的Acrobat (Reader), 并且必須安裝有語言包才能正確顯示文檔
加入引用隸書這個中文字體, ChineseS是代表簡體中文, 還有: Latin, Unicode, Korean, Japanese, ChineseT可以選擇
字體的名字還可以用其英文(eg: LiSu)或文件名(eg: SIMLI.TTF)指示
坐標(biāo)系
pdf的坐標(biāo)系不同于Windows所用的左上為原點的坐標(biāo)系, 它是采用左下為坐標(biāo)原點的, 如果你實在不習(xí)慣使用這種坐標(biāo),你可以通過設(shè)置Doc的TopDown為true來改變原點的位置
Doc.Rect屬性可能是最重要的屬性了, 如果要輸出什么東西的話, 都是輸出到Rect所指定的矩形范圍內(nèi)
ABCpdf默認(rèn)的文檔大小為612x792 pixel,也就是8.5x11 inch, 默認(rèn)DPI為72
HTML / CSS 呈現(xiàn)
ABCpdf完全支持HTML和CSS
ABCpdf使用Internet Explorer的HTML引擎來解析和預(yù)處理要插入到pdf的HTML
屏幕的解析度通常是96 dpi, 而pdf的dpi為72, 因此打印出來的文檔會比屏幕上看到的要大
你可以使用CSS中的page-break-before, page-break-after 和 page-break-inside來控制分頁, 但是需要注意以下的代碼:?
... 會分頁 ...??
??<div?style="page-break-before:always"></div> ... 則不會分頁, 我估計是因為空對象被優(yōu)化掉了
下面的代碼演示如何轉(zhuǎn)換html到pdf?
??//Rect默認(rèn)是文檔整個頁面大小,?這里的Inset表示將Rect左右留出24的空白,上下留出48的空白
??int?theID?=?theDoc.AddImageUrl(edtURL.Text);
??while?(true)
??{
????if?(!theDoc.Chainable(theID))
??????break;
????theDoc.Page?=?theDoc.AddPage();
????theID?=?theDoc.AddImageToChain(theID);
??}
后面的這個循環(huán)很重要, 不然的話, 就只能把html輸出到一頁, 這一點不像iTextSharp是自動分頁的
把一個復(fù)雜內(nèi)容輸出為多頁, 都要采用這種循環(huán)加入Chain的方式, 比如需要添加很長一段的html或text
代碼很簡單, 無需多說, 需要注意的是HTML不管動態(tài)的還是靜態(tài)的, 都應(yīng)該沒有問題, 但是如果是類似BBS之類基于Cookie的動態(tài)頁面的話, 會取不到需要的頁面的
再補充一點, 因為ABCpdf.NET本身是具有緩存設(shè)計的, 其獲得網(wǎng)頁是通過IE來獲取的, 因此轉(zhuǎn)換動態(tài)HTML的時候, 有可能會遇到?jīng)]有更新的問題, 具體的描述請參閱幫助, 我就不多費口舌了
圖像處理
用ABCpdf展現(xiàn)圖片有2種方式, 一種是直通模式, 直接把圖片添加到Doc對象里, 比如使用 Doc.AddImageFile, Doc.AddImageData方法
另一種是是非直接的方式, 在添加圖像對象到文檔之前, 先把數(shù)據(jù)畫到圖像對象里
相比之下, 非直接的方式有以下優(yōu)點
因為每張圖在轉(zhuǎn)換為圖像對象的時候就已經(jīng)完全解碼, 因此在這個時候就能夠捕獲到圖像文件格式無效之類的錯誤, 雖然有問題的圖像不是經(jīng)常遇到, 但是如果你使用直通模式的話, 則很有可能導(dǎo)致pdf把有問題的圖像文件包含進去, 從而導(dǎo)致pdf文檔在瀏覽的時候報告錯誤
當(dāng)然使用直通模式不需要解壓和壓縮圖像, 會比非直接模式執(zhí)行速度要快
Image對象一般使用Flate來壓縮, 這種壓縮方式與PNG圖像的壓縮方法一樣, 這是一種無損的壓縮方法, 這樣可以保證圖像的品質(zhì)不會變差, 如果加入的圖像是黑白的, ABCpdf會使用CCITT G4 fax壓縮, 這種方法可以顯著的減小圖像的大小
下面這段代碼就是采用的非直接模式來添加一個圖像到指定的位置
??theImg.SetFile(@"C:\Cover.jpg");
??theDoc.TopDown?=?true;
??theDoc.Rect.Left?=?100;
??theDoc.Rect.Top?=?100;
??theDoc.Rect.Width?=?theImg.Width;
??theDoc.Rect.Height?=?theImg.Height;
??theDoc.Rect.Magnify(2,?2);??//把圖像放大2倍
??theDoc.AddImageObject(theImg,?false);
Grid & Rect?
??theDoc.Page?=?theDoc.AddPage();?//準(zhǔn)備輸出內(nèi)容到新的一頁??theDoc.AddGrid();?//這個是讓頁面輸出類似坐標(biāo)紙樣的表格,?可以幫助開發(fā)者更好地定位輸出
??theDoc.Color.String?=?"0?255?0";?//設(shè)置默認(rèn)顏色為綠色
??theDoc.Width?=?4;?//?這個是設(shè)置刷子的寬度為4
??theDoc.Rect.Position(100,?200);?//指定左下角輸出位置為100,200
??theDoc.Rect.Width?=?400;
??theDoc.Rect.Height?=?500;
??theDoc.FrameRect();?//畫Rect的邊框
Header & Footer
如果我們是用PDF作為報表輸出的話, 當(dāng)然需要在每一頁上出現(xiàn)表頭和頁腳
??theDoc.HPos?=?0.5;?//居中,?0代表居左,?1代表居右
??theDoc.VPos?=?0.5;?//居中,?0代表靠上,?1代表靠下
??theDoc.Color.String?=?"0?0?255";?//藍色
??for?(int?i?=?1;?i?<=?theDoc.PageCount;?i++)
??{
????theDoc.PageNumber?=?i;
????theDoc.AddHtml("this?is?<b><font?pid="?+?theFont.ToString()?+?">header</font></b>");
????//?ABCpdf支持html語法,?這里的font標(biāo)簽可以讓你選擇使用不同的字體輸出
????theDoc.AddLine(24,?750,?588,?750);?//畫一條分隔線
??}
畫頁腳和畫頁頭是一樣的, 主要就是位置和內(nèi)容有不同
??theDoc.Rect.String?=?"24?12?588?40";??theDoc.HPos?=?1.0;?//Right
??theDoc.VPos?=?0.5;?//Middle
??theDoc.Color.String?=?"0?0?255";
??for?(int?i?=?1;?i?<=?theDoc.PageCount;?i++)?
??{
????theDoc.PageNumber?=?i;
????theDoc.AddHtml("<u>this?is?footer</u>?"?+?i.ToString()?+?"?/?"?+?theDoc.PageCount.ToString());
????theDoc.AddLine(24,?40,?588,?40);
??}
壓縮pdf
在輸出完所要輸出的內(nèi)容后, 我們可以調(diào)用Flatten來對生成的文檔壓縮一下, 因為加入的對象是分布在不同的層上, 所以調(diào)用這個函數(shù)可以合并當(dāng)前頁上的所有層, 同時重新壓縮層上的數(shù)據(jù)
如果頁面上的對象比較少的話, 壓縮后是看不出有明顯的效果, 但是如果頁面上是有很復(fù)雜的表格之類的話, 壓縮率甚至可以高達5倍以上
需要注意的是, 壓縮之后, 之前保存的Object ID會不再有效, 因為對象已經(jīng)被重新生成, 所以壓縮操作最好放到最后來做?
??{
????theDoc.PageNumber?=?i;
????theDoc.Flatten();
??}
更高級的應(yīng)用
ABCpdf還支持用AddMovies在pdf中嵌入Flash(SWF), AVI, MPEG和WMV
ABCpdf支持創(chuàng)建電子表單, 不過這已經(jīng)超過我使用的目的了, 因為我要做的是用pdf輸出報表
此外, 我感到不方便的就是,似乎ABC.net沒有去封裝文檔屬性里面的東西, 比如title, subject, author, 而是直接提供的Doc.SetInfo來修改, 而這個方法用起來不是很方便, 因為你必須要先了解Adobe PDF Specification, 才能用正確, 這一點上遠不如iTextSharp方便
ok, 就這么多了,寫這個東西已經(jīng)花了我不少的時間了
轉(zhuǎn)載于:https://www.cnblogs.com/Icebird/archive/2006/04/27/ABCpdfdotNETManual.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的ABCpdf.NET 的简易使用指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转帖] 世间什么才是最珍贵的?
- 下一篇: 流浪:从南海到北海,面朝大海,春暖花开。