麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

用C#制作PDF文件全攻略

2023-05-17 11:41:58
字體:
供稿:網(wǎng)友

PDF文件在當(dāng)前的辦公環(huán)境中應(yīng)用非常廣泛,但是關(guān)于使用C#制作PDF文件的資料很少,后經(jīng)多方查找和研究,終于找打了一個比較好的方法,下面詳細來敘述它。

要用本文的方法生成PDF文件,需要兩個控件:itextsharp.dll和ICSharpCode.SharpZipLib.dll,由于示例代碼實在太多,我將代碼全部整理出來,放在另外一個文件“示例代碼.doc”中,所有這些資源,我均放在了本人的ftp站點(ftp://202.107.251.26)上的“Pdf文件制作全攻略”文件夾中(文件夾中另外兩個rar壓縮文件為兩個控件的源代碼,供大家學(xué)習(xí)研究使用),你可以到這里下載相應(yīng)的資源,或者直接到原網(wǎng)站下載。

為便于調(diào)試和敘述,所有例子均為DOS控制臺程序,windows程序使用方法完全一樣,按照下面的步驟創(chuàng)建一個可調(diào)試的項目:

1、 打開VS2003;

2、 單擊菜單“文件”→“新建”→“項目”,在項目類型中選擇“Visual C#項目”,在模板中選擇“控制臺應(yīng)用程序”,輸入文件名稱如“MakePdf”,指定好存放路徑,然后點確定按鈕;

3、 在“解決方案資源管理器”中右鍵單擊“引用”,從彈出的菜單中選擇“添加引用”,在“.NET”選項夾中選擇“瀏覽”,添加前面提到的兩個應(yīng)用,如下圖:

4、 在代碼窗口頂部添加兩個引用:

using iTextSharp.text;

using iTextSharp.text.pdf;

至此,準備工作完畢。

第一部分 iText的簡單應(yīng)用

第一章 創(chuàng)建一個Document

利用iText五步創(chuàng)建一個PDF文件:helloword。

第一步,創(chuàng)建一個 iTextSharp.text.Document對象的實例:

Document document = new Document();

第二步,為該Document創(chuàng)建一個Writer實例:

PdfWriter.getInstance(document, new FileStream("Chap0101.pdf", FileMode.Create));

第三步,打開當(dāng)前Document

document.Open();

第四步,為當(dāng)前Document添加內(nèi)容:

document.Add(new Paragraph("Hello World"));

第五步,關(guān)閉Document

document.Close();

完整的代碼見示例代碼0101。

在例中,不難看出,制作一個PDF文件是非常簡單的。

注:如果你將例中“document.Add(new Paragraph("Hello World")); ”中的字符串“Hello Word”換成中文,如“這是我的第一個PDF文件”,產(chǎn)生的結(jié)果一定讓你大失所望,因為生成的PDF文件中并沒有將中文顯示出來,不要擔(dān)心,在第9章中要專門講解字體問題,中文顯示也就迎刃而解了,如果不能正確顯示中文,也就沒有必要翻譯本文了。

下面對這幾步做詳細介紹。

第一步 創(chuàng)建一個Document實例:

iTextSharp.text.Document-object共有三個構(gòu)造函數(shù):

public Document();

public Document(Rectangle pageSize);

public Document(Rectangle pageSize,int marginLeft,int marginRight,int marginTop,int arginBottom);

第一個構(gòu)造函數(shù)以A4頁面作為參數(shù)調(diào)用第二個構(gòu)造函數(shù),第二個構(gòu)造函數(shù)以每邊36磅頁邊距為參數(shù)調(diào)用第三個構(gòu)造函數(shù)

u 頁面尺寸:

你可以通過指定的顏色和大小創(chuàng)建你自己的頁面,示例代碼0102創(chuàng)建一個細長的淺黃色背景的頁面:

Rectangle pageSize = new Rectangle(144, 720);

pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE);

Document document = new Document(pageSize);

通常,你不必創(chuàng)建這樣的頁面,而可以從下面頁面尺寸中選擇:

A0-A10, LEGAL, LETTER, HALFLETTER, _11x17, LEDGER, NOTE, B0-B5, ARCH_A-ARCH_E, FLSA 和 FLSE

大多數(shù)情況下使用縱向頁面,如果希望使用橫向頁面,你只須使用rotate()函數(shù):

Document document = new Document(PageSize.A4.rotate());

詳細代碼見示例代碼0103。

u 頁邊距:

當(dāng)創(chuàng)建一個文件時,你還可以定義上、下、左、右頁邊距:

Document document = new Document(PageSize.A5, 36, 72, 108, 180);

在示例代碼0104中你可以看到該文檔有一個0.5英寸的左邊距和1英寸的右邊距,上邊距為1.5英寸,下邊距為2.5英寸。

說明:

當(dāng)創(chuàng)建一個矩形或設(shè)置邊距時,你可能希望知道該用什么度量單位:厘米、英寸或象素,事實上,默認的度量系統(tǒng)以排版單位磅為基礎(chǔ)得出其他單位的近似值,如1英寸=72磅,如果你想在A4頁面的PDF中創(chuàng)建一個矩形,你需要計算以下數(shù)據(jù):

21 厘米 / 2.54 = 8.2677 英寸

8.2677英寸* 72 = 595 磅

29.7 厘米 / 2.54 = 11.6929 英寸

11.6929英寸* 72 = 842 磅

默認邊距為36磅即半英寸。

如果你修改了頁面尺寸,僅僅影響到下一頁,如果你修改了頁邊距,則影響到全部,故慎用。

關(guān)于頁面的初始值,請參考第三步。

第二步 創(chuàng)建Writer實例

一旦創(chuàng)建了document,我們可以創(chuàng)建該文檔的多個Writer的實例,所有這些Writer實例均繼承自抽象類“iTextSharp.text.DocWriter”。

同時還有另外一種情況,你可以用iTextSharp.text.pdf.PdfWriter產(chǎn)生文檔PDF文件,如果你想創(chuàng)建一個TeX文檔,你可以使用iTextSharp.text.TeX.TeXWriter包。

Writer類的構(gòu)造函數(shù)是私有的,你只能通過下面的方法創(chuàng)建一個實例:

public static xxxWriter getInstance(Document document, Stream os); (xxx 是 Pdf 或 Xml)

你可以通過下面的方法創(chuàng)建一個實例:

PdfWriter writer = PdfWriter.getInstance(document, new FileStream("Chap01xx.pdf"));

但是你幾乎永遠不會用到Writer實例(除非你想創(chuàng)建高級PDF或者希望用一些非常特殊的函數(shù),如

ViewerPreferences 或 Encryption)。所以通過下面的辦法得到實例已經(jīng)足夠了:

dfWriter.getInstance(document, new FileStream("Chap01xx.pdf"));

在第一步中創(chuàng)建一個文檔時,第一個參數(shù)意義不大,第二個參數(shù)可以是任何一種流,到目前為止我們一直使用System.IO.FileStream將Document寫入文件中,示例代碼0105用到了System.IO.MemoryStream(這不是一個獨立的例子,你必須在Servlet Engine中測試這些代碼。

第三步 打開Document

u 摘要

在你寫入任何實際數(shù)據(jù)之前,你可能希望通過以下幾種方法寫入一些關(guān)于本文檔的摘要:

public boolean addTitle(String title)

public boolean addSubject(String subject)

public boolean addKeywords(String keywords)

public boolean addAuthor(String author)

public boolean addCreator(String creator)

public boolean addProducer()

public boolean addCreationDate()

public boolean addHeader(String name, String content)

你可以選擇自己的標題、主題、關(guān)鍵字、作者、創(chuàng)建程序,但以下產(chǎn)品信息將始終被添加:iTextSharp (或者iTextSharp的引用)和創(chuàng)建時間(實際上這兩種方法是自動調(diào)用的)。

你還可以將自定義的名稱添加為“報頭信息”,但是這對于PdfWriter沒有任何作用,如果看看實例代碼0101產(chǎn)生的pdf文件的“文檔屬性”,我們可以看到僅僅有PDF創(chuàng)建程序和產(chǎn)品日期,而示例代碼0106的“文檔屬性”框中有更多的信息。

打開document前要做的事:

你只能在Open方法調(diào)用之前添加摘要,這是iText開發(fā)工具提供的一個選擇。

在HTML中,報頭信息被放在文檔前面報頭標識中間,調(diào)用Open方法將導(dǎo)致報頭信息寫入流,因而在Document被打開后無法更改這些數(shù)據(jù)。

PDF報頭信息不包括摘要,看起來有類似于:

%PDF-1.2

該行顯示生成的文檔是一個版本為1.2的PDF格式的文件,在PDF中,摘要保存在PdfInfo對象中,當(dāng)文檔關(guān)閉時已經(jīng)寫入PdfWriter中了,因此,沒有關(guān)于為什么不能修改庫來滿足任何時候添加或更改摘要的技術(shù)原因

u 頁面初始化

Open方法在不同的Witer中同時會產(chǎn)生初始化事件,舉例來說,如果你需要一個水印或者頁眉頁角對象出現(xiàn)在文檔第一頁的開始處,你需要在打開文檔前添加這些,同樣的用于設(shè)置該文檔其他頁水印、頁眉、頁角、頁數(shù)和尺寸。

當(dāng)調(diào)用下列方法:

public bool setPageSize(Rectangle pageSize)

  public bool Add(Watermark watermark)

  public void removeWatermark()

  setting Header property

  public void resetHeader()

  setting Footer property

  public void resetFooter()

  public void resetPageCount()

  setting PageCount property

  產(chǎn)生的結(jié)果只能在下一個新頁中看到(當(dāng)在本頁調(diào)用初始化方法時),代碼見示例代碼0107,你必須要準備一張名為watermark.jpg的圖片,如下圖:

  u 閱讀器參數(shù):

  你可以通過下面的辦法為PDF文件指定一些閱讀器 (如Adobe Reader) 參數(shù):

  public void setViewerPreferences(int preferences)

  在示例代碼0108中,指定了下面一些參數(shù):

  writerA.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft);

  writerB.setViewerPreferences(PdfWriter.HideMenubar | PdfWriter.HideToolbar);

  writerC.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft | PdfWriter.PageModeFullScreen | PdfWriter.NonFullScreenPageModeUseThumbs);

  正如你所看到的,參數(shù)可以使用以下一些常量:

  l 文件被打開時,頁面布局用到下面的其中一個 :

  PdfWriter.PageLayoutSinglePage – 同時只顯示一個頁面

  PdfWriter.PageLayoutOneColumn –單列顯示

  PdfWriter.PageLayoutTwoColumnLeft –雙列顯示,奇數(shù)頁在左

  PdfWriter.PageLayoutTwoColumnRight -雙列顯示,奇數(shù)頁在右

  l 文件打開時,頁面模式用到下面其中之一:

  PdfWriter.PageModeUseNone – 既不顯示大鋼也不顯示縮略圖

  PdfWriter.PageModeUseOutlines – 顯示大綱

  PdfWriter.PageModeUseThumbs – 顯示縮略圖

  PdfWriter.PageModeFullScreen – 全屏模式,沒有菜單、windows控件或者其他任何windows可見控件

  l PdfWriter.HideToolbar – 當(dāng)文檔激活時,是否隱藏閱讀程序(如Adobe Reader)的工具條

  l PdfWriter.HideMenubar -當(dāng)文檔激活時,是否隱藏閱讀程序的菜單.

  l PdfWriter.HideWindowUI -當(dāng)文檔激活時,是否隱藏閱讀程序的界面元素,如滾動條、導(dǎo)航條等,而僅僅保留文檔顯示

  l PdfWriter.FitWindow – 是否調(diào)整文檔窗口尺寸以適合顯示第一頁。

  l PdfWriter.CenterWindow – 是否將文檔窗口放到屏幕中央

  l 在全屏模式下,指定如何顯示界面元素(選擇一個)

  PdfWriter.NonFullScreenPageModeUseNone -既不顯示大鋼也不顯示縮略圖

  PdfWriter.NonFullScreenPageModeUseOutlines – 顯示大鋼

  PdfWriter.NonFullScreenPageModeUseThumbs – 顯示縮略圖

  說明:你只能在類PdfWriter中調(diào)用這些方法。

  u 加密

  打開文檔之前還要做的一件事情就是加密(如果你希望該文檔加密),要達到這個目的,你可以使用下面的方法:

  public void setEncryption(boolean strength, String userPassword, String ownerPassword, int permissions);

  strength 是下面兩個常量之一:

  PdfWriter.STRENGTH40BITS: 40 位

  PdfWriter.STRENGTH128BITS: 128位 (Acrobat Reader 5.0及以上版本支持)

  UserPassword和ownerPassword 可以為空或零長度, 這種情況下, ownerPassword 將被隨機的字符串代替

  Permissions 為下列常量之一:

  PdfWriter.AllowPrinting

  PdfWriter.AllowModifyContents

  PdfWriter.AllowCopy

  PdfWriter.AllowModifyAnnotations

  PdfWriter.AllowFillIn

  PdfWriter.AllowScreenReaders

  PdfWriter.AllowAssembly

  PdfWriter.AllowDegradedPrinting

  該功能參見示例代碼0109和示例代碼0110。

  writer.setEncryption(PdfWriter.STRENGTH40BITS, null, null, PdfWriter.AllowCopy);

  示例代碼0109產(chǎn)生的文件能夠被打開而無須密碼,但用戶不能打印、修改本文檔。

  writer.setEncryption(PdfWriter.STRENGTH128BITS, "userpass", "ownerpass", PdfWriter.AllowCopy | PdfWriter.AllowPrinting);

  打你試圖打開示例代碼0110產(chǎn)生的文件時,將要求輸入密碼('userpass'),因為添加了AllowPrinting參數(shù),你可以打印該文檔而不會發(fā)生任何問題。

  第四步 添加內(nèi)容

  在解釋第一步到第三步的不同示例中,你可能已經(jīng)遇到了一些對象如Phrase, Paragraph等 在接下來的幾章中,所有這些問題都將得到詳細解釋。

  有時你可能想一個writer故意忽略document產(chǎn)生的行為,如示例代碼0111:

  當(dāng)我們創(chuàng)建了兩個writer: writerA 和 writerB:

  PdfWriter writerA = PdfWriter.getInstance(document, new FileStream("Chap0111a.pdf", FileMode.Create));

  PdfWriter writerB = PdfWriter.getInstance(document, new FileStream("Chap0111b.pdf", FileMode.Create));

  我們可以創(chuàng)建兩個有細微差別的文檔:

  writerA.Pause();

  document.add(new Paragraph("This paragraph will only be added to Chap0111b.pdf, not to Chap0111a.pdf"));

  writerA.resume();

  你可以比較文件: Chap0111a.pdf和Chap0111b.pdf的區(qū)別

  第五步,關(guān)閉 document

  關(guān)閉 document 非常重要, 因為它將關(guān)閉正在運行的Writer并將內(nèi)容寫入文件,該方法在最后被調(diào)用,你應(yīng)該總是要關(guān)閉文檔。

  高級話題:閱讀PDF文件

  該部分內(nèi)容介紹了iText只能產(chǎn)生PDF格式的文件而不能解析PDF格式文件,不再翻譯。

  第二章 塊、短句和段落

  塊

  塊(Chunk)是能被添加到文檔的文本的最小單位,塊可以用于構(gòu)建其他基礎(chǔ)元素如短句、段落、錨點等,塊是一個有確定字體的字符串,要添加塊到文檔中時,其他所有布局變量均要被定義。下面一行中,我們創(chuàng)建了一個內(nèi)容為“hello World”、紅色、斜體、COURIER字體、尺寸20的一個塊:

  Chunk chunk = new Chunk("Hello world", FontFactory.getFont(FontFactory.COURIER, 20, Font.ITALIC, new Color(255, 0, 0)));

  u 典型字體1:

  在本指南中,除了第九章外(你可以在這里學(xué)會使用其他字體),我們將始終使用典型字體1,這些是不同的典型字體1:

  · Courier (該字體定寬)

  · Helvetica

  · Times Roman

  · Symbol

  · ZapfDingbats

  u 下劃線/刪除線

  如果你希望一些塊有下劃線或刪除線,你可以通過改變字體風(fēng)ge簡單做到:

  Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));

  Chunk chunk2 = new Chunk("This font is of type ITALIC | STRIKETHRU", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.ITALIC | Font.STRIKETHRU));

  u 上標/下標

  在塊中有幾個方法可以調(diào)用,其中大部分將在接下來的章節(jié)中介紹,本章中只介紹一個方法 setTextRise(float f). 你可以使用該方法在上標或下標中寫塊。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费看搡女人无遮挡的视频 | 精品国产观看 | 暴力强行进如hdxxx | 国产精品久久久久久久久久免 | 欧美日韩亚洲国产精品 | 婷婷中文字幕一区二区三区 | 中午字幕无线码一区2020 | 国产亚洲欧美日韩高清 | 欧美男女爱爱视频 | 久草欧美| 黄色大片高清 | 久草在线手机视频 | 久久成人亚洲 | 亚洲欧美一区二区三区在线观看 | 成年性羞羞视频免费观看 | a网站在线 | 一区国产在线观看 | 久草在线资源福利站 | 国产免费看 | 色七七久久影院 | 久久久久久久久久久久久久av | 亚洲国产色婷婷 | 国产精选电影免费在线观看网站 | 美女喷水网站 | 草草久| 国产一级不卡毛片 | av懂色 | 亚洲精品久久久久久久久久久 | 成人在线网站 | 自拍偷拍亚洲图片 | 国产1区2| 久久久国产一区二区三区 | 免费一级毛片网站 | 成人一级黄色大片 | 激情大乳女做爰办公室韩国 | 欧美巨根 | 国产一级免费在线视频 | 国产一级aaa全黄毛片 | 黄色片网站免费 | 136福利视频| 成人做爰s片免费看网站 |