原創(chuàng)|其它|編輯:郝浩|2012-10-18 14:37:59.000|閱讀 547 次
概述:iTextSharp是一個(gè)很強(qiáng)大的動(dòng)態(tài)創(chuàng)建pdf的工具, 可是缺少一個(gè)可以直接轉(zhuǎn)換html到pdf的功能, 而這個(gè)功能用ABCpdf.NET輕而易舉的實(shí)現(xiàn), 特此向大家介紹一下ABCpdf的用法。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
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; //一般加入這個(gè)聲明就夠了,下面2個(gè)基本上很少有用 using WebSupergoo.ABCpdf5.Objects; using WebSupergoo.ABCpdf5.Atoms;
安裝和分發(fā):
ABCpdf的功能全部是2個(gè)DLL提供的
它的安裝程序會(huì)自動(dòng)的把ABCpdf.dll加入到GAC, 把ABCpdfCE5.dll復(fù)制到System32目錄下
對(duì)于我們開發(fā)來(lái)說(shuō),最簡(jiǎn)單的莫過(guò)于將這2個(gè)DLL都放置到BIN目錄下即可
開始使用:
Doc theDoc = new Doc(); //創(chuàng)建一個(gè)Doc對(duì)象 XSettings.License = "change this text to your key"; //分發(fā)正式程序的時(shí)候需要設(shè)置License
如果是分發(fā)演示程序, 則可以設(shè)置為從PDFSettings這個(gè)程序里取得的試用授權(quán)碼:
theDoc.SetInfo(0, "License", "cd9b5c07db69df2bf57c0a04d9bca58b10c44889
c9fb197984e592f49addfce5ec5fe85d7b9205bc");
字體和語(yǔ)言
如果你要輸出的是英文文檔,一般直接用其內(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,這樣即使在沒(méi)有安裝那種字體的機(jī)器上也能看到正確的字體顯示,優(yōu)點(diǎn)是文檔在不同機(jī)器上的效果都能保持一致, 且顯示的效率也比較高, 缺點(diǎn)就是文檔會(huì)變大一點(diǎn), 嵌入字體的時(shí)候可以通過(guò)設(shè)置subset來(lái)確定是否嵌入整個(gè)字體還是只有用到的部分
int theFont = theDoc.EmbedFont("Verdana", "Latin", false, true); theDoc.FontSize = 12; //設(shè)置默認(rèn)字體大小
這句表示嵌入一個(gè)Verdana的拉丁字體, false 代表水平顯示, true 代表嵌入子集(這個(gè)我也沒(méi)搞太明白)
theFont是返回字體的Object ID,這個(gè)ID可以直接賦給theDoc.Font來(lái)設(shè)置其為默認(rèn)字體
另一種是引用字體(Refs), 這種方式因?yàn)槭且? 所以不會(huì)導(dǎo)致文檔變大, 但是引用的方式必須要求觀看文檔的時(shí)候需要用較新版本的Acrobat (Reader), 并且必須安裝有語(yǔ)言包才能正確顯示文檔
theDoc.Font = theDoc.AddFont("隸書", "ChineseS");
加入引用隸書這個(gè)中文字體, ChineseS是代表簡(jiǎn)體中文, 還有: 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),你可以通過(guò)設(shè)置Doc的TopDown為true來(lái)改變?cè)c(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引擎來(lái)解析和預(yù)處理要插入到pdf的HTML
屏幕的解析度通常是96 dpi, 而pdf的dpi為72, 因此打印出來(lái)的文檔會(huì)比屏幕上看到的要大
你可以使用CSS中的page-break-before, page-break-after 和 page-break-inside來(lái)控制分頁(yè), 但是需要注意以下的代碼:
<div style="page-break-before:always"> </div>
... 會(huì)分頁(yè) ...
<div style="page-break-before:always"></div>
. 則不會(huì)分頁(yè), 我估計(jì)是因?yàn)榭諏?duì)象被優(yōu)化掉了
下面的代碼演示如何轉(zhuǎn)換html到pdf
theDoc.Rect.Inset(24, 48); //Rect默認(rèn)是文檔整個(gè)頁(yè)面大小, 這里的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輸出到一頁(yè), 這一點(diǎn)不像iTextSharp是自動(dòng)分頁(yè)的
把一個(gè)復(fù)雜內(nèi)容輸出為多頁(yè), 都要采用這種循環(huán)加入Chain的方式, 比如需要添加很長(zhǎng)一段的html或text
代碼很簡(jiǎn)單, 無(wú)需多說(shuō), 需要注意的是HTML不管動(dòng)態(tài)的還是靜態(tài)的, 都應(yīng)該沒(méi)有問(wèn)題, 但是如果是類似BBS之類基于Cookie的動(dòng)態(tài)頁(yè)面的話, 會(huì)取不到需要的頁(yè)面的
再補(bǔ)充一點(diǎn), 因?yàn)锳BCpdf.NET本身是具有緩存設(shè)計(jì)的, 其獲得網(wǎng)頁(yè)是通過(guò)IE來(lái)獲取的, 因此轉(zhuǎn)換動(dòng)態(tài)HTML的時(shí)候, 有可能會(huì)遇到?jīng)]有更新的問(wèn)題, 具體的描述請(qǐ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í)候就能夠捕獲到圖像文件格式無(wú)效之類的錯(cuò)誤, 雖然有問(wèn)題的圖像不是經(jīng)常遇到, 但是如果你使用直通模式的話, 則很有可能導(dǎo)致pdf把有問(wèn)題的圖像文件包含進(jìn)去, 從而導(dǎo)致pdf文檔在瀏覽的時(shí)候報(bào)告錯(cuò)誤
當(dāng)然使用直通模式不需要解壓和壓縮圖像, 會(huì)比非直接模式執(zhí)行速度要快
Image對(duì)象一般使用Flate來(lái)壓縮, 這種壓縮方式與PNG圖像的壓縮方法一樣, 這是一種無(wú)損的壓縮方法, 這樣可以保證圖像的品質(zhì)不會(huì)變差, 如果加入的圖像是黑白的, ABCpdf會(huì)使用CCITT G4 fax壓縮, 這種方法可以顯著的減小圖像的大小
下面這段代碼就是采用的非直接模式來(lái)添加一個(gè)圖像到指定的位置
XImage theImg = new XImage(); 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)容到新的一頁(yè) theDoc.AddGrid(); //這個(gè)是讓頁(yè)面輸出類似坐標(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)然需要在每一頁(yè)上出現(xiàn)表頭和頁(yè)腳
theDoc.Rect.String = "24 750 588 778"; //直接通過(guò)這種方式指定表頭輸出區(qū)域 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語(yǔ)法, 這里的font標(biāo)簽可以讓你選擇使用不同的字體輸出 theDoc.AddLine(24, 750, 588, 750); //畫一條分隔線 }
畫頁(yè)腳和畫頁(yè)頭是一樣的, 主要就是位置和內(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來(lái)對(duì)生成的文檔壓縮一下, 因?yàn)榧尤氲膶?duì)象是分布在不同的層上, 所以調(diào)用這個(gè)函數(shù)可以合并當(dāng)前頁(yè)上的所有層, 同時(shí)重新壓縮層上的數(shù)據(jù)
如果頁(yè)面上的對(duì)象比較少的話, 壓縮后是看不出有明顯的效果, 但是如果頁(yè)面上是有很復(fù)雜的表格之類的話, 壓縮率甚至可以高達(dá)5倍以上
需要注意的是, 壓縮之后, 之前保存的Object ID會(huì)不再有效, 因?yàn)閷?duì)象已經(jīng)被重新生成, 所以壓縮操作最好放到最后來(lái)做
for (int i = 1; i <= theDoc.PageCount; i++) { theDoc.PageNumber = i; theDoc.Flatten(); }
更高級(jí)的應(yīng)用
ABCpdf還支持用AddMovies在pdf中嵌入Flash(SWF), AVI, MPEG和WMV
ABCpdf支持創(chuàng)建電子表單, 不過(guò)這已經(jīng)超過(guò)我使用的目的了, 因?yàn)槲?要做的是用pdf輸出報(bào)表。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:Cocodo的專欄——CSDN