原創|其它|編輯:郝浩|2012-10-18 14:37:59.000|閱讀 547 次
概述:iTextSharp是一個很強大的動態創建pdf的工具, 可是缺少一個可以直接轉換html到pdf的功能, 而這個功能用ABCpdf.NET輕而易舉的實現, 特此向大家介紹一下ABCpdf的用法。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
iTextSharp是一個很強大的動態創建pdf的工具, 可是缺少一個可以直接轉換html到pdf的功能, 而這個功能用ABCpdf.NET輕而易舉的實現, 特此向大家介紹一下ABCpdf的用法。
當然, iTextSharp是免費的, ABCpdf是需要付費的。
First, 我們要把ABCpdf這個dll加入到工程的引用。
Secod, 然后using其命名空間
using WebSupergoo.ABCpdf5; //一般加入這個聲明就夠了,下面2個基本上很少有用 using WebSupergoo.ABCpdf5.Objects; using WebSupergoo.ABCpdf5.Atoms;
安裝和分發:
ABCpdf的功能全部是2個DLL提供的
它的安裝程序會自動的把ABCpdf.dll加入到GAC, 把ABCpdfCE5.dll復制到System32目錄下
對于我們開發來說,最簡單的莫過于將這2個DLL都放置到BIN目錄下即可
開始使用:
Doc theDoc = new Doc(); //創建一個Doc對象 XSettings.License = "change this text to your key"; //分發正式程序的時候需要設置License
如果是分發演示程序, 則可以設置為從PDFSettings這個程序里取得的試用授權碼:
theDoc.SetInfo(0, "License", "cd9b5c07db69df2bf57c0a04d9bca58b10c44889
c9fb197984e592f49addfce5ec5fe85d7b9205bc");
字體和語言
如果你要輸出的是英文文檔,一般直接用其內置的基本字體就可以了。
基本字體包括:
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種實現,一種是內嵌字體(Embed),就是把用到的漢字的字體部分保存到pdf,這樣即使在沒有安裝那種字體的機器上也能看到正確的字體顯示,優點是文檔在不同機器上的效果都能保持一致, 且顯示的效率也比較高, 缺點就是文檔會變大一點, 嵌入字體的時候可以通過設置subset來確定是否嵌入整個字體還是只有用到的部分
int theFont = theDoc.EmbedFont("Verdana", "Latin", false, true); theDoc.FontSize = 12; //設置默認字體大小
這句表示嵌入一個Verdana的拉丁字體, false 代表水平顯示, true 代表嵌入子集(這個我也沒搞太明白)
theFont是返回字體的Object ID,這個ID可以直接賦給theDoc.Font來設置其為默認字體
另一種是引用字體(Refs), 這種方式因為是引用, 所以不會導致文檔變大, 但是引用的方式必須要求觀看文檔的時候需要用較新版本的Acrobat (Reader), 并且必須安裝有語言包才能正確顯示文檔
theDoc.Font = theDoc.AddFont("隸書", "ChineseS");
加入引用隸書這個中文字體, ChineseS是代表簡體中文, 還有: Latin, Unicode, Korean, Japanese, ChineseT可以選擇
字體的名字還可以用其英文(eg: LiSu)或文件名(eg: SIMLI.TTF)指示
坐標系
pdf的坐標系不同于Windows所用的左上為原點的坐標系, 它是采用左下為坐標原點的, 如果你實在不習慣使用這種坐標,你可以通過設置Doc的TopDown為true來改變原點的位置
Doc.Rect屬性可能是最重要的屬性了, 如果要輸出什么東西的話, 都是輸出到Rect所指定的矩形范圍內
ABCpdf默認的文檔大小為612x792 pixel,也就是8.5x11 inch, 默認DPI為72
HTML / CSS 呈現
ABCpdf完全支持HTML和CSS
ABCpdf使用Internet Explorer的HTML引擎來解析和預處理要插入到pdf的HTML
屏幕的解析度通常是96 dpi, 而pdf的dpi為72, 因此打印出來的文檔會比屏幕上看到的要大
你可以使用CSS中的page-break-before, page-break-after 和 page-break-inside來控制分頁, 但是需要注意以下的代碼:
<div style="page-break-before:always"> </div>
... 會分頁 ...
<div style="page-break-before:always"></div>
. 則不會分頁, 我估計是因為空對象被優化掉了
下面的代碼演示如何轉換html到pdf
theDoc.Rect.Inset(24, 48); //Rect默認是文檔整個頁面大小, 這里的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); }
后面的這個循環很重要, 不然的話, 就只能把html輸出到一頁, 這一點不像iTextSharp是自動分頁的
把一個復雜內容輸出為多頁, 都要采用這種循環加入Chain的方式, 比如需要添加很長一段的html或text
代碼很簡單, 無需多說, 需要注意的是HTML不管動態的還是靜態的, 都應該沒有問題, 但是如果是類似BBS之類基于Cookie的動態頁面的話, 會取不到需要的頁面的
再補充一點, 因為ABCpdf.NET本身是具有緩存設計的, 其獲得網頁是通過IE來獲取的, 因此轉換動態HTML的時候, 有可能會遇到沒有更新的問題, 具體的描述請參閱幫助, 我就不多費口舌了
圖像處理
用ABCpdf展現圖片有2種方式, 一種是直通模式, 直接把圖片添加到Doc對象里, 比如使用 Doc.AddImageFile, Doc.AddImageData方法
另一種是是非直接的方式, 在添加圖像對象到文檔之前, 先把數據畫到圖像對象里
相比之下, 非直接的方式有以下優點
因為每張圖在轉換為圖像對象的時候就已經完全解碼, 因此在這個時候就能夠捕獲到圖像文件格式無效之類的錯誤, 雖然有問題的圖像不是經常遇到, 但是如果你使用直通模式的話, 則很有可能導致pdf把有問題的圖像文件包含進去, 從而導致pdf文檔在瀏覽的時候報告錯誤
當然使用直通模式不需要解壓和壓縮圖像, 會比非直接模式執行速度要快
Image對象一般使用Flate來壓縮, 這種壓縮方式與PNG圖像的壓縮方法一樣, 這是一種無損的壓縮方法, 這樣可以保證圖像的品質不會變差, 如果加入的圖像是黑白的, ABCpdf會使用CCITT G4 fax壓縮, 這種方法可以顯著的減小圖像的大小
下面這段代碼就是采用的非直接模式來添加一個圖像到指定的位置
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(); //準備輸出內容到新的一頁 theDoc.AddGrid(); //這個是讓頁面輸出類似坐標紙樣的表格, 可以幫助開發者更好地定位輸出 theDoc.Color.String = "0 255 0"; //設置默認顏色為綠色 theDoc.Width = 4; // 這個是設置刷子的寬度為4 theDoc.Rect.Position(100, 200); //指定左下角輸出位置為100,200 theDoc.Rect.Width = 400; theDoc.Rect.Height = 500; theDoc.FrameRect(); //畫Rect的邊框
Header & Footer
如果我們是用PDF作為報表輸出的話, 當然需要在每一頁上出現表頭和頁腳
theDoc.Rect.String = "24 750 588 778"; //直接通過這種方式指定表頭輸出區域 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標簽可以讓你選擇使用不同的字體輸出 theDoc.AddLine(24, 750, 588, 750); //畫一條分隔線 }
畫頁腳和畫頁頭是一樣的, 主要就是位置和內容有不同
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
在輸出完所要輸出的內容后, 我們可以調用Flatten來對生成的文檔壓縮一下, 因為加入的對象是分布在不同的層上, 所以調用這個函數可以合并當前頁上的所有層, 同時重新壓縮層上的數據
如果頁面上的對象比較少的話, 壓縮后是看不出有明顯的效果, 但是如果頁面上是有很復雜的表格之類的話, 壓縮率甚至可以高達5倍以上
需要注意的是, 壓縮之后, 之前保存的Object ID會不再有效, 因為對象已經被重新生成, 所以壓縮操作最好放到最后來做
for (int i = 1; i <= theDoc.PageCount; i++) { theDoc.PageNumber = i; theDoc.Flatten(); }
更高級的應用
ABCpdf還支持用AddMovies在pdf中嵌入Flash(SWF), AVI, MPEG和WMV
ABCpdf支持創建電子表單, 不過這已經超過我使用的目的了, 因為我要做的是用pdf輸出報表。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:Cocodo的專欄——CSDN