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