一、簡介
PDF File Writer C# 類庫PdfFileWriter
允許您直接從 .net 應用程式建立 PDF 檔案。該庫使您免受 PDF 檔案結構的詳細資訊的影響。要使用該庫,您需要新增對附加PdfFileWriter.dll
類庫檔案的引用,using PdfFileWriter
在每個使用該庫的原始檔中新增一條語句,並將 包含在PdfFileWriter.dll
您的發行版中。更多詳細資訊,請參閱4. 安裝。該程式碼是使用 .NET Framework 4.6.2 和 Visual Studio 2019 開發的。
1.28.0 版本增強:升級內部 PDF 檔案結構以包含物件流和交叉尊重流。升級後的檔案結構載入效率更高。此外,生成的檔案大小略小。
PDF File Writer C# 類庫支援以下 PDF 文件的功能:
- 圖形:繪製線條、矩形、多邊形、貝塞爾曲線、前景色和背景色、圖案和陰影。第2.1節座標系。
- 世界地區使用者的小數分隔符註釋,使用逗號來表示分數。請參閱第2.2節小數分隔符。
- 繪圖文字。第2.3節語言支援、字型和字符集。
- 繪製影像:繪製光柵(點陣圖)影像和向量(元檔案)影像。第2.4節。影像支援。
- 條碼:支援條碼 128、條碼 39、條碼交錯 2 of 5、條碼 EAN13 和條碼 UPC-A。第2.5條形碼支援。
- 二維碼:支援二維條碼。第2.6 QR程式碼支援。
- PDF417 條碼。第2.7節PDF417 條碼。
- 網頁連結:網頁連結互動支援。第2.8節Web 連結支援。
- 書籤:支援文件大綱。第2.9節書籤支援。
- 圖表:支援微軟圖表。第2.10節圖表支援。
- 列印為 PDF:從
PrintDocument
流程建立 PDF 文件。第2.11節PrintDocument 支援。 - 顯示資料表。第2.12資料表支援
- 播放視訊檔案。第2.13播放視訊檔案
- 播放聲音檔案。第2.14播放聲音檔案
- 附加資料檔案。第2.15節附加資料檔案
- 重新排序頁面。第2.16節重新排序頁面
- PDF 文件輸出到檔案或流。第2.17節PDF 文件輸出。
- PDF文件資訊字典。PDF 閱讀器在文件屬性的描述選項卡中顯示此資訊。資訊包括:標題、作者、主題、關鍵字、建立日期和時間、修改日期和時間、生成檔案的應用程式、PDF 生成器。第2.18節文件資訊字典。
- 記憶體控制:將完成頁面的內容資訊寫入輸出檔案,並通過垃圾收集器釋放未使用的記憶體。第2.19節。記憶體控制。
- 繪製由
System.Windows.Media.PathGeometry
類定義的圖稿。輸入引數可以是文字字串或PathGeometry
類。第2.20節Windows Presentation Foundation WPF - 透明度或不透明度可用於繪製形狀、線條、文字和影像。您的應用程式可以為所有圖形和文字設定顏色的 alpha 分量。第2.21節透明度、不透明度、Alpha 顏色分量和混合
- 混合。該庫支援 PDF 顏色混合方案。混合定義瞭如何處理塗在前一個專案上的新專案的顏色。第2.21節透明度、不透明度、Alpha 顏色分量和混合
- 文件連結和命名目的地。第2.22節文件連結和命名目的地。
- 加密:支援AES-128加密。第2.23節加密支援。
- 粘滯便箋2.24 粘滯便箋或文字註釋。
- 圖層或可選內容。2.25 圖層或可選內容。
- 初始文件顯示。2.26 初始文件顯示。
- XMP 後設資料。2.27 XMP 後設資料。
建立 PDF 是一個六個步驟的過程。
- 第 1 步:建立一個文件物件
PdfDocument
。 - 第 2 步:建立資源物件,例如字型或影像(即
PdfFont
或PdfImage
)。 - 第 3 步:建立頁面物件
PdfPage
。 - 第 4 步:建立內容物件
PdfContents
。 - 第 5 步:向內容物件新增文字和圖形(使用
PdfContents
方法)。 - 對其他頁面重複步驟 3、4 和 5
- 第 6 步:通過呼叫 的
CreateFile
方法建立您的 PDF 文件檔案PdfDocument
。
第 5 步是您的大部分程式設計工作將花費的地方。新增內容是通過呼叫PdfContents
類的方法渲染圖形和文字來實現的。內容類具有一組豐富的(大約 100 個)方法,用於向文件新增文字和圖形。
PdfDocument
實現IDisposable
釋放非託管資源的介面。該CreateFile
方法Document.Dispose()
在建立 PDF 檔案後呼叫。但是,為了確保資源的釋放,您應該使用語句或塊將PdfDocument
建立和最終包裝起來。/p>CreateFile
using
try/catch
本文所附的演示程式是為除錯庫而開發的測試程式。在TestPdfFileWriter
有主螢幕上的六個按鈕。五個按鈕用於生成 PDF 檔案示例,一個按鈕用於顯示計算機上可用的所有字型。第一個按鈕“文章示例”建立顯示在本文頂部的 PDF 檔案。第3節開發指南示例。
如前所述,PdfFileWriter
C# 類庫使您免受 PDF 檔案結構的複雜性影響。然而,對PDF檔案有很好的理解總是一個優勢。Adobe PDF 檔案規範文件可從 Adobe 網站獲得:“PDF 參考,第六版,Adobe 行動式文件格式版本 1.7 2006 年 11 月”。這是一份令人生畏的 1310 頁文件。我強烈建議閱讀第 4 章圖形和文本第 5 章的第 5.2 和 5.3 節。
如果你想分析這個專案建立的PDF檔案,或者你想了解一般的PDF檔案結構,可以使用我上一篇文章“PDF檔案分析器與C#解析類”所附的演示程式。本文簡要概述了 PDF 規範。
2. PDF 檔案編寫器庫一般說明
2.1. 座標系和測量單位
PDF 座標系原點位於頁面的左下角。X 軸指向右側。Y 軸指向上方。
PDF 的度量單位是點。一英寸有 72 個點。PDF 檔案編寫器允許您選擇自己的度量單位。表示位置、寬度或高度的所有方法引數都必須採用您的度量單位。有兩個例外:字型大小和解析度。字型大小始終以磅為單位。解析度始終以每英寸畫素為單位。PDF 檔案編寫器將所有輸入引數轉換為點。所有內部測量值和計算均以雙精度完成。在建立 PDF 檔案的最後一步,值被轉換為文字字串。轉換精度為六位數。使用的轉換公式為:
// Value is Double
if(Math.Abs(Value) < 0.0001) Value = 0.0;
String Result = ((Single) Value).ToString();
2.2. 十進位制分隔符
PDF 閱讀器(如 Adobe Acrobat)期望帶分數的實數使用句點作為小數點分隔符。世界上的一些地區使用其他小數點分隔符,例如逗號。由於 PDF 檔案編寫器庫的 1.1 版將使用句點作為小數點分隔符,而不管您的計算機的區域設定如何。
2.3. 語言支援、字型和字符集
PDF 檔案編寫器庫支援您計算機上安裝的大多數字體。唯一的例外是裝置字型。支援的字型遵循 OpenType 字型規範。更多資訊可在Microsoft Typography - OpenType Specification 獲得. 要繪製的文字儲存在由 Unicode 字元組成的字串中。庫將接受除控制程式碼 0 到 31 和 128 到 159 之外的任何字元(0 到 65536)。每個字元都被翻譯成一個字形。字形在頁面上從左到右繪製,其順序與它們儲存在字串中的順序相同。大多數字體檔案僅支援所有可能的 Unicode 字元的一個子集。換句話說,您必須選擇一種支援您的專案語言或您嘗試顯示的符號的字型。如果輸入字串包含不受支援的字形,PDF 閱讀器將顯示“未定義字形”。通常它是一個小矩形。本文附帶的測試程式有一個“字型系列”按鈕。如果單擊它,您可以看到計算機上所有可用的字型以及每種字型中所有可用的字元。如果您的專案語言是從左到右的語言,並且每個字元都被翻譯成一個字形並且字形在字型中定義,那麼結果應該是您所期望的。如果結果不是您所期望的,這裡有一些附加說明:
Unicode 控制字元。Unicode 控制字元用於控制文字的解釋或顯示,但這些字元本身沒有視覺或空間表示。PDF 檔案編寫器無法識別這些字元。該庫假定每個字元都是顯示字元。它們將顯示為未定義字元。
從右到左的語言。通常,文字字串中字元的順序就是人們閱讀它們的順序。由於庫是從左到右繪製的,因此文字將向後寫入。該ReverseString
方法反轉字元順序。如果文字僅由從右到左的字元組成,這將解決問題。如果文字是從右到左、從左到右、數字和一些字元(如括號 ()[]<>{})的混合,則不會產生預期的結果。另一個限制是TextBox
類不能將長的從右到左的文字分成行。
結紮。在某些語言中,兩個或多個字元的序列組合在一起以顯示一個字形。您的軟體可以識別這些序列並用正確的字形替換它們。
虛線圓圈。如果您檢視 Glyph Metrics 螢幕的 Glyph 列,您可以看到一些字形有一個小的虛線圓圈(即字元程式碼 2364 和 2367)。這些字元是字元序列的一部分。不顯示虛線圓圈。如果前進寬度為零並且邊界框位於 Y 軸的左側,則該字形將被繪製好。它將顯示在前一個字元的頂部。如果前進寬度不為零,則該字形應顯示在前一個字元之前。您的軟體可以通過反轉兩個字元來實現它。
2.4. 影像支援
在 PDF 文件中顯示影像由 PdfImage 類處理。這個類是一個PDF資源。圖片來源可以是:
- 影像檔案
- .NET Image 派生類如 Bitmap
- 黑白畫素的布林陣列
- QREncoder 類表示的 QRCode 條碼
- 由 Pdf417Encoder 類表示的 PDF 417 條碼
- PdfChart 是 PdfImage 的派生類
- PdfPrintDocument 在內部使用 PdfImage 來捕獲列印頁面
影像以下列格式之一儲存到 PDF 檔案中:
- Jpeg 格式(有失真壓縮)
- 索引點陣圖(無失真壓縮)
- 灰色點陣圖(無失真壓縮)
- 黑白點陣圖(無失真壓縮)
彩色圖片應以 Jpeg 格式儲存。要控制影像的大小,您可以降低解析度或更改影像質量。彩色圖片可以儲存為灰色陰影。資料大小減少了三個,但您失去了顏色。如果影像是在圖表中以程式設計方式建立的,並且顏色數小於 256,則影像可以儲存為索引點陣圖。與 3 個位元組相比,每種顏色由一個位元組(或更少)表示。這可能會導致非常顯著的檔案大小減小。例如,ChartExample.pdf 檔案從 642KB 減少到 72KB。如果影像是黑白的,如文字的 PdfPrintDocument 影像,則影像可以儲存為 BWImage。對於 PrintExample.pdf,Jpeg 檔案為 1795KB,黑白版本為 66KB。
將影像新增到您的 PDF 檔案
建立一個 PdfImage 類。
C# //建立 PdfImage 物件 PdfImage MyImage = new PdfImage(Document);
如果需要,設定可選引數。所有引數都有一個預設值。
C# //儲存的影像格式(預設 SaveImageAs.Jpeg) //其他選擇是:IndexedImage、GrayImage、BWImage MyImage.SaveAs = SaveImageAs.Jpeg; //裁剪矩形是要裁剪的影像區域。 //預設為無裁剪(空矩形)。 //原點在左上角,Y 軸向下。 //尺寸以畫素為單位。 //裁剪矩形必須包含在影像中。 MyImage.CropRec = new Rectangle(x, y, width, height); //裁剪百分比矩形是要裁剪的影像區域。 //預設為無裁剪(空矩形)。 //原點在左上角,Y 軸向下。 //尺寸以影像的百分比表示。 //裁剪矩形必須包含在影像中。 MyImage.CropPercent = new RectangleF(x, y, width, height); //影像質量是 0 到 100 範圍內的整數。 //代表質量差到最佳質量的影像。 //預設 (-1) 是使用 Bitmap 預設質量儲存影像。 //供您參考 Bitmap 類預設影像質量為 75。 //影像質量越低意味著 PDF 檔案越小。 MyImage.ImageQuality = PdfImage.DefaultQuality; //影像解析度設定提供的影像解析度 //它小於源影像的解析度。 //預設為 0,保持原始影像解析度。 //解析度以每英寸畫素數指定。 //降低解析度意味著更小的 PDF 檔案。 MyImage.Resolution = 0 ; //灰度轉換為黑白的截止值。 //範圍為 1 到 99。預設值為 50。 //如果灰度低於截止值,則結果為黑色。 //如果灰色陰影高於截止值,則結果為白色。 MyImage.GrayToBWCutoff = 50 ; //反轉黑白 //預設為 false //在灰色或黑白影像中,顏色反轉 MyImage.ReverseBW = false ; //附加到圖層控制元件 //影像可見性將由檢視器應用程式控制。 MyImage.LayerControl = PdfLayer;
將影像載入到 PdfImage 物件中。注意:載入方法將影像儲存在 PDF 輸出檔案中。完成此步驟後,將無法更改影像。
C# //使用 5 種方法之一載入影像。 //圖片來源可以是檔案、Bitmap、 // BW bool 陣列、QRCode 或 Pdf417 條碼 MyImage.LoadImage(image_source);
將影像繪製到 PDF 文件中。
C# //繪製影像 Contents.DrawImage(MyImage, PosX, PosY, Width, Height);
如果您希望影像保持正確的縱橫比,請使用ImageSize
或ImageSizePosition
計算寬度和高度。如果寬度和高度的比例與影像不同,影像將在其中一個方向上看起來被拉伸。
//計算與正確的最大的矩形 //長寬比 尺寸MyImage.ImageSize(雙寬度,雙高度); //計算 適合給定區域和//位置的具有//正確縱橫比 的最大矩形。它基於 <code>ContentAlignment</code> 列舉。 ImageSizePos ImageSizePosition(雙倍寬度,雙倍高度,ContentAlignment對齊);
2.5. 條碼支援
下面的程式碼說明了如何在 PDF 文件中包含 UPC-A 條形碼。
C# //建立條碼物件 BarcodeEAN13 Barcode = new BarcodeEAN13( " 123456789010" ); //在條碼下繪製包含文字的條碼 Contents.DrawBarcode(PosX, PosY, BarWidth, BarcodeHeight, Barcode, Font, FontSize);
在這種情況下,類是帶有 12 位輸入字串的 BarcodeEAN13。結果是 UPC-A 條形碼。
PDF 檔案編寫器庫包括一個基類 Barcode
. 對於每個受支援的條形碼,都需要一個派生類。類庫包括四個子類:Barcode128
, Barcode39
,BarcodeInterleaved2of5
和BarcodeEAN13
。的BarcodeEAN13
產生EAN-13條形碼如果輸入字串是13位數字和UPC-A,如果輸入字串為12位。具有 13 位數字和前導零的輸入字串被視為 UPC-A。
該DrawBarcode
方法有許多過載。您指定條碼左下角的位置、窄條的寬度、條碼的高度和派生的條碼類。有可選引數:顯示文字的對齊(左、中、右)顏色和字型。條形碼周圍的安靜區域是您的責任。可選文字顯示在條形碼下方。如果您選擇黑色以外的顏色,則應確保與背景的對比度顯著。用法示例中給出3.7繪製條形碼,ArticleExample.cs
和OtherExample.cs
。
如果要為另一個條碼建立派生類,請使用三個包含類的原始碼作為示例。
2.6. 二維碼支援
PDF 檔案編寫器庫提供對 QR 碼的支援。它基於文章QR Code Encoder and Decoder .NET(Framework, Standard, Core) Class Library Written in C#。該程式支援三種字符集:數字、字母數字和八位位元組。該程式不支援漢字字元。程式將掃描輸入的資料字串並選擇最有效的字符集。如果你的資料可以被分成只有數字或字母數字字元的段,你可以建立一個帶有資料字串陣列的二維碼物件。
將 QRCode 條碼新增到您的 PDF 文件必須遵循以下步驟。
- 建立
QREncoder
物件。 - 設定編碼選項。所有編碼選項都有預設值。
- 編碼資料字串或資料位元組陣列。
- 建立
PdfImage
. - 繪製條形碼影像
PdfContent.DrawImage
二維碼示例
//建立 二維碼條碼QREncoder QREncoder = new QREncoder(); //設定糾錯碼(預設為M) QREncoder.ErrorCorrection = ErrorCorrection.M; //以畫素為單位設定模組大小(預設為 2) QREncoder.ModuleSize = 1 ; //以畫素為單位設定靜音區(預設為 8) QREncoder.QuietZone = 4 ; // ECI 分配值(預設為 -1 未使用) // ECI 值是 0 到 999999 範圍內的數字。 //如果未使用,則為-1 Encoder.ECIAssignValue = -1; //編碼你的文字或位元組陣列 QREncoder.Encode(文章連結); //將二維碼轉換為黑白的 PdfImage PdfImage BarcodeImage = new PdfImage(Document, QREncoder); //繪製影像(QRCode 的高度與寬度相同) Contents.DrawImage(BarcodeImage, 6 . 0 , 6 . 8 , 1 . 2 );
有關編碼示例,請檢視3.7 Draw Barcodes 、ArticleExample.cs 和 OtherExample.cs 原始碼。
2.7. PDF417條碼
PDF417 條碼支援軟體基於文章PDF417 條碼編碼器類庫和演示應用程式。PDF417 條碼文件和規範可在以下網站中找到。維基百科很好地介紹了 PDF417。單擊此處訪問該頁面。PDF417 標準可在此網站上從 ISO 組織購買。可以從該網站免費下載規範的早期版本。如果您想完全瞭解編碼選項,我強烈建議您下載此文件。
PDF417 條形碼將位元組陣列編碼為黑白條的影像。編碼 Unicode 文字需要將 Unicode 字元轉換為位元組。解碼器必須執行相反的過程才能恢復文字。位元組被轉換為碼字。此轉換過程將位元組壓縮為程式碼字。編碼器新增糾錯碼字用於錯誤檢測和恢復。一旦知道資料碼字和糾錯碼字的總數,編碼器將碼字分成資料行和資料列。最後一步是建立黑白影像。
將 PDF417 條碼新增到您的 PDF 文件必須遵循以下步驟。
- 建立
Pdf417Encoder
物件。 - 設定編碼選項。所有編碼選項都有預設值。
- 編碼資料字串或資料位元組陣列。
- 檢查影像寬度和高度或資料列數和資料行數,以確保影像大小適合您的應用程式。如果不是,請調整佈局。
- 建立
PdfImage
. - 繪製條形碼影像
PdfContent.DrawImage
PDF417條碼繪圖示例
C# private void DrawPdf417Barcode() { //儲存圖形狀態 Contents.SaveGraphicsState(); //建立 PDF417 條碼 Pdf417Encoder Pdf417 = new Pdf417Encoder(); string ArticleLink = " http://www.codeproject.com/Articles/570682/PDF-File-Writer-Csharp-Class-Library-Version" ; //編碼文字 Pdf417.Encode(文章連結); Pdf417.WidthToHeightRatio(2。5); //將 Pdf417 轉換為黑白影像 PdfImage BarcodeImage = new PdfImage(Document, Pdf417); //繪製影像 Contents.DrawImage(BarcodeImage, 1 . 1 , 5 . 2 , 2 . 5 ); //恢復圖形狀態 Contents.RestoreGraphicsState(); 返回; }
PDF417 條碼物件
建立 PDF417 條碼物件。該物件可以連續重複使用以生成多個條碼。
//建立 PDF417 條碼 Pdf417Encoder Pdf417 = new Pdf417Encoder();
設定可選引數以控制編碼過程。
編碼控制
PDF417 編碼器將輸入位元組編碼為碼字。有三種型別的碼字:位元組、文字和數字。該程式有一個演算法將輸入的資料分成這三種型別來壓縮資料。預設為自動。但是,您可以將編碼限制為僅位元組或僅文字和位元組。
C# Pdf417.EncodingControl = Pdf417EncodingControl.Auto; //或 Pdf417.EncodingControl = Pdf417EncodingControl.ByteOnly; //或 Pdf417.EncodingControl = Pdf417EncodingControl.TextAndByte;
糾錯級別
PDF417 新增了糾錯碼字來檢測錯誤並糾正它們。更多的糾錯碼字提高了條碼的可靠性。但是,它會使條形碼變大。糾錯級別允許您控制條碼的質量。該ErrorCorrectionLevel
列舉有兩種型別的值。從 0 到 8 的固定級別。以及基於資料碼字數的推薦值的級別。中的預設值ErrorCorrectionLevel.AutoNormal
。有關更多詳細資訊,請檢視 PDF417 規範中的表 6 和表 7。
C# Pdf417.ErrorCorrection = ErrorCorrectionLevel.Level_0; //到 Level_8 //或 Pdf417.ErrorCorrection = ErrorCorrectionLevel.AutoNormal; //或 Pdf417.ErrorCorrection = ErrorCorrectionLevel.AutoLow; //比正常少一個 //或 Pdf417.ErrorCorrection = ErrorCorrectionLevel.AutoMedium; //比正常多一個 //或 Pdf417.ErrorCorrection = ErrorCorrectionLevel.AutoHigh; //比平常多兩個
窄條寬度
窄條碼條的寬度(以畫素為單位)。預設值為 2。如果更改此值,程式會確保RowHeight
該值至少為該值的三倍。這QuiteZone
至少是該價值的兩倍。
C# Pdf417.NarrowBarWidth =值;
行高
一行的高度(以畫素為單位)。該值必須大於或等於該NarrowBarWidth
值的3 倍。預設值為 6。
C# Pdf417.RowHeight =值;
安靜區域
條碼周圍靜區的寬度。靜區是白色的。該值必須大於或等於該NarrowBarWidth
值的2 倍。預設值為 4。
C# Pdf417.QuietZone =值;
預設資料列
預設資料列值。該值必須在 1 到 30 的範圍內。預設為 3。輸入資料編碼後,軟體將資料列數設定為預設資料列數並計算資料行數。如果資料行數超過允許的最大值 (90),軟體會將行數設定為允許的最大值並重新計算資料列數。如果結果大於允許的最大列數,則會引發異常。
C# Pdf417.DefaultDataColumns =值;
全域性標籤 ID 字符集
將全域性標籤 ID 字符集設定為 ISO 8859 標準。n 可以是 1 到 9 或 13 或 15。如果字串為空,則使用 ISO-8859-1 的預設值。此處定義了語言支援。
C# Pdf417.GlobalLabelIDCharacterSet = " ISO-8859-n" ;
全域性標籤 ID 使用者定義
設定全域性標籤 ID 使用者定義值。不使用預設值。我沒有找到任何解釋此值用法的參考資料。使用者定義的值必須介於 810900 和 811799 之間。
C# Pdf417.GlobalLabelIDUserDefined = UserDefinedValue;
全域性標籤 ID 通用
設定全域性標籤 ID 通用值。不使用預設值。我沒有找到任何解釋此值用法的參考資料。使用者定義的值必須介於 900 和 810899 之間。
C# Pdf417.GlobalLabelIDGeneralPurpose = UserDefinedValue;
編碼資料
有兩種編碼方法。一個接受文字字串作為輸入,另一個接受位元組陣列作為輸入。
C# Pdf417.Encode( string StringData); //或 Pdf417.Encode(byte[] BinaryData);
條形碼是為二進位制資料設計的。因此,上述第一種方法必須將字串從 16 位字元編碼為位元組陣列。帶有字串輸入的 encode 方法具有以下轉換邏輯。全域性標籤 ID 字符集屬性控制轉換。它分兩步完成。第一步字串到 UTF8,第二步 UTF8 到 ISO-8859-n。如果您想對希伯來語進行編碼,您應該將字符集設定為 ISO-8859-8。
C# 公共 無效編碼(字串字串資料) { //將字串轉換為 UTF8 位元組陣列 byte[] UtfBytes = Encoding.UTF8.GetBytes(StringData); //將 UTF8 位元組陣列轉換為 ISO-8859-n 位元組陣列 Encoding ISO = Encoding.GetEncoding(_GlobalLabelIDCharacterSet ?? " ISO-8859-1" ); byte[] IsoBytes = Encoding.Convert(Encoding.UTF8, ISO, UtfBytes); //呼叫編碼二進位制資料方法 編碼(IsoBytes); 返回; }
最終條碼佈局
資料進行編碼後,可以通過檢查這些值檢查條形碼的佈局:ImageWidth
,ImageHeight
,DataColumns
或DataRows
。如果您想重新調整條碼的寬度和高度,您可以使用以下方法之一。此外,您可以重新調整可選引數:NarrowBarWidth
,RowHeight
或QuietZone
值。
寬高比
此方法將計算資料行數和資料列數,以達到所需的寬高比。該比率包括安靜區。檢查返回值是否成功。
C# Bool Pdf417.WidthToHeightRatio( double Ratio);
設定資料列
此方法將根據所需的資料列數計算資料行數。檢查返回值是否成功。
C# Bool Pdf417.SetDataColumns( int Columns);
設定資料行
此方法將根據所需的資料行數計算資料列數。檢查返回值是否成功。
C# Bool Pdf417.SetDataRows( int Rows);
建立 PDF 文件影像資源
在這一步中,我們從 PDF417 條碼建立一個 PDF 文件影像資源。
C# PdfImage BarcodeImage = new PdfImage(Document, Pdf417);
繪製條碼
最後一步是將條形碼新增到 PDF 文件頁面的內容中。
C# // PosX 和 PosY 是使用者單位的頁面座標。 //寬度為使用者單位條碼的寬度。 //計算條形碼的高度以保持縱橫比。 //高度 = 寬度 * BarcodeImage.ImageHeight / BarcodeImage.ImageWidth Contents.DrawImage(BarcodeImage, PosX, PosY, Width);
2.8. 網頁連結支援
PDF 檔案編寫器庫提供對 Web 連結的支援。此功能是 PDF 參考手冊第 8 節互動功能中描述的 PDF 互動功能之一。它是註解和動作的結合。註釋將 Web 連結與頁面上的區域相關聯。當使用者單擊該區域時,PDF 閱讀器將啟用導航到所需網頁的預設 Web 瀏覽器。
註解區域是由相對於頁面左下角的絕對座標定義的矩形區域。新增類的網頁連結呼叫AddWebLink
方法PdfPage
。
C# Page.AddWebLink( Double LeftPos, Double BottomPos, Double RightPos, Double TopPos, String WebLink );
註釋不是頁面內容的一部分。為了讓 PDF 文件的讀者或 PDF 文件的讀者知道單擊何處,您需要在頁面的同一區域顯示適當的文字或圖形。換句話說,您需要呼叫兩個方法。AddWebLink
與頁面相關聯的方法和與內容相關聯的第二種方法。第二種方法可以是圖形物件,例如影像或矩形,或文字。因為AddWebLink
需要相對於頁面左下角的座標,所以你的圖形物件的座標必須相同。換句話說,不要使用平移、縮放或旋轉。如果這樣做,您需要確保這兩個區域重合。
PDF File Writer 有多種PdfContents
支援文字註釋的方法。
繪製一行帶有關聯 Web 連結的文字。文字將左對齊、下劃線和藍色。文字位置相對於頁面的左下角。
C# //字型大小以 磅為單位 PdfContents.DrawWebLink(PdfPage Page, PdfFont Font, Double FontSize, Double TextAbsPosX, Double TextAbsPosY, String Text, String WebLink);
繪製一行帶有關聯 Web 連結的文字。文字位置相對於頁面的左下角。
C# //字型大小以 磅為單位 PdfContents.DrawWebLink(PdfPage Page, PdfFont Font, Double FontSize, Double TextAbsPosX, Double TextAbsPosY, TextJustify Justify, DrawStyle DrawStyle, Color TextColor, String Text, String WebLink)
在其中繪製 Web 連結TextBox
是一個兩步過程。首先,您使用類的AddText
方法之一將文字和 Web 連結字串新增到框中TextBox
。其次,您TextBox
使用 的DrawText
方法之一將繪製到頁面內容PdfContents
。
將網頁連結新增到TextBox
. 文字將顯示為帶下劃線和藍色。
TextBox.AddText(PdfFont Font, Double FontSize, String Text, String WebLink);
將網頁連結新增到TextBox
. 文字屬性由DrawStyle
和定義FontColor
。
TextBox.AddText(PdfFont Font, Double FontSize, DrawStyle DrawStyle, Color FontColor, String Text, String WebLink);
第二步將文字繪製到內容中。此方法假定沒有額外的行距或段落間距。注意,如果你在DrawText
沒有PdfPage
引數的情況下呼叫TextBox
帶有WebLink
資訊的,ApplicationException
將被丟擲。
//注意:PosYTop 是引用。 //在退出方法時,PosYTop 將擁有下一個 Y 位置 PdfContents.DrawText( Double PosX, ref Double PosYTop, Double PosYBottom, Int32 LineNo, TextBox Box, PdfPage Page);
此方法可讓您定義額外的行距或段落間距。注意,如果你在DrawText
沒有PdfPage
引數的情況下呼叫TextBox
帶有WebLink
資訊的,ApplicationException
將被丟擲。
//注意:PosYTop 是引用。 //退出方法時,PosYTop 將擁有下一個 Y 位置 PdfContents.DrawText( Double PosX, ref Double PosYTop, Double PosYBottom, Int32 LineNo, Double LineExtraSpace, Double ParagraphExtraSpace, Boolean FitTextToWidth, TextBox Box, PdfPage Page);
有關編碼示例,請檢視3.4 Draw Frame、ArticleExample.cs 和 OtherExample.cs 原始碼。
2.9. 書籤支援
PDF 規範(第 8.2.2 節文件大綱)中對書籤的描述如下:“PDF 文件可以選擇在螢幕上顯示文件大綱,允許使用者從文件的一個部分互動導航到另一個部分。大綱包括大綱專案(有時稱為書籤)的樹狀結構層次結構,用作視覺化目錄,向使用者顯示文件的結構。使用者可以通過滑鼠單擊以互動方式開啟和關閉單個專案。”
OtherExample.cs 原始碼有一個書籤示例。在一個位置有一個三層的層次結構。您可以在 OtherExample.pdf 檔案中看到結果。
嚮應用程式新增書籤的第一步是:
//設定程式顯示書籤 //並獲取書籤根物件 PdfBookmark BookmarkRoot = Document.GetBookmarksRoot();
此步驟啟用文件中的書籤並返回根節點。
新增書籤類似於向 Windows 窗體新增控制元件。第一級書籤被新增到根目錄。後續級別將新增到現有書籤中。至少你必須定義一個標題、頁面、頁面上的垂直位置和一個開啟的條目標誌。Page 是要轉到的頁面的 PdfPage 物件。YPos 是相對於頁面左下角的垂直位置。如果較低階別的書籤可見,則開啟條目標誌為真,如果較低階別為隱藏,則為假。預設情況下,第一級始終可見。
//層次結構示例 PdfBookmark FirstLevel_1 = BookmarkRoot.AddBookmark( " Chapter 1" , Page, YPos, false ); PdfBookmark SecondLevel_11 = FirstLevel_1.AddBookmark( " Section 1.1" , Page, YPos, false ); PdfBookmark SecondLevel_12 = FirstLevel_1.AddBookmark( " Section 1.2" , Page, YPos, false ); PdfBookmark ThirdLevel_121 = SecondLevel_12.AddBookmark( " Section 1.2.1" , Page, YPos, false ); PdfBookmark ThirdLevel_122 = SecondLevel_12.AddBookmark( " Section 1.2.2" , Page, YPos, false ); PdfBookmark SecondLevel_13 = FirstLevel_1.AddBookmark( " Section 1.3" , Page, YPos, false ); PdfBookmark FirstLevel_2 = BookmarkRoot.AddBookmark( “第二章” , Page, YPos, false ); PdfBookmark SecondLevel_21 = FirstLevel_2.AddBookmark( " Section 2.1" , Page, YPos, false ); PdfBookmark SecondLevel_22 = FirstLevel_2.AddBookmark( " Section 2.2" , Page, YPos, false );
AddBookmark() 方法有四種過載變體:
//基本 公共PdfBookmark AddBookmark ( String Title, //書籤標題 PdfPage Page, //書籤頁 Double YPos, //書籤相對於頁面左下角的垂直位置 Boolean OpenEntries // true 是顯示子項。假隱藏孩子 ) //標題顏色和樣式 public PdfBookmark AddBookmark ( String Title, //書籤標題 PdfPage Page, //書籤頁 Double YPos, //書籤相對於頁面左下角的垂直位置 Color Paint, //書籤顏色。Coloe.Empty 是以預設顏色顯示標題 TextStyle TextStyle, //書籤文字樣式:正常、粗體、斜體、粗斜體 Boolean OpenEntries // true 是顯示子項。假隱藏孩子 ) // XPos 和縮放 public PdfBookmark AddBookmark ( String Title, //書籤標題 PdfPage Page, //書籤頁 Double XPos, //書籤相對於頁面左下角的水平位置 Double YPos, //相對於頁面左下角的書籤垂直位置 Double Zoom, / /縮放係數。1.0 是 100%。0.0 是忽略縮放。 Boolean OpenEntries // true 是顯示子項。假隱藏孩子 ) //所有選項 public PdfBookmark AddBookmark ( String Title, //書籤標題 PdfPage Page, //書籤頁 Double XPos, //書籤相對於頁面左下角的水平位置 Double YPos, //相對於頁面左下角的書籤垂直位置 Double Zoom, / /縮放係數。1.0 是 100%。0.0 是忽略縮放。 Color Paint, //書籤顏色。Coloe.Empty 是以預設顏色顯示標題 TextStyle TextStyle, //書籤文字樣式:正常、粗體、斜體、粗斜體 Boolean OpenEntries // true 是顯示子項。假隱藏孩子 )
PdfBookmark
類公開了另一種方法GetChild
。您可以通過呼叫GetChild
一個或多個整數引數來獲取任何書籤。每個引數都是級別中子位置的零基引數。例如GetChild(2)
是第一級的第三項。GetChild(2, 3)
是第三個第一級專案的第四個第二級專案。
2.10. 圖表支援
PDF 規範沒有特別支援圖表。PDF File Writer 庫通過允許開發人員建立 Microsoft Charting 物件並將此物件作為影像繪製到 PDF 檔案中來提供圖表支援。有關 Microsoft 圖表控制元件註釋 MSDN 庫文件Visual Studio 2012 圖表控制元件的詳細資訊。圖表名稱空間的文件可在資料視覺化圖表名稱空間獲得。附件ChartExample.cs
有四個圖表示例。如果您打算使用圖表,您需要新增System.Windows.Forms.Visualization
對您的專案的引用。在使用的每個源模組中,Chart
您需要新增using System.Windows.Forms.DataVisualization.Charting;
.
將圖表新增到 PDF 文件是四步過程。
- 建立圖表物件。
- 建立 PdfChart 物件。
- 構建圖表。
- 將 PdfChart 繪製為 PdfContents。
建立圖表的推薦方法是使用PdfChart
物件的靜態方法。
// Document 是您的 PdfDocument 物件。 //寬度和高度以使用者單位為單位。 //解析度以每英寸畫素為單位。 //解析度是可選的。如果未包含,庫將採用 .net 預設值。 //庫將建立以畫素為單位的寬度和高度的 Chart 物件,並以每英寸畫素為單位設定解析度 Chart MyChart = PdfChart.CreateChart(PdfDocument Document, Double Width, Double Height, Double Resolution);
您可以Chart
自己例項化類。
Chart MyChart = new Chart(); MyChart.RenderingDpiY = 300 ; //每英寸 300 畫素的示例 MyChart.Width = 1950 ; // 6.5 英寸畫素 示例 Mychart.Height = 1350 ; //以畫素為單位的 4.6 英寸示例
接下來你PdfChart
從Chart
上面建立的建立一個。或者,您可以覆蓋解析度。
//解析度是可選的。它將覆蓋上面設定的解析度。 PdfChart MyPdfChart = new PdfChart(PdfDocument Document, Chart MyChart, Double Resolution);
接下來構建圖表。ChartExample.cs
有四個例子。構建圖表的文件超出了本文的範圍。網上有很多例子。
PdfChart
有一種CreateFont
方法可以簡化字型的建立。它將根據圖表的解析度計算字型大小。
// FontSizeUnit 是一個列舉 //可用單位:畫素、點、使用者單位、英寸、釐米、毫米 Font CreateFont( String FontFamilyName, FontStyle Style, Double FontSize, FontSizeUnit Unit);
最後一步是繪製圖表。
//繪製在OrigX,OrigY圖表中使用者單元 //寬度和圖表的高度是從圖表物件服用。 //它們是根據圖表的畫素大小和解析度計算的。 public void PdfContents.DrawChart(PdfChart MyPdfChart, Double OrigX, Double OrigY); //在 OrigX、OrigY 處繪製圖表,寬度和高度均指定,均以使用者單位表示。 //注意:應選擇寬度和高度以與圖表物件的縱橫比一致。 public void PdfContents.DrawChart(PdfChart MyPdfChart, Double OrigX, Double OrigY, Double Width, Double Height);
的PdfChart
類提供某些可選的方法來控制影像的定位。
該ImageSize
方法返回適合給定區域的具有正確縱橫比的最大矩形。
SizeD ImageSize(雙倍寬度,雙倍高度);
該ImageSizePosition
方法返回具有正確縱橫比的最大矩形,該矩形將適合給定區域並根據ContentAlignment
列舉對其進行定位。
ImageSizePos ImageSizePosition(雙倍寬度,雙倍高度,ContentAlignment對齊);
2.11. 列印檔案支援
列印文件支援允許您以與列印到印表機和生成 PDF 文件相同的方式列印報告。這種生成PDF檔案的方法和PdfContents
用來生成PDF檔案的區別在於光柵圖形和向量圖形的區別。列印文件支援每頁建立一個 jpeg 影像。PrintExample.cs
有一個建立三頁文件的示例。
通常每個頁面都是頁面的完整影像。如果您的頁面是letter 大小且解析度為每英寸300 畫素,每個畫素為3 個位元組,則頁面的點陣圖長25.245MB。PrintPdfDocument
有一種方法CropRect
可以顯著減小點陣圖的大小。假設使用了 1 英寸的邊距,點陣圖的活動大小將減少到 15.795 MB。即減少了 37.4%。
//主程式 //建立空文件 Document = new PdfDocument(PaperType.Letter, false , UnitOfMeasure.Inch); //建立 PrintPdfDocument,生成每英寸 300 畫素的影像 PdfImageControl ImageControl = new PdfImageControl(); ImageControl.Resolution = 300。0 ; PrintPdfDocument Print = new PrintPdfDocument(Document, ImageControl); //委託方法 PrintPageEventHandler 中的 PrintPage //該方法將一次列印一頁到 PrintDocument Print.PrintPage += PrintPage; //以使用者單位(左、上、右、下)設定邊距 //注意邊距順序是按照 .net 標準而不是 PDF 標準 Print.SetMargins( 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 ); //裁剪頁面影像結果以減小 PDF 檔案大小 //裁剪矩形符合 .net 標準。 //原點在左上角。 Print.CropRect = new RectangleF( 0 . 95F , 0 . 95F , 6 . 6F , 9 . 1F ); //啟動列印過程(呼叫 PrintPage 方法) //列印文件後,將每一頁作為影像新增到 PDF 檔案中。 Print.AddPagesToPdfDocument(); //處理 PrintDocument 物件 列印處理(); //建立 PDF 檔案 Document.CreateFile(FileName);
PrintPage 方法的示例
//將文件的每一頁列印到 PrintDocument 類 //您可以使用標準的 PrintDocument.PrintPage(...) 方法。 //注意:圖形原點在左上角,Y 軸向下。 //換句話說,這不是 PdfContents 列印。 public void PrintPage(物件傳送者,PrintPageEventArgs e) { //圖形物件快捷方式 圖形 G = e.Graphics; //將所有內容設定為高質量 G.SmoothingMode = SmoothingMode.HighQuality; G.InterpolationMode = InterpolationMode.HighQualityBicubic; G.PixelOffsetMode = PixelOffsetMode.HighQuality; G.CompositingQuality = CompositingQuality.HighQuality; //列印邊距內的區域 矩形 PrintArea = e.MarginBounds; //在列印區域周圍繪製矩形 G.DrawRectangle(Pens.DarkBlue, PrintArea); //行高 Int32 LineHeight = DefaultFont.Height + 8 ; 矩形 TextRect = new Rectangle(PrintArea.X + 4 , PrintArea.Y + 4 , PrintArea.Width - 8 , LineHeight); //顯示頁面邊界 // DefaultFont 在其他地方定義 String text = String .Format( " Page Bounds: Left {0}, Top {1}, Right {2}, Bottom {3}" , e.PageBounds.Left, e.PageBounds.Top, e.PageBounds.Right, e.PageBounds.Bottom); G.DrawString(text, DefaultFont, Brushes.Black, TextRect); TextRect.Y += LineHeight; //顯示列印區域 text = String .Format( " Page Margins: Left {0}, Top {1}, Right {2}, Bottom {3}" , PrintArea.Left, PrintArea.Top, PrintArea.Right, PrintArea.Bottom); G.DrawString(text, DefaultFont, Brushes.Black, TextRect); TextRect.Y += LineHeight; //為( Int32 LineNo = 1 ; ; LineNo++)列印一些行 { text = String .Format( "頁{0},行{1}",頁號,行號); G.DrawString(text, DefaultFont, Brushes.Black, TextRect); TextRect.Y += LineHeight; if (TextRect.Bottom > PrintArea.Bottom)中斷; } //移動到下一頁 頁號++; e.HasMorePages = PageNo < = 3 ; 返回; }
2.12. 資料表支援
資料表類允許您在 PDF 文件中顯示資料表。PdfTable
是控制一張表顯示的主類。表格由標題行和資料行組成。每行都分為單元格。PdfTableCell
控制一個標題單元格或一個資料單元格的顯示。如果使用標題,它將顯示在表格的頂部。(可選)它將顯示在每個附加頁面的頂部。要在單元格中顯示資料,請將資料載入到 的Value
屬性中 PdfTableCell
。資料可以是文字字串、基本數值、布林值、字元、TextBox
、影像、二維碼或條形碼。獨立於資料,您可以載入帶有文件連結、Web 連結、視訊、音訊或嵌入檔案的單元格。單擊單元格區域內的任意位置將使 PDF 閱讀器啟用文件連結、Web 連結、視訊、音訊或嵌入檔案。資料的顯示由 PdfTableStyle
類控制。PdfTable
類包含預設單元格樣式和預設標題樣式。您可以使用 .css 檔案中的私有樣式覆蓋預設樣式PdfTableCell
。要顯示錶格,您需要建立一個PdfTable
物件。接下來初始化表格、標題單元格、資料單元格和樣式物件。最後,您設定一個迴圈並載入一行的單元格值,然後繪製該行。這個迴圈一直持續到顯示所有資料。您將在下面找到生成表格的必要步驟序列。
當DrawRow
方法被呼叫時,該軟體計算所需的行高。行高是最高單元格的高度。如果表中有足夠的空間,將繪製該行。當底部可用空間太小時,會呼叫一個新頁面,並在表格頂部顯示可選標題和當前行。如果所需的行高太大以至於無法放入完整的空表,則會引發異常。為了適應長的多行字串或TextBoxes
,軟體可以靈活地處理這些情況。多行字串由PdfTabl
e 轉換為 a TextBox
。本PdfTableStyle
類有一個TextBoxPageBreakLines
屬性。如果此屬性設定為零(預設值),則將TextBox
其視為其他資料值。TextBox
高度必須適合頁面。如果TextBoxPageBreakLines
設定為正整數,系統將計算單元格的高度為TextBox
高度或由指定的前幾行的高度TextBoxPageBreakLines
。系統將使用適合頁面的儘可能多的線繪製行。將建立一個新頁面,並繪製其餘的線條。換句話說, long 的第一個行塊TextBox
將至少是TextBoxPageBreakLines
long。TableExample.cs 源包含長TextBox
單元格的示例。
建立一個PdfTable
物件。
//建立表格 PdfTable Table = new PdfTable(Page, Contents, Font, FontSize);
Page 是當前的 PdfPage。內容是當前的 PdfContents。字型是表格預設字型。FontSize 是以磅為單位的預設字型大小。
在頁面上定義表的區域。
//頁面上表格的區域 Table.TableArea = new PdfRectangle(Left, Bottom, Right, Top); //第一頁起始垂直位置 Table.RowTopPosition = StartingTopPosition;
四個引數是表格相對於左下角的四個邊,以使用者單位表示。如果在第一頁上,桌面位置不在設定RowTopPosition
為起始頂部位置的頁面頂部。在後續頁面上,表格將始終從頂部開始。如果TableArea
未指定,庫會將其設定為預設頁面大小減去一英寸邊距。
將表格寬度分成幾列。
//將表格區域寬度分成幾列 StockTable.SetColumnWidth(Width1, Width2, Width3, ...);
引數的數量是列數。表格寬度減去總邊界線將按這些引數的比例進行劃分。
一旦使用SetColumnWidth
方法設定了列數,庫就會建立兩個PdfTableCell
陣列。一組用於標題單元格,一組用於資料單元格。
資料表的行和列可以用邊框線分隔。邊界線屬性由PdfTableBorder
和定義PdfTableBorderStyle
。有四個水平邊界線:TopBorder
、BottomBorder
、HeaderHorBorder
標題行和第一個資料行CellHorBorder
之間以及資料行之間。有兩組垂直邊界線:HeaderVertBorder
用於標題行內垂直邊界線的陣列,以及CellVertBorder
表格資料部分中列之間的垂直邊界線的陣列。陣列大小是列數加一。陣列元素零是表格的左邊框。陣列元素列是表格的右邊框。所有其他元素都是分隔列的行。這些行中的每一個都可以單獨定義。有一些方法可以一次定義所有邊界線或定義每個單獨的邊界線。
定義所有邊界線的方法:
//清除所有邊界線 Table.Borders.ClearAllBorders(); //將所有邊框線設定為預設值(無需呼叫) //所有邊框線均為 1 點 (1/72") 寬 //所有網格線均為 1 點寬的 0.2 //所有邊框均為黑色 Table.Borders.SetDefaultBorders(); //將所有邊框設定為相同寬度和黑色 Table.Borders.SetAllBorders( Double Width); //將所有邊框設定為相同的寬度和指定的顏色 Table.Borders.SetAllBorders( Double Width, Color LineColor); //將所有邊框設定為一個寬度,將所有網格線設定為另一個寬度所有線條均為黑色 Table.Borders.SetAllBorders( Double FrameWidth, Double GridWidth); //將所有邊框設定為一種寬度和顏色,將所有網格線設定為另一種寬度和顏色 Table.Borders.SetAllBorders( Double FrameWidth, Color FrameColor, Double GridWidth, Color GridColor); //將所有框架邊框設定為相同寬度和黑色並清除所有網格線 Table.Borders.SetFrame( Double Width); //將所有框架邊框設定為相同寬度和指定顏色並清除所有網格線 Table.Borders.SetFrame( Double Width, Color LineColor);
可以清除或設定每個水平邊界線。該示例適用於頂部邊界線:
//清除邊框 Table.Borders.ClearTopBorder(); //將邊框設定為預設顏色設定為黑色 //零寬度表示輸出裝置的一個畫素。 Table.Borders.SetTopBorder(雙線寬); //設定邊框 Table.Borders.SetTopBorder( Double LineWidth, Color LineColor);
可以清除或設定每個垂直邊界線。該示例適用於單元格的垂直邊框線:
//清除邊框 Table.Borders.ClearCellVertBorder( Int32 Index); //設定邊框,預設顏色設定為黑色 Table.Borders.SetCellVertBorder( Int32 Index, Double LineWidth); //設定邊框 Table.Borders.SetCellVertBorder( Int32 Index, Double LineWidth, Color LineColor);
設定其他可選的表屬性。以下示例中給出的值是預設值。
//每個頁面的標題 HeaderOnEachPage = true ; //最小行高 MinRowHeight = 0 . 0 ;
表資訊一次處理一行。每行由單元格組成。每列一個單元格。單元格資訊的顯示由PdfTableStyle
類控制。大約有 20 個樣式屬性。有關完整列表,請檢視原始碼或幫助檔案。其中一些樣式特定於要顯示的資訊型別。這是一個例子
//對預設標題樣式進行一些更改 Table.DefaultHeaderStyle.Alignment = ContentAlignment.BottomRight; //為標題第一列建立私有樣式 Table.Header[0].Style = Table.HeaderStyle; Table.Header[0].Style.Alignment = ContentAlignment.MiddleLeft; //載入標題值 Table.Header[0].Value = " Date" ; //對預設單元格樣式進行一些更改 Table.DefaultCellStyle.Alignment = ContentAlignment.MiddleRight; Table.DefaultCellStyle.Format = " #,##0.00" ; //為日期列建立私有樣式 Table.Cell[0].Style = StockTable.CellStyle; Table.Cell[0].Style.Alignment = ContentAlignment.MiddleLeft; Table.Cell[0].Style.Format = null ;
初始化完成後,是時候顯示資料了。下面的例子來自TableExample.cs
. 這是一張股票價格表。有 6 列。
//開啟股票每日價格 StreamReader Reader = new StreamReader( " SP500.csv" ); //忽略標題 Reader.ReadLine(); //讀取所有日常價格 為(;;) { String TextLine = Reader.ReadLine(); if (TextLine == null ) break ; String[] Fld = TextLine.Split( new Char[] { ' ,' }); Table.Cell[ColDate].Value = Fld[ColDate]; Table.Cell[ColOpen].Value = Double .Parse(Fld[ColOpen], NFI.PeriodDecSep); Table.Cell[ColHigh].Value = Double .Parse(Fld[ColHigh], NFI.PeriodDecSep); Table.Cell[ColLow].Value = Double .Parse(Fld[ColLow], NFI.PeriodDecSep); Table.Cell[ColClose].Value = Double .Parse(Fld[ColClose], NFI.PeriodDecSep); Table.Cell[ColVolume].Value = Int32 .Parse(Fld[ColVolume]); StockTable.DrawRow(); } StockTable.Close();
該DrawRow(NewPage)
方法有一個可選引數Boolean NewPage = false
。預設值為false
。如果您希望將下一行列印在下一頁的頂部,請將引數設定為true
。
互動功能示例。
//使用網頁連結設定單元格編號 6 BookList.Cell[6].WebLink = WebLinkString; //另一種設定網路連結的方法 BookList.Cell[6].AnnotAction = new AnnotWebLink(WebLinkString); //將帶有文件連結的單元格設定為第 3 章 BookList.Cell[6].AnnotAction = new AnnotLinkAction( " Chapter3 " ); //播放視訊 PdfDisplayMedia Omega = new PdfDisplayMedia(PdfEmbeddedFile.CreateEmbeddedFile(Document, " Omega.mp4" )); BookList.Cell[6].AnnotAction = new AnnotDisplayMedia(Omega); //播放音訊 PdfDisplayMedia RingSound = new PdfDisplayMedia(PdfEmbeddedFile.CreateEmbeddedFile(Document, " Ring01.wav" )); BookList.Cell[6].AnnotAction = new AnnotDisplayMedia(RingSound); //允許使用者儲存或檢視嵌入檔案 PdfEmbeddedFile EmbeddedFile = PdfEmbeddedFile.CreateEmbeddedFile(Document, " BookList.txt" ); BookList.Cell[6].AnnotAction = new AnnotFileAttachment(EmbeddedFile, FileAttachIcon.NoIcon);
有關資料表原始碼的更多示例,請檢視ArticleExample.cs
和TableExample.cs
。有關、和類的更多詳細文件 PdfTable
,請檢視幫助檔案。PdfTableCell
PdfTableStyle
PdfTableBorder
PdfFileWriter.chm
2.13. 播放視訊檔案
該PdfFileWriter
支援嵌入PDF文件中的視訊檔案。播放視訊檔案的完整示例在 的第 7 頁中給出 OtherExample.cs
。新增視訊檔案需要使用三個類。首先,您需要將視訊檔案嵌入到 PDF 文件中。
其次,您需要定義視訊的播放方式。的 PdfDisplayMedia
類有許多方法來控制視訊顯示。請參閱類的原始碼和文件幫助檔案。例如:RepeatCount
或 ScaleMedia
。如果要在浮動視窗中播放視訊,則必須使用SetMediaWindow
方法。
第三,您需要在 PDF 頁面上定義使用者必須單擊以啟用視訊的區域。如果要在註釋區域可見時啟用視訊,請使用ActivateActionWhenPageIsVisible
。
//定義與視訊具有相同縱橫比的註釋矩形 PdfRectangle AnnotRect = ImageSizePos.ImageArea( 480 , 360 , AreaLeft, AreaBottom, AreaRight - AreaLeft, AreaTop - AreaBottom, ContentAlignment.MiddleCenter); //建立顯示媒體物件 PdfDisplayMedia DisplayMedia = new PdfDisplayMedia(PdfEmbeddedFile.CreateEmbeddedFile(Document, " LooneyTunes.mp4" )); //建立註解物件 PdfAnnotation Annotation = Page.AddScreenAction(AnnotRect, DisplayMedia); //當頁面可見時啟用視訊 // Annotation.ActivateActionWhenPageIsVisible(true); //定義 X Object 在視訊不播放時繪製註釋區域 PdfXObject AnnotArea = AnnotationArea(AnnotRect.Width, AnnotRect.Height, Color.Lavender, Color.Indigo, " Click here to play the video" ); Annotation.Appearance(AnnotArea);
浮窗視訊顯示
//建立顯示媒體物件 PdfDisplayMedia DisplayMedia = new PdfDisplayMedia(PdfEmbeddedFile.CreateEmbeddedFile(Document, " Omega.mp4" )); //啟用顯示控制元件 DisplayMedia.DisplayControls( true ); //無限重複視訊 DisplayMedia.RepeatCount( 0 ); //在浮動視窗中顯示 DisplayMedia.SetMediaWindow(MediaWindow.Floating, 640 , 360 , WindowPosition.Center, WindowTitleBar.TitleBarWithCloseButton, WindowResize.KeepAspectRatio, "浮動視窗示例" ); Double LineSpacing = ArialNormal.LineSpacing( 12 . 0 ); 雙TextPosX = PosX + 0。5 * 區域寬度; 雙TextPosY = PosY + 0。5 * 區域高度 + 行間距; Double TextWidth = Contents.DrawText(ArialNormal, 12 . 0 , TextPosX, TextPosY, TextJustify.Center, "點選此文字播放視訊" ); TextPosY -= LineSpacing; Contents.DrawText(ArialNormal, 12 . 0 , TextPosX, TextPosY, TextJustify.Center, "在浮動視窗中" ); //建立註釋物件 PdfRectangle AnnotRect = new PdfRectangle(TextPosX - 0 . 5 * TextWidth, TextPosY - ArialNormal.DescentPlusLeading( 12 . 0 ), TextPosX + 0。5 * TextWidth, TextPosY + ArialNormal.AscentPlusLeading( 12 . 0 ) + LineSpacing); Page.AddScreenAction(AnnotRect, DisplayMedia);
2.14. 播放聲音檔案
該PdfFileWriter
支援嵌入PDF文件中的聲音檔案。播放聲音檔案的完整示例在 的第 7 頁中給出 OtherExample.cs
。嵌入聲音檔案本質上與視訊檔案相同。唯一明顯的區別是沒有什麼可顯示的。
//建立嵌入媒體檔案 PdfDisplayMedia DisplayMedia = new PdfDisplayMedia(PdfEmbeddedFile.CreateEmbeddedFile(Document, " Ring01.wav" )); DisplayMedia.SetMediaWindow(MediaWindow.Hidden); AnnotDisplayMedia RingSound = new AnnotDisplayMedia(DisplayMedia); //顯示文字區域以啟用聲音 Double LineSpacing = ArialNormal.LineSpacing( 12 . 0 ); 雙TextPosX = PosX + 0。5 * 區域寬度; 雙TextPosY = PosY + 0。5 * 區域高度 + 行間距; Contents.DrawTextWithAnnotation(Page, ArialNormal, 12 . 0 , TextPosX, TextPosY, TextJustify.Center, DrawStyle.Normal, Color.Red, "點選此文字播放" , RingSound); TextPosY -= LineSpacing; Contents.DrawTextWithAnnotation(Page, ArialNormal, 12 . 0 , TextPosX, TextPosY, TextJustify.Center, DrawStyle.Normal, Color.Red, "鈴聲" , RingSound);
2.15. 附加資料檔案
該PdfFileWriter
支援嵌入PDF文件中的資料檔案。的第 7 頁給出了嵌入檔案的完整示例OtherExample.cs
。使用者可以儲存檔案或顯示檔案。
//建立嵌入媒體檔案 PdfEmbeddedFile EmbeddedFile = PdfEmbeddedFile.CreateEmbeddedFile(Document, " BookList.txt" ); AnnotFileAttachment FileIcon = new AnnotFileAttachment(EmbeddedFile, FileAttachIcon.Paperclip); //顯示文字區域以啟用檔案附件 Double LineSpacing = ArialNormal.LineSpacing( 12 . 0 ); 雙TextPosX = PosX + 0。5 * 區域寬度; 雙TextPosY = PosY + 0。5 * 區域高度 + 行間距; Contents.DrawText(ArialNormal, 12 . 0 , TextPosX, TextPosY, TextJustify.Center, "右鍵單擊回形針" ); TextPosY -= LineSpacing; Double TextWidth = Contents.DrawText(ArialNormal, 12 . 0 , TextPosX, TextPosY, TextJustify.Center, "開啟或儲存附件" ); //註釋 Double IconPosX = TextPosX + 0 . 5 * 文字寬度 + 0。1 ; 雙IconPosY = TextPosY; PdfRectangle AnnotRect = new PdfRectangle(IconPosX, IconPosY, IconPosX + 0 . 15 , IconPosY + 0 . 4 ); Page.AddFileAttachment(AnnotRect, EmbeddedFile, FileAttachIcon.Paperclip); TextPosY -= 2 * 行間距; AnnotFileAttachment FileText = new AnnotFileAttachment(EmbeddedFile, FileAttachIcon.NoIcon); Contents.DrawTextWithAnnotation(Page, ArialNormal, 12 . 0 , TextPosX, TextPosY, TextJustify.Center, DrawStyle.Underline, Color.Red, "檔案附件(右擊)" , FileText);
2.16. 重新排序頁面
在PdfFileWriter
追加新的頁面,頁面列表的末尾。如果要將頁面從當前位置移動到新位置,請使用以下方法。
//源和目標索引從零開始。 // Source 必須是 0 到 PageCount - 1。 // Destination 必須是 0 到 PageCount。 //如果目標索引是 PageCount,則該頁面將是最後一頁 // PageCount 是 PdfDocument 的一個屬性。 Document.MovePage( Int32 SourceIndex, Int32 DestinationIndex);
2.17. PDF 文件輸出
PdfFileWriter 建立 PDF 文件。主類 PdfDocument 建構函式為您提供了兩種儲存文件的選擇。第一種選擇是將 PDF 檔案儲存到磁碟檔案。在這種情況下,您為建構函式提供一個檔名。在檔案建立結束時,您呼叫 PdfDocument.CreateFile。此方法將 PDF 寫入檔案並關閉檔案。
//建立主類 PdfDocument Document = new PdfDocument(PaperType.Letter, false , UnitOfMeasure.Inch, FileName); //終止 Document.CreateFile();
第二個選擇是流。您建立一個流,記憶體流或檔案流,並將該流作為引數傳遞給 PdfDocument 建構函式。執行 CreateFile 方法後,您的流將包含 PDF 文件。根據您的應用程式從流中提取文件。您必須關閉應用程式中的流。
//建立記憶體流 MemoryStream PdfStream = new MemoryStream(); //建立主類 PdfDocument Document = new PdfDocument(PaperType.Letter, false , UnitOfMeasure.Inch, PdfStream); //終止 Document.CreateFile(); //將記憶體流儲存到檔案 FileStream FS = new FileStream(FileName, FileMode.Create); PdfStream.WriteTo(FS); PdfStream.Close(); FS.關閉();
2.18. 文件資訊字典
PDF 文件資訊字典由 PDF 閱讀器顯示在文件屬性的描述選項卡中。資訊包括:標題、作者、主題、關鍵字、建立日期和時間、修改日期和時間、生成檔案的應用程式、PDF 生成器。在您的應用程式中包含文件資訊的操作如下:
PdfInfo Info = new PdfInfo(Document); Info.Title( "文章示例" ); Info.Author( “ Uzi Granot Granotech Limited” ); Info.Keywords( " PDF, .NET, C#, Library, Document Creator" ); Info.Subject( " PDF 檔案編寫器 C# 類庫 (版本 1.15.0)" );
當PdfInfo
物件被建立,四個額外的欄位被新增到詞典中。您可以在程式碼中覆蓋所有這些。
//設定建立和修改日期 DateTime LocalTime = DateTime.Now; Info.CreationDate(LocalTime); Info.ModDate(LocalTime); //設定建立者和生產者 Info.Creator( " PdfFileWriter C# Class Library Version " + PdfDocument.RevisionNumber); Info.Producer( " PdfFileWriter C# 類庫版本" + PdfDocument.RevisionNumber);
2.19. 記憶體控制
在構建文件時,PDF 檔案編寫器會累積建立 PDF 檔案所需的所有資訊。除影像和嵌入檔案外,資訊儲存在記憶體中。影像和嵌入檔案在宣告時會自動寫入輸出檔案。對於非常大的文件,使用的記憶體不斷增長。該庫提供方法 ( CommitToPdfFile
) 將內容資訊寫入輸出檔案並呼叫垃圾收集器以釋放未使用的記憶體。該GC.Collect
方法需要時間來執行。如果執行時間是一個問題,請GCCollect
每隔幾頁設定一次引數。換句話說,CommitToPdfFile
必須為每個頁面執行一次,但每隔幾頁進行一次清理。一旦執行了提交,就不能新增額外的資訊。 PdfTable
當下一行無法容納在當前頁面的底部時,自動開始一個新頁面。的PdfTable
類有兩個成員CommitToPdfFile
和CommitGCCollectFreq
到控制儲存器的使用,同時一個表正在被構建。的PdfChart
類生成從.NET圖表類的影像。的DrawChart
方法PdfContents
將執行提交。或者,您可以呼叫 的CommitToPdfFile
方法PdfChart
。
// PdfContents、PdfXObject 和 PdfTilingPattern //將內容提交到輸出檔案。 //一旦提交,此 PdfContents 將無法使用。 //引數是 GCCollect Contents.CommitToPdfFile( true );
2.20 Windows Presentation Foundation WPF
繪製 WPF 圖形是一個四步過程。
- 第一步:建立
DrawWPFPath
物件。輸入引數是路徑和 Y 軸方向。 - 第 2 步:可選擇通過呼叫七個
SetBrush
方法之一或呼叫UseCurrentBrush
方法來新增畫筆。 - 步驟 3:可選擇通過呼叫兩種
SetPen
方法之一或呼叫UseCurrentPen
方法來新增筆。 - 第 4 步:通過呼叫繪製圖形物件
PdfContents.DrawWPFPath
。
如果System.Windows.Media
引用不是可用(即你的應用程式是Windows窗體),你需要新增PresentationCore
和WindowsBase
元件到應用程式。
OtherExample.cs
Example8e 和 Example8f 中給出了使用 WPF 圖形類繪圖的程式設計示例。
如果未定義畫筆和筆,則繪製圖形將作為剪輯路徑。
您將在下面找到有關如何將 DrawWPFPath 類用於 WPF 應用程式和其他應用程式的更多詳細資訊。
DrawWPFPath
建構函式接受兩個引數:路徑和 Y 軸方向。路徑是字串或System.Windows.Media.PathGeometry
. 文字字串在Path Markup Syntax 中定義。路徑幾何類在PathGeometry Class 中描述。為 WPF 環境定義路徑時,Y 軸方向向下。Y 軸適用於 PDF 環境。
請注意世界上任何地方使用除句點以外的數字小數分隔符的程式設計師。表示路徑的文字字串輸入必須完全按照路徑標記語法中的定義構造。無論世界區域如何,帶分數的小數都必須使用句點。如果在 x 和 y 值之間使用可選分隔符,則它必須是逗號。如果字串是由另一個應用程式生成的,請確保使用以下方法呼叫 PathGeometry ToString:PathGeometry.ToString(System.Globalization.CultureInfo.InvariantCulture)。換句話說,Microsoft 的 PathGeometry.Parse 方法將無法讀取在義大利生成的文字字串,例如,通過 PathGeometry.ToString 方法沒有將 IFormatProvider 設定為InvariantCulture。 |
可以通過三種方法為 WPF 應用程式定義畫筆。所有這些方法都會同時設定畫筆不透明度。
System.Windows.Media.SolidColorBrush
請參閱SolidColorBrush 類System.Windows.Media.LinearGradientBrush
請參閱LinearGradientBrush 類System.Windows.Media.RadialGradientBrush
請參閱RadialGradientBrush 類
有五種方法可以為所有應用程式定義畫筆。所有這些方法都會同時設定畫筆不透明度。
- 將畫筆設定為
System.Drawing.Color
。 - 將畫筆設定為
PdfAxialShading
- 將畫筆設定為
PdfRadialShading
- 將畫筆設定為
PdfTilingPattern
- 將畫筆設定為
UseCurrentBrush
如果希望DrawWPFPath
類將畫筆設定為當前選定的畫筆,請呼叫UseCurrentBrush
方法。
有一種方法可以為 WPF 應用程式定義筆。SetPen
使用System.Windows.Media.Pen
類呼叫方法(請參閱Pen 類)。請注意,該Pen.Brush
屬性必須為SolidColorBrush
。pen 類包含繪製線條所需的所有資訊,例如顏色和寬度。
有一種方法可以為所有應用程式定義一支筆。打電話SetPen
與System.Drawing.Color
論證。color 引數定義了 alpha、紅色、綠色和藍色分量。要設定其他筆特性,請設定以下任何或所有屬性和方法:
SetPenWidth
DashArray
DashPhase
LineCap
LineJoin
MiterLimit
如果您希望DrawWPFPath
類將筆設定為當前選定的筆呼叫UseCurrentPen
方法。
一旦DrawWPFPath
類設定的所有資訊需要繪製的路徑,呼叫PdfContents.DrawWPFPath
方法。DrawWPFPath 類根據路徑邊界框和繪圖矩形以及對齊方式計算將輸入路徑轉換為繪圖矩形所需的變換矩陣。零對齊(預設)將拉伸路徑以適合繪圖區域。所有其他對齊值根據引數列舉值在繪圖區域內定位路徑。
public void DrawWPFPath( DrawWPFPath Path, //要繪製的路徑 double OriginX, //以使用者單位繪製矩形 left side double OriginY, //以使用者單位繪製矩形bottom side double Width, //以使用者單位繪製矩形 width double Height, //繪製矩形以使用者為單位高度 //內繪製矩形路徑對準 //對齊= 0表示路徑將被拉伸 //在水平或垂直方向 //以適合繪製矩形 的ContentAlignment對齊=0 )
2.21 透明度、不透明度、Alpha 顏色分量和混合
預設情況下,PDF 成像模型將物件(形狀、線條、文字和影像)不透明地繪製到頁面上。每個新物件都完全遮住了它下面的影像。PDF 有兩種機制來改變不透明度和混合這種行為。圖形狀態字典具有描邊(筆)和非描邊(畫筆)操作的不透明度值。完全不透明的不透明度值為 1.0,完全透明的值為 0.0。不透明度值對應於顏色結構的 alpha 分量,1.0 是 255 alpha,0.0 是 0 alpha。如果不透明度值為 0.5,則在頁面上繪製的新物件的透明度為 50%。要設定不透明度,請呼叫SetAlphaStroking
線條 SetAlphaNonStroking
方法或形狀方法。混合是將頁面上的顏色與正在繪製的新專案的顏色相結合的過程。要設定平淡模式,請呼叫SetBlendMode
的方法 PdfContents
。引數是BlendMod
列舉。有關完整說明,請參閱 PDF 規範文件的第 7.2.4 節混合模式。例如,請參閱OtherExample.cs
第 8 頁。
2.22. 文件連結和命名目的地
文件連結允許 PDF 文件使用者單擊連結並跳轉到文件的另一部分。新增文件連結分兩部分完成。目的地被定義為位置標記。位置標記必須具有唯一名稱、範圍(LocalDest
或NamedDest
)和文件位置(頁面和位置)。 NamedDest
範圍可用於文件連結或命名目的地或兩者。第二部分是連結位置。這兩個部分可以按任何順序定義。他們被名字聯絡在一起。名稱區分大小寫。許多連結可以指向同一個位置標記。
命名目標是 PDF 文件中的目標。它們以與文件連結相同的方式使用位置標記定義。範圍必須設定為NamedDest
。當 Adobe Acrobat 等 PDF 閱讀器開啟 PDF 文件時,它可以在開啟文件的同時在檢視視窗中顯示目標。
要嵌入位置標記,請呼叫 的AddLocationMarker
方法PdfPage
。注意:名稱區分大小寫。
//給文件新增位置標記(PdfPage 方法) public void AddLocationMarker ( string LocMarkerName, //唯一目標名稱(區分大小寫) LocMarkerScope Scope, // LocalDest 或 NamedDest DestFit FitArg, //擬合引數(見下文) params double[] SideArg // 0、1 或 4 邊尺寸引數(見下文) ) )
要新增連結位置,請呼叫 PdfPage 的 AddLinkLocation 方法。
公共PdfAnnotation AddLinkAction ( string LocMarkerName, //位置標記名稱 PdfRectangle AnnotRect //頁面矩形區域啟用跳轉 )
有關指定目的地的更多資訊,請參閱 Adobe PDF 檔案規範“PDF 參考,第六版,Adobe 行動式文件格式版本 1.7 2006 年 11 月”。第 582 頁的表 8.2。
DestFit.Fit
(no arg): 顯示頁面,其內容被放大到足以在視窗中水平和垂直地容納整個頁面。DestFit.FitH
(1 arg Top):顯示頁面,垂直座標頂部位於視窗的上邊緣,頁面內容被放大到剛好適合視窗內頁面的整個寬度。DestFit.FitV
(1 arg Left):顯示頁面,左水平座標位於視窗的左邊緣,頁面內容被放大到剛好適合視窗內頁面的整個高度。DestFit.FitR
(4 args Left Bottom Right Top):顯示頁面,其內容被放大到剛好適合視窗內水平和垂直座標左、下、右和頂部指定的矩形。DestFit.FitB
(無引數):顯示頁面,其內容被放大到足以在水平和垂直方向完全適合視窗內的邊界框。DestFit.FitBH
(1 arg Top):顯示頁面,垂直座標頂部位於視窗的頂部邊緣,頁面內容被放大到剛好適合視窗內邊界框的整個寬度。DestFit.FitBV
(1 arg Left):顯示頁面,左水平座標位於視窗的左邊緣,頁面內容被放大到剛好適合視窗內邊界框的整個高度。
PDF 閱讀器的呼叫引數在Adobe 開啟 PDF 檔案的引數中定義。如果 PDF 在臺式計算機上開啟,則呼叫行必須是:
"path\AcroRd32.exe" /A "nameddest=ChapterXX" "path\Document.pdf"
如果 PDF 文件由網頁中的連結指向,則目標將附加到連結:
<a href="http://example.org/Document.pdf#ChapterXX">目標描述</a>
或者:<a href="http://example.org/Document.pdf#namedsest=ChapterXX">目標描述</a>
2.23. 加密支援
PDF 檔案編寫器庫支援 AES 128 和標準 128 (RC4) 加密。有關更多資訊,請參閱 PDF 參考第六版(1.7 版)第 3.5 節加密。PDF 檔案編寫器支援兩種型別的加密過濾器,AES-128 和標準 128。標準 128 是 RC4 加密。它被認為是不安全的。對於新專案,不要使用它。不支援公鑰安全對收件人列表進行編碼。
要加密您的 PDF 文件,請呼叫類中SetEncryption
定義的四種方法之一PdfDocument
:
設定不帶引數的加密。
PDF File Writer 庫將使用 AES-128 加密對 PDF 文件進行加密。PDF 閱讀器無需密碼即可開啟文件。許可權標誌設定為允許所有。
Document.SetEncryption();
使用一個引數設定加密。
PDF File Writer 庫將使用 AES-128 加密對 PDF 文件進行加密。引數是許可權。許可權標誌定義如下。您可以或一起擁有多個許可權。PDF 參考手冊有許可權的完整描述。PDF 閱讀器無需密碼即可開啟文件。
Document.SetEncryption(許可權許可權);
使用兩個引數設定加密。
PDF File Writer 庫將使用 AES-128 加密對 PDF 文件進行加密。這兩個引數是使用者密碼和許可權。PDF 閱讀器將使用使用者密碼開啟文件。許可權將根據引數設定。
Document.SetEncryption( String UserPassword, Permission Permissions);
使用四個引數設定加密。
PDF 檔案編寫器庫將使用 EncryptionType.Aes128 加密或 EncryptionType.Standard128 加密對 PDF 文件進行加密。四個引數是使用者密碼、所有者密碼、許可權和加密型別。如果使用者密碼為空,則使用預設密碼。如果所有者密碼為空,軟體將生成隨機數密碼。Standard128 加密被認為是不安全的。它不應該用於新專案。
Acrobat 等 PDF 閱讀器將接受使用者或所有者密碼。如果使用所有者密碼開啟文件,PDF 閱讀器將使用所有許可權設定為允許操作開啟它。
Document.SetEncryption( String UserPassword, String OwnerPassword, Permission Permissions, EncryptionType Type);
許可權標誌如下:
//完整描述見 // PDF 參考版本 1.7 表 3.20 公共 列舉許可權 { 無 = 0 , LowQalityPrint = 4 , // bit 3 ModifyContents = 8 , // bit 4 ExtractContents = 0x10 , // bit 5 Annotation = 0x20 , // bit 6 Interactive = 0x100 , // bit 9 Accessibility = 0x200 , // bit 10 AssembleDoc = 0x400 , //位 11 列印 = 0x804 , //位 12 + 位 3 All = 0xf3c , //第 3、4、5、6、9、10、11、12 位 }
2.24. 粘滯便箋或文字註釋。
PDF 參考文件在第 8.4 節第 621 頁中定義了便籤或文字註釋。“文字註釋表示附加到 PDF 文件中某個點的“便籤”。關閉時,註釋顯示為圖示;開啟時,它會顯示一個彈出視窗,其中包含以檢視器應用程式選擇的字型和大小的筆記文字。文字註釋不隨頁面縮放和旋轉;它們的行為就像始終設定 NoZoom 和 NoRotate 註釋標誌(參見第 608 頁的表 8.16)一樣。表 8.23 顯示了特定於此類註釋的註釋字典條目。”
在您的文件中新增便利貼非常簡單。您新增一行程式碼。便籤被新增到PdfPage
物件。它不是頁面內容的一部分。便籤的位置是從頁面左下角到便籤圖示左上角的絕對頁面位置。文字字串是彈出視窗的內容。便籤引數是下面的列舉項之一。
//便籤文字註釋 Page.AddStickyNote(PageAbsPosX, PageAbsPosY, "我的第一個便籤" , StickyNoteIcon.Note); //便籤圖示 public enum StickyNoteIcon { //註釋(注意:沒有圖示) 評論, //鍵 鑰匙, //注意(預設) 筆記, //幫助 幫助, //新段落 新段落, //段落 段落, //插入 插, }
2.25. 圖層或可選內容。
PDF 規範文件(第 4.10 節)定義了可選內容如下。“可選內容 (PDF 1.5) 是指 PDF 文件中可以由文件作者或消費者有選擇地檢視或隱藏的內容部分。此功能在 CAD 繪圖、分層圖稿、地圖和多語言文件等專案中非常有用。”
Adobe Acrobat 檢視器在螢幕左側有導航皮膚。其中之一是圖層皮膚。如果 PDF 文件使用圖層,則此皮膚中將顯示圖層控制開關。使用者可以顯示或隱藏附加到這些圖層控制元件的專案。
向您的 PDF 文件新增圖層。完整示例在 中給出LayersExample.cs
。此外OtherExample.cs
還有使用圖層控制影像和註釋的示例。
建立主要圖層控制物件。每份檔案一份。
//建立一個圖層控制元件物件併為其命名。 //只允許一個這樣的物件。 //名稱將顯示在圖層皮膚中。 PdfLayers Layers = new PdfLayers(Document, " PDF layers group" );
設定列表模式選項。預設為所有頁面
//列表模式 Layers.ListMode = ListMode.AllPages; //預設 //或 Layers.ListMode = ListMode.VisiblePages;
建立一個或多個圖層物件。每一項都對應圖層皮膚上的一個核取方塊。每個人都可以控制一個或多個顯示專案。
//建立一個或多個圖層物件 PdfLayer LayerName = new PdfLayer(Layers, " Layer name" );
許多層可以組合成單選按鈕組。一組單選按鈕可以全部關閉或僅開啟一層。
//可選地將三層組合成 //一組單選按鈕 LayerName1.RadioButton = " Group1" ; LayerName2.RadioButton = " Group1" ;
在圖層窗格中設定圖層的順序。如果不使用 DisplayOrder 方法,程式將在同一主層上列出上面指定的所有層。如果使用 DisplayOrder 方法,則必須包含所有圖層
圖層列表可以有帶有可選名稱的子組
//顯示順序 Layers.DisplayOrder(LayerName1); Layers.DisplayOrder(LayerName2); Layers.DisplayOrder(LayerName3); Layers.DisplayOrderStartGroup( "子組" ); Layers.DisplayOrder(LayerName4); Layers.DisplayOrder(LayerName5); Layers.DisplayOrder(LayerName6); Layers.DisplayOrderEndGroup();
定義內容流中的區域以按層控制
//內容流開始層標記 Contents.LayerStart(LayerName1); //您的內容方法 //由 LayerName1 控制 // LayerName1 區域的結尾 Contents.LayerEnd();
直接控制影像或註釋。影像可以位於文件中的任何位置。
//影像或註釋控制元件 QREncoder QREncoder = new QREncoder(); QREncoder.ErrorCorrection = ErrorCorrection.M; QREncoder.Encode( "一些資料" ); PdfImage QRImage = new PdfImage(Document); QRImage.LayerControl = LayerName1; QRImage.LoadImage(QREncoder);
2.26. 初始文件顯示。
當 PDF 檢視器 (Acrobat) 顯示文件時,初始文件顯示控制文件的外觀。它控制螢幕的左窗格。
例如,開啟書籤窗格。
Document.InitialDocDisplay = InitialDocDisplay.UseBookmarks;
//初始文件顯示列舉 public enum InitialDocDisplay { //保持左窗格關閉 使用無, //開啟書籤窗格 使用書籤, //開啟頁面縮圖 使用拇指, //全屏模式 全屏, //開啟圖層 使用圖層, //開啟附件 使用附件, }
2.27. XMP 後設資料。
XMP 檔案或位元組陣列嵌入在 PDF 物件中包含的後設資料流中。XMP 必須編碼為 UTF-8。PdfFileWriter 包括使用者提供的輸入檔案或輸入位元組陣列。使用者必須確保 XMP 輸入是有效的元檔案。XMP 流未壓縮或加密。這使讀者可以通過很少的程式設計來獲取後設資料資訊。您應該在建立 PdfDocument 後不久和載入任何影像之前包含 XMP matadata。通過這樣做,後設資料將位於檔案的開頭,並且可以被簡單的文字編輯器讀取。
//新增後設資料 new PdfMatadata(Document, FileName); //或 新的PdfMetadata(Document, ByteArray);
3. 示例開發指南
本節介紹將 PDF 檔案編寫器 C# 類庫整合到您的應用程式。測試程式TestPdfFileWriter
程式是對您自己的應用程式的模擬。當您按下“文章示例”按鈕時,程式將執行ArticleExample.cs
原始檔中的程式碼。上圖顯示了生成的 PDF 檔案。此方法演示了使用一些文字和圖形建立一頁文件。看完這個例子後,你應該對這個過程有一個很好的理解。其他示例按鈕生成各種 PDF 文件。總的來說,這些示例演示了該庫的幾乎所有功能。
除錯核取方塊,如果選中,將建立一個可以用文字編輯器檢視但不能載入到 PDF 閱讀器的 PDF 檔案。結果檔案未壓縮,影像和字型檔案替換為文字佔位符。除錯核取方塊應該僅用於除錯。
TestPdfFileWriter 程式是使用 Microsoft Visual C# 2012 開發的。它已針對 Windows XP、Vista、7 和 8 進行了測試。
3. 示例開發指南
本節介紹將 PDF 檔案編寫器 C# 類庫整合到您的應用程式。測試程式TestPdfFileWriter
程式是對您自己的應用程式的模擬。當您按下“文章示例”按鈕時,程式將執行ArticleExample.cs
原始檔中的程式碼。上圖顯示了生成的 PDF 檔案。此方法演示了使用一些文字和圖形建立一頁文件。看完這個例子後,你應該對這個過程有一個很好的理解。其他示例按鈕生成各種 PDF 文件。總的來說,這些示例演示了該庫的幾乎所有功能。
除錯核取方塊,如果選中,將建立一個可以用文字編輯器檢視但不能載入到 PDF 閱讀器的 PDF 檔案。結果檔案未壓縮,影像和字型檔案替換為文字佔位符。除錯核取方塊應該僅用於除錯。
TestPdfFileWriter 程式是使用 Microsoft Visual C# 2012 開發的。它已針對 Windows XP、Vista、7 和 8 進行了測試。
3.1. 文件建立概述
下面的測試方法演示了建立 PDF 檔案簡介中描述的六個步驟。當您按下演示程式的“文章示例”按鈕時,將執行該方法。以下小節詳細描述了每個步驟。
//建立文章示例測試 PDF 文件 public void Test ( bool除錯, 字串檔名 ) { { //第 1 步:建立空文件 //引數:頁面寬度:8.5",頁面高度:11",度量單位:英寸 //返回值:PdfDocument 主類 Document = new PdfDocument(PaperType.Letter, false , UnitOfMeasure.英寸,檔名); //用於加密測試 // Document.SetEncryption(null, null, Permission.All & ~Permission.Print, EncryptionType.Aes128); //除錯屬性 //預設情況下它設定為 false。僅用於除錯。 //如果設定了這個標誌,PDF 物件將不會被壓縮,字型和影像將被 //替換為文字佔位符。您可以使用文字編輯器檢視檔案,但無法使用 PDF 閱讀器開啟它。 Document.Debug = 除錯; PdfInfo 資訊 = PdfInfo.CreatePdfInfo(Document); Info.Title( "文章示例" ); Info.Author( “烏茲·格拉諾特” ); Info.Keywords( " PDF, .NET, C#, Library, Document Creator" ); Info.Subject( " PDF 檔案編寫器 C# 類庫 (版本 1.21.0)" ); //第二步:建立資源 //定義字型資源 定義字型資源(); //定義平鋪模式資源 定義TilingPatternResource(); //第三步:新增新頁面 Page = new PdfPage(Document); //第 4 步:向頁面新增內容 Contents = new PdfContents(Page); //第五步:在contents物件中新增圖形和文字內容 DrawFrameAndBackgroundWaterMark(); DrawTwoLinesOfHeading(); DrawHappyFace(); DrawBarcode(); DrawPdf417Barcode(); 繪製影像(); 繪製圖表(); 繪製文字框(); DrawBookOrderForm(); //第六步:建立pdf檔案 Document.CreateFile(); //啟動預設 PDF 閱讀器並顯示檔案 Process Proc = new Process(); Proc.StartInfo = new ProcessStartInfo(FileName); 程式開始(); //退出 返回; }
3.2. 字型資源
該DefineFontResources
方法建立了本示例中使用的所有字型資源。要檢視任何字型可用的所有字元,請按“字型系列”按鈕。選擇一個族並檢視為每個字元定義的字形。要檢視單個字形,請按檢視或雙擊。
//定義字型資源 private void DefineFontResources() { //定義字型資源 // Arguments: PdfDocument class, font family name, font style, embed flag //字型樣式(必須是:Regular, Bold, Italic or Bold | Italic) 其他所有樣式無效。 //嵌入字型。如果為 true,字型檔案將嵌入 PDF 檔案中。 //如果為false,字型將不會被嵌入 字串FontName1 = " Arial" ; string FontName2 = " Times New Roman" ; ArialNormal = PdfFont.CreatePdfFont(Document, FontName1, FontStyle.Regular, true ); ArialBold = PdfFont.CreatePdfFont(Document, FontName1, FontStyle.Bold, true ); ArialItalic = PdfFont.CreatePdfFont(Document, FontName1, FontStyle.Italic, true ); ArialBoldItalic = PdfFont.CreatePdfFont(Document, FontName1, FontStyle.Bold | FontStyle.Italic, true ); TimesNormal = PdfFont.CreatePdfFont(Document, FontName2, FontStyle.Regular, true ); Comic = PdfFont.CreatePdfFont(Document, " Comic Sans MS" , FontStyle.Bold, true ); 返回; }
3.3. 平鋪模式資源
該DefineTilingPatternResource
方法定義了示例區域的背景圖案資源。圖案是淺藍色背景上的白色“PdfFileWriter”字樣。該模式由兩行重複的關鍵字組成。兩條線偏斜了半個字長。
如果您想找到有趣的圖案,請在網際網路上搜尋製造地磚或牆磚的公司目錄。
//定義平鋪模式資源 private void DefineTilingPatternResource() { //建立空的平鋪圖案 WaterMark = new PdfTilingPattern(Document); //該模式將 PdfFileWriter 放在磚模式 字串中Mark = " PdfFileWriter" ; // Arial 粗體的文字寬度和高度 18 磅double FontSize = 18 . 0 ; double TextWidth = ArialBold.TextWidth(FontSize, Mark); double TextHeight = ArialBold.LineSpacing(FontSize); //文字基線 double BaseLine = ArialBold.DescentPlusLeading(FontSize); //整體圖案框(我們新增文字高度值作為左右文字邊距) double BoxWidth = TextWidth + 2 * TextHeight; 雙框高度 = 4 *文字高度; WaterMark.SetTileBox(BoxWidth, BoxHeight); //儲存圖形狀態 WaterMark.SaveGraphicsState(); //用淺藍色背景填充圖案框 WaterMark.SetColorNonStroking(Color.FromArgb( 230 , 244 , 255 )); WaterMark.DrawRectangle( 0 , 0 , BoxWidth, BoxHeight, PaintOp.Fill); //將水印文字的填充顏色設定為白色 WaterMark.SetColorNonStroking(Color.White); //在框的底部中心繪製 PdfFileWriter WaterMark.DrawText(ArialBold, FontSize, BoxWidth / 2 , BaseLine, TextJustify.Center, Mark); //將基線向上調整一半高度 BaseLine += BoxHeight / 2 ; //繪製 PdfFileWriter 的右半部分,左移半寬 WaterMark.DrawText(ArialBold, FontSize, 0 . 0 , BaseLine, TextJustify.Center, Mark); //繪製 PdfFileWriter 的左半部分右移半寬 WaterMark.DrawText(ArialBold, FontSize, BoxWidth, BaseLine, TextJustify.Center, Mark); //恢復圖形狀態 WaterMark.RestoreGraphicsState(); 返回; }
3.4. 畫框與背景圖案
該DrawFrameAndBackgroundWaterMark
方法在具有背景水印圖案的示例區域周圍繪製框架。模式資源在上一小節中定義。
//在示例區域周圍畫框 private void DrawFrameAndBackgroundWaterMark() { //儲存圖形狀態 Contents.SaveGraphicsState(); //在頁面周圍繪製邊框 //將線寬設定為 0.02" Contents.SetLineWidth( 0 . 02 ); //設定框架顏色為深藍色 Contents.SetColorStroking(Color.DarkBlue); //使用水印平鋪圖案填充框架 Contents.SetPatternNonStroking(WaterMark); //矩形位置:x=1.0", y=1.0", width=6.5", height=9.0" Contents.DrawRectangle( 1 . 0 , 1 . 0 , 6 . 5 , 9 . 0 , PaintOp.CloseFillStroke); //恢復圖形狀態 Contents.RestoreGraphicsState(); //在框架下繪製文章名稱 //注意:\u00a4 是在字型資源定義期間替換的字元 164 //這個字元是一個實心圓它通常是 Unicode 9679 或 Arial 系列中的 \u25cf Contents.DrawText(ArialNormal , 9 . 0 , 1 . 1 , 0 . 85 , " PdfFileWriter \u25cf PDF 檔案編寫器 C# 類庫 \u25cf 作者:Uzi Granot" ); //繪製文章的網頁連結 Contents.DrawWebLink(Page, ArialNormal, 9 . 0 , 7 . 4 , 0 . 85 , TextJustify.Right, DrawStyle.Underline, Color.Blue, "點選檢視文章" , ArticleLink); 返回; }
3.5. 繪製兩條標題線
該DrawTwoLinesOfHeading
方法在頁面中心繪製兩條標題線。第一行是繪製帶有輪廓特效的文字。
//繪製標題 private void DrawTwoLinesOfHeading() { //頁面標題 //引數:字型:ArialBold,大小:36 點,位置:X = 4.25", Y = 9.5" //文字對齊:居中(文字中心將在 X 位置) //觸發顏色:R= 128, G=0, B=255 (文字輪廓) // 無描邊顏色: R=255, G=0, B=128 (文字正文) Contents.DrawText(Comic, 40 . 0 , 4 . 25 , 9 . 25 , TextJustify.Center, 0 . 02 , Color.FromArgb( 128 , 0 , 255 ), Color.FromArgb( 255 , 0 ,128 ), " PDF 檔案編寫器" ); //儲存圖形狀態 Contents.SaveGraphicsState(); //將非描邊(填充)顏色更改為紫色 Contents.SetColorNonStroking(Color.Purple); //繪製標題文字的第二行 //引數:手寫字型,字型大小 30 磅,位置 X=4.25", Y=9.0" //文字對齊:居中(文字中心將在 X 位置) Contents.DrawText(Comic , 30 . 0 , 4 . 25 , 8 . 75 , TextJustify.Center, "示例" ); //恢復圖形狀態(非描邊顏色將恢復為預設) Contents.RestoreGraphicsState(); 返回; }
3.6. 畫快樂的臉
該DrawHappyFace
方法是繪製橢圓並從直線和貝塞爾曲線構建路徑的示例。
//繪製開心臉 private void DrawHappyFace() { //儲存圖形狀態 Contents.SaveGraphicsState(); //將座標原點平移到笑臉的中心 Contents.Translate( 4 . 25 , 7 . 5 ); //將非描邊(填充)顏色更改為黃色 Contents.SetColorNonStroking(Color.Yellow); //繪製笑臉黃色橢圓 Contents.DrawOval(-1. 5 , -1. 0 , 3 . 0 , 2 . 0 , PaintOp.Fill); //將線寬設定為 0.2" 這是眼睛周圍的黑色圓圈 Contents.SetLineWidth( 0 . 2 ); //眼睛顏色為白色,帶有黑色輪廓圓圈 Contents.SetColorNonStroking(Color.White); Contents.SetColorStroking(Color.Black); //畫眼睛 Contents.DrawOval(-0. 75 , 0 . 0 , 0 . 5 , 0 . 5 , PaintOp.CloseFillStroke); Contents.DrawOval( 0 . 25 , 0 . 0 , 0 . 5 , 0 . 5 , PaintOp.CloseFillStroke); //嘴巴顏色是黑色 Contents.SetColorNonStroking(Color.Black); //通過建立由一條直線和一條貝塞爾曲線組成的路徑來繪製嘴巴 Contents.MoveTo(-0. 6 , -0. 4 ); Contents.LineTo( 0 . 6 , -0. 4 ); Contents.DrawBezier( 0 . 0 , -0. 8 , 0 , -0. 8 , -0. 6 , -0. 4 ); //用黑色填充路徑 Contents.SetPaintOp(PaintOp.Fill); //恢復圖形狀態 Contents.RestoreGraphicsState(); 返回; }
3.7. 繪製條碼
該DrawBarcode
方法以繪製兩個條碼 EAN-13 和 Code-128 為例
//繪製條碼 private void DrawBarcode() { //儲存圖形狀態 Contents.SaveGraphicsState(); //繪製 EAN13 條碼 BarcodeEAN13 Barcode1 = new BarcodeEAN13( " 1234567890128" ); Contents.DrawBarcode( 1 . 3 , 7 . 05 , 0 . 012 , 0 . 75 , Barcode1, ArialNormal, 8 . 0 ); //建立 二維碼條碼QREncoder QREncoder = new QREncoder(); //設定糾錯碼 QREncoder.ErrorCorrection = ErrorCorrection.M; //以畫素為單位設定模組大小 QREncoder.ModuleSize = 1 ; //以畫素為單位設定靜音區 QREncoder.QuietZone = 4 ; //編碼你的文字或位元組陣列 QREncoder.Encode(文章連結); //將 二維碼轉換為黑白影像PdfImage BarcodeImage = new PdfImage(Document); BarcodeImage.LoadImage(QREncoder); //繪製影像(QRCode 的高度與寬度相同) Contents.DrawImage(BarcodeImage, 6 . 0 , 6 . 8 , 1 . 2 ); //用二維碼定義一個網頁連結區域 Page.AddWebLink ( 6 . 0 , 6 . 8 , 7 . 2 , 8 . 0 , ArticleLink); //恢復圖形狀態 Contents.RestoreGraphicsState(); 返回; }
3.8. 繪製 PDF417 條碼
//繪製條碼 private void DrawPdf417Barcode() { //儲存圖形狀態 Contents.SaveGraphicsState(); //建立 PDF417 條碼 Pdf417Encoder Pdf417 = new Pdf417Encoder(); Pdf417.DefaultDataColumns = 3 ; Pdf417.Encode(文章連結); Pdf417.WidthToHeightRatio(2。5); //將 Pdf417 轉換為黑白影像 PdfImage BarcodeImage = new PdfImage(Document); BarcodeImage.LoadImage(Pdf417); //繪製影像 Contents.DrawImage(BarcodeImage, 1 . 1 , 5 . 2 , 2 . 5 ); //用二維碼定義一個網頁連結區域 double Height = 2 . 5 * Pdf417.ImageHeight / Pdf417.ImageWidth; Page.AddWebLink( 1 . 1 , 5 . 2 , 1 . 1 + 2 . 5 , 5 . 2 + Height, ArticleLink); //恢復圖形狀態 Contents.RestoreGraphicsState(); 返回; }
3.9. 繪製影像並剪輯它
的Draw
影像的方法是繪製一圖象的一個例子。該PdfFileWriter
儲存中的所有影像檔案的支援繪製影像支援Bitmap
類和Metafile
類。在ImageFormat
類定義所有影像型別。JPEG 影像檔案型別是 PDF 檔案的原生影像格式。如果您PdfImage
使用 JPEG 檔案呼叫建構函式,程式會將檔案原樣複製到 PDF 檔案中。如果您PdfImage
使用任何其他型別的影像檔案呼叫建構函式,程式會將其轉換為 JPEG 檔案。為了使 PDF 檔案儘可能小,請確保您的影像檔案解析度不會過高。
的PdfImage
類負載可以容納在使用者座標給定的影像尺寸和保留原始長寬比影像並且計算最大大小。在繪製影像之前,我們建立一個橢圓剪下路徑來剪下影像。
//繪製影像並剪輯它 private void DrawImage() { //定義本地圖片資源 //解析度每英寸 96 畫素,圖片質量 50% PdfImage Image1 = new PdfImage(Document); Image1.Resolution = 96。0 ; Image1.ImageQuality = 50 ; Image1.LoadImage( " TestImage.jpg" ); //儲存圖形狀態 Contents.SaveGraphicsState(); //將座標原點平移到圖片的中心 Contents.Translate( 3 . 75 , 5 . 0 ); //調整影像大小並保持縱橫比 PdfRectangle NewSize = Image1.ImageSizePosition( 1 . 75 , 1 . 5 , ContentAlignment.MiddleCenter); //剪下路徑 Contents.DrawOval(NewSize.Left, NewSize.Bottom, NewSize.Width, NewSize.Height, PaintOp.ClipPathEor); //繪製影像 Contents.DrawImage(Image1, NewSize.Left, NewSize.Bottom, NewSize.Width, NewSize.Height); //恢復圖形狀態 Contents.RestoreGraphicsState(); 返回; }
3.10. 繪製餅圖
該DrawChart
方法是定義圖表並將其繪製到 PDF 文件的示例。
//繪製圖表 private void DrawChart() { //儲存圖形狀態 Contents.SaveGraphicsState(); //建立圖表 Chart PieChart = PdfChart.CreateChart(Document, 1 . 8 , 1 . 5 , 300 . 0 ); //使用 Chart 物件建立 PdfChart 物件 PdfChart PiePdfChart = new PdfChart(Document, PieChart); PiePdfChart.SaveAs = SaveImageAs.IndexedImage; //確保我們有高質量的影像 PieChart.AntiAliasing = AntiAliasingStyles.None; // .所有; //設定顏色 PieChart.BackColor = Color.FromArgb( 220 , 220 , 255 ); PieChart.Palette = ChartColorPalette.BrightPastel; //預設字型 Font DefaultFont = PiePdfChart.CreateFont( " Verdana" , FontStyle.Regular, 0 . 05 , FontSizeUnit.UserUnit); Font TitleFont = PiePdfChart.CreateFont( " Verdana" , FontStyle.Bold, 0 . 07 , FontSizeUnit.UserUnit); //標題(字型大小為 0.25 英寸) Title Title1 = new Title( "餅圖示例" , Docking.Top, TitleFont, Color.Purple); PieChart.Titles.Add(Title1); //說明 圖例Legend1 =新圖例(); PieChart.Legends.Add(Legend1); Legend1.BackColor = Color.FromArgb( 230 , 230 , 255 ); Legend1.Docking = Docking.Bottom; Legend1.Font = DefaultFont; //圖表區域 ChartArea ChartArea1 = new ChartArea(); PieChart.ChartAreas.Add(ChartArea1); //圖表區域背景顏色 ChartArea1.BackColor = Color.FromArgb( 255 , 200 , 255 ); //系列 1 系列系列 1 =新系列 (); PieChart.Series.Add(Series1); Series1.ChartType = SeriesChartType.Pie; Series1.Font = DefaultFont; Series1.IsValueShownAsLabel = true ; Series1.LabelFormat = " {0} %" ; //系列值 Series1.Points.Add( 22 . 0 ); Series1.Points[0].LegendText = "蘋果" ; Series1.Points.Add( 27 . 0 ); Series1.Points[1].LegendText = "香蕉" ; Series1.Points.Add( 33 . 0 ); Series1.Points[2].LegendText = "橙色" ; Series1.Points.Add( 18 . 0 ); Series1.Points[3].LegendText = "葡萄" ; Contents.DrawChart(PiePdfChart, 5 . 6 , 5 . 0 ); //恢復圖形狀態 Contents.RestoreGraphicsState(); 返回; }
3.11. 繪製文字框
該DrawTextBox
方法是使用TextBox
該類的一個示例。本TextBox
類格式文字,以適應列中。可以使用多種字型樣式和大小來繪製文字。
//繪製一個文字框的例子 private void DrawTextBox() { //儲存圖形狀態 Contents.SaveGraphicsState(); //將原點轉換為 PosX=1.1" 和 PosY=1.1" 這是文字框示例的左下角 Contents.Translate( 1 . 1 , 1 . 1 ); //定義常量 //框寬 3.25" //框高為 3.65" //正常字型大小為 9.0 磅。 const double寬度 = 3。15 ; const double高度 = 3。65 ; const double FontSize = 9。0 ; //建立寬度為 3.25" 的文字框物件 //首行縮排 0.25" TextBox Box = new TextBox(Width, 0 . 25 ); //新增文字到文字框 Box.AddText(ArialNormal, FontSize, "此區域是顯示太長而無法容納在固定寬度 " + "區域內的文字的示例。文字顯示在右邊緣對齊。您定義一個具有所需 " + "寬度和首行縮排的文字框。你在這個框中新增文字。這個框會將文字分成“ + ”行。每行由文字段組成。對於每個段,你定義字型、字型“ + ”大小、繪圖樣式和顏色。載入所有內容後文字,程式將繪製格式化文字。\n" ); Box.AddText(TimesNormal, FontSize + 1 . 0 , "多種字型示例:Times New Roman, " ); Box.AddText(Comic, FontSize, " Comic Sans MS, " ); Box.AddText(ArialNormal, FontSize, "正則示例, " ); Box.AddText(ArialBold, FontSize, " bold, " ); Box.AddText(ArialItalic, FontSize, " italic, " ); Box.AddText(ArialBoldItalic, FontSize, "粗體加斜體。" ); Box.AddText(ArialNormal, FontSize - 2 . 0 , " Arial size 7, " ); Box.AddText(ArialNormal, FontSize - 1 . 0 , " size 8, " ); Box.AddText(ArialNormal, FontSize, " size 9, " ); Box.AddText(ArialNormal, FontSize + 1 . 0 , " size 10." ); Box.AddText(ArialNormal, FontSize, DrawStyle.Underline, " Underline, " ); Box.AddText(ArialNormal, FontSize, DrawStyle.Strikeout, " Strikeout. " ); Box.AddText(ArialNormal, FontSize, " 下標 H" ); Box.AddText(ArialNormal, FontSize, DrawStyle.Subscript, " 2" ); Box.AddText(ArialNormal, FontSize, " O. Superscript A" ); Box.AddText(ArialNormal, FontSize, DrawStyle.Superscript, " 2" ); Box.AddText(ArialNormal, FontSize, " +B" ); Box.AddText(ArialNormal, FontSize, DrawStyle.Superscript, " 2" ); Box.AddText(ArialNormal, FontSize, " =C" ); Box.AddText(ArialNormal, FontSize, DrawStyle.Superscript, " 2" ); Box.AddText(ArialNormal, FontSize, " \n" ); Box.AddText(Comic, FontSize, Color.Red, " Some color, " ); Box.AddText(Comic, FontSize, Color.Green, " green, " ); Box.AddText(Comic, FontSize, Color.Blue, " blue, " ); Box.AddText(Comic, FontSize, Color.Orange, " orange, " ); Box.AddText(Comic, FontSize, DrawStyle.Underline, Color.Purple, " and Purple.\n" ); Box.AddText(ArialNormal, FontSize, "支援非拉丁字母: " ); Box.AddText(ArialNormal, FontSize, Contents.ReverseString( " עברית " )); Box.AddText(ArialNormal, FontSize, " АБВГДЕ" ); Box.AddText(ArialNormal, FontSize, " αβγδεζ" ); Box.AddText(ArialNormal, FontSize, " \n" ); //繪製文字框 //文字左邊緣為零(注意:原點已轉換為 1.1") //頂部文字基線位於 Height 減去第一行上升處。 //文字繪製僅限於垂直座標為零. //要繪製的第一行是第 0 行。 //在每行之後新增額外的 0.015"。 //每段後新增額外的 0.05" //拉伸所有線條以使框寬度為 3.15" 的右邊緣平滑 //繪製完所有線條後,PosY 將設定為框最後一段之後的下一個文字行 double PosY =高度; Contents.DrawText( 0 . 0 , ref PosY, 0 . 0 , 0 , 0 . 015 , 0 . 05 , TextBoxJustify.FitToWidth, Box); //建立寬度為 3.25" 的文字框物件 //首行無縮排 Box = new TextBox(Width); //像以前一樣新增文字。 //沒有額外的行間距。 //無右邊緣調整 Box.AddText(ArialNormal, FontSize, "在此區域上方的示例中,文字框的首行縮排設定為 " + " 0.25 英寸。該段落首行縮排為零且沒有右對齊。); Contents.DrawText( 0 . 0 , ref PosY, 0 . 0 , 0 , 0 . 01 , 0 . 05 , TextBoxJustify.Left, Box); //建立寬度為 2.75 的文字框物件 //第一行懸掛縮排 0.5" Box = new TextBox(Width - 0 . 5 , -0. 5 ); //新增文字 Box.AddText(ArialNormal, FontSize, "本段設定首行懸掛縮排 0.5 英寸。" + "本段左邊距為 0.5 英寸。); //繪製文字 //左邊緣 0.5" Contents.DrawText( 0 . 5 , ref PosY, 0 . 0 , 0 , 0 . 01 , 0 . 05 , TextBoxJustify.Left, Box); //恢復圖形狀態 Contents.RestoreGraphicsState(); 返回; }
3.12. 畫冊訂購表
該DrawBookOrderForm
方法是訂單輸入表或發票的示例。它是資料表支援的示例。它演示了PdfTable
,PdfTableCell
和PdfTableStyle
類的使用。
//繪製訂單示例 private void DrawBookOrderForm() { //定義常量以使程式碼可讀 const double Left = 4 . 35 ; const double Top = 4。65 ; const double底部 = 1。1 ; const double右 = 7。4 ; const double FontSize = 9。0 ; const double MarginHor = 0。04 ; 常量 雙邊距 = 0。04 ; const double FrameWidth = 0。015 ; const double GridWidth = 0。01 ; //列寬 double ColWidthPrice = ArialNormal.TextWidth(FontSize, " 9999.99" ) + 2 . 0 * 保證金霍爾; double ColWidthQty = ArialNormal.TextWidth(FontSize, " Qty" ) + 2。0 * 保證金霍爾; double ColWidthDesc = Right - Left - FrameWidth - 3 * GridWidth - 2 * ColWidthPrice - ColWidthQty; //定義表格 PdfTable Table = new PdfTable(Page, Contents, ArialNormal, FontSize); Table.TableArea = new PdfRectangle(Left, Bottom, Right, Top); Table.SetColumnWidth( new double[] { ColWidthDesc, ColWidthPrice, ColWidthQty, ColWidthPrice }); //定義邊框 Table.Borders.SetAllBorders(FrameWidth, GridWidth); // margin PdfRectangle Margin = new PdfRectangle(MarginHor, MarginVer); //預設標題樣式 Table.DefaultHeaderStyle.Margin = Margin; Table.DefaultHeaderStyle.BackgroundColor = Color.FromArgb( 255 , 196 , 255 ); Table.DefaultHeaderStyle.Alignment = ContentAlignment.MiddleRight; //用於描述的私有標題樣式 Table.Header[0].Style = Table.HeaderStyle; Table.Header[0].Style.Alignment = ContentAlignment.MiddleLeft; //表格標題 Table.Header[0].Value = " Description" ; Table.Header[1].Value = "價格" ; Table.Header[2].Value = "數量" ; Table.Header[3].Value = "總計" ; //預設樣式 Table.DefaultCellStyle.Margin = Margin; //描述列樣式 Table.Cell[0].Style = Table.CellStyle; Table.Cell[0].Style.MultiLineText = true ; //數量列樣式 Table.Cell[2].Style = Table.CellStyle; Table.Cell[2].Style.Alignment = ContentAlignment.BottomRight; Table.DefaultCellStyle.Format = " #,##0.00" ; Table.DefaultCellStyle.Alignment = ContentAlignment.BottomRight; Contents.DrawText(ArialBold, FontSize, 0 . 5 * (Left + Right), Top + MarginVer + Table.DefaultCellStyle.FontDescent, TextJustify.Center, DrawStyle.Normal, Color.Purple, " PdfTable 支援示例" ); //重置訂單總計 double Total = 0 ; //對訂單中的所有專案進行迴圈 // Order 類是此示例 foreach的 atabase 模擬(Order Book in Order.OrderList) { Table.Cell[0].Value = Book.Title + " . By: " + Book.Authors; Table.Cell[1].Value = Book.Price; Table.Cell[2].Value = Book.Qty; Table.Cell[3].Value = Book.Total; Table.DrawRow(); //累計總數 總計 += Book.Total; } Table.Close(); //儲存圖形狀態 Contents.SaveGraphicsState(); //表格線寬 0.01" Contents.SetLineWidth(FrameWidth); Contents.SetLineCap(PdfLineCap.Square); //得出稅前總額 雙[] ColumnPosition = Table.ColumnPosition; double TotalDesc = ColumnPosition[3] - MarginHor; double TotalValue = ColumnPosition[4] - MarginHor; double PosY = Table.RowTopPosition - 2。0 * MarginVer - Table.DefaultCellStyle.FontAscent; Contents.DrawText(ArialNormal, FontSize, TotalDesc, PosY, TextJustify.Right, " Total before tax" ); Contents.DrawText(ArialNormal, FontSize, TotalValue, PosY, TextJustify.Right, Total.ToString( " # .00 " )); //抽稅(加拿大安大略省 HST) PosY -= Table.DefaultCellStyle.FontLineSpacing; Contents.DrawText(ArialNormal, FontSize, TotalDesc, PosY, TextJustify.Right, " Tax (13%)" ); double Tax = Math.Round( 0 . 13 * Total, 2 , MidpointRounding.AwayFromZero); Contents.DrawText(ArialNormal, FontSize, TotalValue, PosY, TextJustify.Right, Tax.ToString( " # .00 " )); //繪製匯流排 PosY -= Table.DefaultCellStyle.FontDescent + 0 . 5 * MarginVer; Contents.DrawLine(ColumnPosition[3], PosY, ColumnPosition[4], PosY); //繪製最終總 PosY -= Table.DefaultCellStyle.FontAscent + 0。5 * MarginVer; Contents.DrawText(ArialNormal, FontSize, TotalDesc, PosY, TextJustify.Right, " Total pay " ); 總計 += 稅; Contents.DrawText(ArialNormal, FontSize, TotalValue, PosY, TextJustify.Right, Total.ToString( " # .00 " )); PosY -= Table.DefaultCellStyle.FontDescent + MarginVer; Contents.DrawLine(ColumnPosition[0], Table.RowTopPosition, ColumnPosition[0], PosY); Contents.DrawLine(ColumnPosition[0], PosY, ColumnPosition[4], PosY); Contents.DrawLine(ColumnPosition[4], Table.RowTopPosition, ColumnPosition[4], PosY); //恢復圖形狀態 Contents.RestoreGraphicsState(); 返回; }
4. 安裝
整合PdfFileWriter
到您的應用程式需要以下步驟。PdfFileWriter.dll
在您的開發區安裝附件。啟動 Visual C# 程式並開啟您的應用程式。轉到解決方案資源管理器,右鍵單擊引用並選擇新增引用。選擇瀏覽選項卡並將檔案系統導航到PdfFileWriter.dll
. 當您的應用程式釋出時,PdfFileWriter.dll
必須包含 。
原始碼文件以幫助檔案的形式提供 PdfFileWriter.chm
。該檔案由 Sandcastle 製作。結果看起來像 Microsoft 文件頁面。
如果您想訪問PdfFileWriter
專案的原始碼,請PdfFileWriter
在您的開發區安裝該專案。該PdfFileWriter.dll
會在PdfFileWriter\bin\Release
目錄中。
將以下語句新增到使用此庫的所有源模組。
use PdfFileWriter;
如果您打算使用圖表,則需要新增對: 的引用System.Windows.Forms.Visualization
。在使用的每個源模組中,Chart
您需要新增
use System.Windows.Forms.DataVisualization.Charting;
5. 歷史
- 2013/04/01:1.0 版原版。
- 2013/04/09:版本 1.1 支援小數點分隔符不是句點的國家/地區。
- 2013/07/21: Version 1.2 原始版本僅支援 jpeg 檔案格式的影像資源。1.2 版支援 Bitmap 類可接受的所有影像檔案。請參閱 ImageFormat 類。該程式經過測試:Bmp、Gif、Icon、Jpeg、Png 和 Tiff。參見上文第 2.3 節和第 3.8 節。
- 2014/02/07:版本 1.3 修復 PdfContents.DrawBezierNoP2(PointD P1, PointD P3) 中的錯誤。
- 2014/03/01:1.4 版改進了對字元替換的支援。改進了對影像包含的支援。一些與 PdfXObject 相關的修復。
- 2014/05/05:1.5 版條碼支援不使用字型。包括四種條形碼:Code-128、Code-39、UPC-A 和 EAN-13。參見第 2.5 節和第 3.7 節。
- 2014/07/09: Version 1.6 (1) CreateFile 方法在檔案建立後將 PdfDocument 重置為初始狀態。(2) PdfFont 物件正確釋放非託管程式碼資源。
- 2014/08/25:1.7 版支援文件加密、網頁連結和二維碼。
- 2014/09/12:1.8 版支援書籤。
- 2014/10/06:1.9 版支援圖表、PrintDocument 和影像元檔案。
- 2014/10/12:版本 1.9.1 修復了 ChartExample。使用句點以外的小數分隔符解析區域中的數字欄位。
- 2014/12/02:1.10.0 版本支援資料表。新增原始碼文件。增加每個文件的最大影像數量。
- 2015/01/12:1.11.0 版本支援視訊、聲音和附件檔案。新增對 Interleave 2 of 5 條碼的支援。
- 2015/04/13:1.12.0 版支援重新排序頁面並增強資料表邊框線支援。
- 2015/05/05:版本 1.13.0 PDF 文件輸出到流。PDF 表格插入分頁符。影像質量增強。支援標準 128 (RC4) 加密。
- 2015/06/08:版本 1.14.0 支援 PDF 表格中的長文字塊或 TextBox。
- 2015/06/09:版本 1.14.1 一行更改為 PdfTableStyle 類的 Copy 方法。
- 2015/06/17:版本1.15.0 文件資訊字典。PdfImage 重寫。其他影像儲存選項。
- 2015/06/18:版本 1.15.1 從解決方案資源管理器中刪除未使用的源。
- 2015/07/27:版本 1.16.0 Unicode 支援。提交頁面方法。
- 2015/08/07:版本 1.16.1。修復小 (<0.0001) 實數轉換為字串的問題。
- 2015/09/01:版本 1.16.2。修復未定義的字元。所選字型不支援使用的字元。
- 2015/09/22:版本 1.16.3。PdfTable 建構函式使用當前頁面大小來計算預設表格區域矩形。當 PdfTable 開始一個新頁面時,頁面型別和方向取自上一頁。
- 2015/09/30:版本 1.16.4 一致使用 IDisposable 介面來釋放非託管資源。
- 2016/01/26:1.17.0 版 WPF 圖形、透明度、顏色混合、橢圓弧和二次貝塞爾曲線。
- 2016/02/29:1.17.1 版 PdfTable 將在第一列標題是 TextBox 時正確顯示標題。
- 2016/03/22:版本 1.17.2 PdfInfo PDF 文件屬性將正確顯示。
- 2016/04/14:版本 1.17.3 修復了在將小數分隔符定義為非句點(逗號)的區域中非整數字體大小的問題。
- 2016/05/24:版本 1.18.0 命名目的地和建立 PdfFont 資源。
- 2016/06/02:版本 1.18.1 重新應用 1.17.3 修復。
- 2016/06/13:版本 1.19.0 文件連結。對命名目的地的更改。互動式功能支援 TextBox 和 PdfTable。
- 2016/07/27:版本 1.19.1 修復:AddLocationMarker 修復了小數分隔符不是句點的區域。
- 2017/08/31:版本 1.19.2 修復:除錯工作目錄未儲存為專案的一部分
- 2018/06/26:版本 1.19.3 修復 PdfFontFile.BuildLocaTable 方法。長格式緩衝區指標初始化。修復 PdfTableCell 新增 DBNull 的值型別。
- 2018/07/15:版本 1.20.0 通過新增每個模組的畫素數來修改 QR 碼支援。
- 2019/02/06:版本 1.21.0 支援 PDF417 條碼。
- 2019/02/13:版本 1.21.1 修復了 PDF417 條碼靜區。
- 2019/02/18:1.22.0 版本支援便籤。
- 2019/05/26:版本 1.23.0 支援層和對 QRCode 和 Pdf417 條碼的更改。
- 2019/06/06:版本 1.24.0 支援影像和註釋的圖層控制。
- 2019/06/20:版本 1.24.1 支援米作為測量單位。
- 2019/07/15:版本 1.25.0 支援字型集合(主要是 CJK 字型)和非 ASCII 字型名稱。
- 2019/07/28:1.26.0 版本支援 XMP 後設資料和二維碼 ECI 分配編號。
- 2020/09/09:版本 1.27.0 修復了與 PDF417 條碼相關的記憶體不足問題。該問題僅在不尋常的情況下發生。
- 2021/03/31:版本 1.28.0 升級內部檔案結構以包括物件流和交叉尊重流。