PDF File Writer 是一個 C# .NET 類庫,允許應用程式建立 PDF 檔案。
PDF File Writer C# 類庫使 .NET 應用程式能夠生成 PDF 文檔。該庫使應用程式免受 PDF 檔案結構的詳細資訊的影響。該庫支援:文本、圖像、表格、圖形、條形碼、網絡連結、圖表、便簽、加密等。該文章連同所附的源代碼和 CHM 幫助檔案提供了詳細的文檔。
更多相關學習資料參見http://www.pdfdownload.cn/a/ab_index.php
一、簡介
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:從
流程建立 PDF 文檔。第2.11節PrintDocument 支援。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
類。第2.20節Windows Presentation Foundation WPFPathGeometry
- 透明度或不透明度可用于繪制形狀、線條、文本和圖像。您的應用程式可以為所有圖形和文本設定顔色的 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 步:通過調用 的
方法建立您的 PDF 文檔檔案CreateFile
。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 檔案的最後一步,值被轉換為文本字元串。轉換精度為六位數。使用的轉換公式為:
C#
// 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#
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 圖形是一個四步過程。
- 第一步:建立
對象。輸入參數是路徑和 Y 軸方向。DrawWPFPath
- 第 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 應用程式定義畫筆。所有這些方法都會同時設定畫筆不透明度。
-
請參閱SolidColorBrush 類System.Windows.Media.SolidColorBrush
-
請參閱LinearGradientBrush 類System.Windows.Media.LinearGradientBrush
-
請參閱RadialGradientBrush 類System.Windows.Media.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。
-
(no arg): 顯示頁面,其内容被放大到足以在視窗中水準和垂直地容納整個頁面。DestFit.Fit
-
(1 arg Top):顯示頁面,垂直坐标頂部位于視窗的上邊緣,頁面内容被放大到剛好适合視窗内頁面的整個寬度。DestFit.FitH
-
(1 arg Left):顯示頁面,左水準坐标位于視窗的左邊緣,頁面内容被放大到剛好适合視窗内頁面的整個高度。DestFit.FitV
-
(4 args Left Bottom Right Top):顯示頁面,其内容被放大到剛好适合視窗内水準和垂直坐标左、下、右和頂部指定的矩形。DestFit.FitR
-
(無參數):顯示頁面,其内容被放大到足以在水準和垂直方向完全适合視窗内的邊界框。DestFit.FitB
-
(1 arg Top):顯示頁面,垂直坐标頂部位于視窗的頂部邊緣,頁面内容被放大到剛好适合視窗内邊界框的整個寬度。DestFit.FitBH
-
(1 arg Left):顯示頁面,左水準坐标位于視窗的左邊緣,頁面内容被放大到剛好适合視窗内邊界框的整個高度。DestFit.FitBV
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 更新内部檔案結構以包括對象流和交叉尊重流。
更多相關學習資料參見http://mengqiusoftware.cn/111.html