在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
在 C# 中,處理 PDF 文件對於開發人員來說可能是一項挑戰。 在為這類文件創建內容時需要考慮許多因素,而從不同格式轉換內容為 PDF 時需要考慮的因素更多。 自動化現在是軟體開發流程的關鍵。 這些問題現在已透過建構圖書館解決,這些圖書館旨在協助讀取、寫入、創建和修改 PDF 文件,以及編輯其屬性並將其從其他格式轉換。
在這篇博客文章中,將比較兩個用於.NET和.NET Core的PDF庫。這兩個庫是:
Apitron PDF Kit
IronPDF 和 Apitron PDF Kit 是兩個為 .NET 和 .NET Core 提供 PDF 操作功能的庫。 它們都可以用於文件欄位的轉換和操作任務。 他們兩個也都可以創建書籤。 接下來的問題是決定哪個 C# PDF .NET 函式庫最適合我們的 .NET 專案。 這篇比較文章將幫助您在這兩個 PDF 庫之間做出決定。
首先,讓我們來看看這兩個庫所提供的功能,然後再進行比較。
Apitron PDF Kit 是一個 .NET 元件,允許您以各種方式操作或轉換 PDF 文件。 您可以添加圖片、繪圖和文本,簽署文件等等。 您還可以編輯現有內容。 Apitron PDF Kit .NET 元件可用於在多平台上創建行動、桌面、網頁、Windows 和雲端應用程式。
使用這個 PDF SDK,您將能夠:
開發人員,特別是 C# 程式設計師,將會喜愛 IronPDF .NET 庫。 使用這個驚人的工具,您可以輕鬆構建一個 .NET Core PDF 處理應用程式。
IronPDF 使用 .NET Chromium 引擎來更改 HTML 頁面(在程式碼或網址形式中)到 PDF 文件。 完全不需要使用複雜的 API 來定位導航物件或從 HTML 設計 PDF。 IronPDF 支援標準網頁文件,包括 HTML、ASPX、JS、CSS 和圖片。
IronPDF 可以使用 HTML5、CSS、JS 和圖像創建。 PDF 可以輕鬆編輯、加蓋戳記,並添加頁眉和頁腳。 這也讓讀取 PDF 文字和提取圖形變得輕而易舉。
IronPDF 的突出特點包括:
無需 Adobe Acrobat 軟體即可列印 PDF 文件
IronPDF 幾乎可在所有與 C# 相容的作業系統和框架中使用,包括以下內容:
Azure, AWS, Docker, Linux, Windows
其餘的文章如下:
IronPDF 安裝
Apitron PDF Kit 安裝
建立 PDF 文件
在 PDF 中建立頁首和頁尾
數位簽署 PDF
定價和授權
下載和安裝IronPDF庫有四種方法。 如下:
使用 NuGet 套件管理器
開發者命令提示字元
直接下載 NuGet 套件
若要安裝IronPDF,只需在方案總管中右鍵單擊您的專案。 這將開啟 NuGet 套件管理器。
選定後,瀏覽 IronPDF 套件並安裝,如下圖所示。
您也可以透過開發人員命令提示字元來安裝IronPDF。
Install-Package IronPdf
IronPDF 也可以通过访问安装IronPDF NuGet 套件直接訪問網站並下載軟體包。 步驟如下:
重新加載您的 Visual Studio 專案並開始使用它
IronPDF已下載並準備使用。 不過,在此之前,我們應該安裝 Apitron PDF 庫。
對於 .NET Core 應用程序,我們可以使用 NuGet 套件管理器安裝 Apitron,或者從Apitron PDF Kit NuGet網站直接。
您也可以使用 NuGet 套件管理器控制台來安裝 Apitron。 按照 IronPDF 中提到的「使用開發者命令提示字元」步驟,輸入以下命令:
Install-Package Apitron.PDF.Kit
按 ENTER。 它將下載並安裝 Apitron.PDF.Kit。
添加以下命名空間:
using Apitron.PDF.Kit;
using Apitron.PDF.Kit.FixedLayout.Resources;
using Apitron.PDF.Kit.FixedLayout.Resources.Fonts;
using Apitron.PDF.Kit.FlowLayout.Content;
using Apitron.PDF.Kit.Styles;
using Apitron.PDF.Kit.Styles.Appearance;
using Font = Apitron.PDF.Kit.Styles.Text.Font;
using Apitron.PDF.Kit;
using Apitron.PDF.Kit.FixedLayout.Resources;
using Apitron.PDF.Kit.FixedLayout.Resources.Fonts;
using Apitron.PDF.Kit.FlowLayout.Content;
using Apitron.PDF.Kit.Styles;
using Apitron.PDF.Kit.Styles.Appearance;
using Font = Apitron.PDF.Kit.Styles.Text.Font;
Imports Apitron.PDF.Kit
Imports Apitron.PDF.Kit.FixedLayout.Resources
Imports Apitron.PDF.Kit.FixedLayout.Resources.Fonts
Imports Apitron.PDF.Kit.FlowLayout.Content
Imports Apitron.PDF.Kit.Styles
Imports Apitron.PDF.Kit.Styles.Appearance
Imports Font = Apitron.PDF.Kit.Styles.Text.Font
現在,讓我們來比較 IronPDF 和 Apitron PDF。
IronPDF 有多種方法可用於創建 PDF。 讓我們來看看兩個重要的。
IronPDF 讓轉換任何 URL 為 PDF 變得輕鬆簡單。 以下程式碼有助於將 URL 轉換為 PDF。
IronPdf.ChromePdfRenderer Renderer = new IronPdf.ChromePdfRenderer();
using var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
Pdf.SaveAs("url.pdf");
IronPdf.ChromePdfRenderer Renderer = new IronPdf.ChromePdfRenderer();
using var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
Pdf.SaveAs("url.pdf");
Dim Renderer As New IronPdf.ChromePdfRenderer()
Dim Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/")
Pdf.SaveAs("url.pdf")
以下程式碼說明如何從 HTML 字串渲染 PDF 文件。 您可以僅使用HTML,或者將其與CSS、圖片和JavaScript結合使用。
var Renderer = new IronPdf.ChromePdfRenderer();
using var PDF = Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>");
PDF.SaveAs("pixel-perfect.pdf");
// Load external HTML assets: images, CSS and JavaScript.
// An optional BasePath 'C:\site\assets\' is set as the file location to load assets from
using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>Sample Text</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
var Renderer = new IronPdf.ChromePdfRenderer();
using var PDF = Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>");
PDF.SaveAs("pixel-perfect.pdf");
// Load external HTML assets: images, CSS and JavaScript.
// An optional BasePath 'C:\site\assets\' is set as the file location to load assets from
using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>Sample Text</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
Dim Renderer = New IronPdf.ChromePdfRenderer()
Dim PDF = Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>")
PDF.SaveAs("pixel-perfect.pdf")
' Load external HTML assets: images, CSS and JavaScript.
' An optional BasePath 'C:\site\assets\' is set as the file location to load assets from
Dim AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>Sample Text</h1>", "C:\site\assets\")
AdvancedPDF.SaveAs("html-with-assets.pdf")
輸出如下:
Apitron PDF 不提供將 URL 或 HTML 轉換為 PDF 的功能。 它允許將 PDF 轉換為 HTML。 然而,它也將 XML 檔案轉換為 PDF。 使用的 XML 檔案為:
<?xml version="1.0" encoding="utf-8"?>
<FlowDocument xmlns="Apitron.PDF.Kit.FlowLayout.v1">
<Resources>
<Image resourceId="logo" fileName="../../images/logo.png" />
</Resources>
<Styles>
<Style selector="flowdocument">
<Color value="Black" />
</Style>
<Style selector="grid">
<InnerBorder thickness="1" />
<InnerBorderColor value="Black" />
</Style>
</Styles>
<Elements>
<Image>
<Properties>
<Class value="logo" />
<ResourceId value="logo" />
</Properties>
</Image>
<TextBlock>
<Properties>
<Class value="header" />
<Text value="Sample Interview Questions for Candidates" />
</Properties>
</TextBlock>
<Br />
<TextBlock>
<Properties>
<Class value="headerNote" />
<Text value="To help facilitate the interview process, the Human Resources Department has compiled a list of questions that might be used during the phone and/or on-campus interviews. Some of the questions deal with the same content, but are phrased differently while other questions may not pertain to a specific discipline; however all of the questions are unbiased and appropriate to ask. We hope you'll find this helpful." />
</Properties>
</TextBlock>
</Elements>
<Properties>
<Margin value="30,20,30,20" />
</Properties>
</FlowDocument>
將此 XML 模板轉換為 PDF 的代碼如下:
using (Stream stream = File.OpenRead("C:\\PLACE YOUR EXACT PATH HERE\\template.xml"), outputStream = File.Create("fromTemplate.pdf"))
{
ResourceManager resourceManager = new ResourceManager();
FlowDocument doc = FlowDocument.LoadFromXml(stream, resourceManager);
doc.Write(outputStream, resourceManager);
}
using (Stream stream = File.OpenRead("C:\\PLACE YOUR EXACT PATH HERE\\template.xml"), outputStream = File.Create("fromTemplate.pdf"))
{
ResourceManager resourceManager = new ResourceManager();
FlowDocument doc = FlowDocument.LoadFromXml(stream, resourceManager);
doc.Write(outputStream, resourceManager);
}
Using stream As Stream = File.OpenRead("C:\PLACE YOUR EXACT PATH HERE\template.xml"), outputStream As Stream = File.Create("fromTemplate.pdf")
Dim resourceManager As New ResourceManager()
Dim doc As FlowDocument = FlowDocument.LoadFromXml(stream, resourceManager)
doc.Write(outputStream, resourceManager)
End Using
輸出如下:
如果我們比較 IronPDF 和 Apitron 的輸出,我們可以清楚地看到 IronPDF 使用 HTML 渲染且不對圖像大小進行縮放來創建令人驚艷的文件。另一方面,Apitron 會產生與 IronPDF 類似的輸出,但前提是 XML 文件已經註冊樣式。
使用 IronPDF 添加頁首和頁尾相當簡單。 IronPDF 允許您添加頁碼和分頁符號,附加封面、邊距等。
以下是添加頁眉和頁腳的代碼:
var Renderer = new ChromePdfRenderer();
// Add a header
Renderer.RenderingOptions.FirstPageNumber = 1; // use 2 if a cover page will be appended
Renderer.RenderingOptions.TextHeader.DrawDividerLine = true;
Renderer.RenderingOptions.TextHeader.CenterText = "This is the header text";
Renderer.RenderingOptions.TextHeader.Font = IronPdf.Font.FontTypes.Helvetica;
Renderer.RenderingOptions.TextHeader.FontSize = 12;
Renderer.RenderingOptions.MarginTop = 25; //create 25mm space for header
// Add a footer too
Renderer.RenderingOptions.TextFooter.DrawDividerLine = true;
Renderer.RenderingOptions.TextFooter.Font = IronPdf.Font.FontTypes.Arial;
Renderer.RenderingOptions.TextFooter.FontSize = 12;
Renderer.RenderingOptions.TextFooter.LeftText = "{date} {time}";
Renderer.RenderingOptions.TextFooter.RightText = "{page} of {total-pages}";
Renderer.RenderingOptions.MarginTop = 25; //create 25mm space for footer
using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>This is header and footer generated pdf file</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
var Renderer = new ChromePdfRenderer();
// Add a header
Renderer.RenderingOptions.FirstPageNumber = 1; // use 2 if a cover page will be appended
Renderer.RenderingOptions.TextHeader.DrawDividerLine = true;
Renderer.RenderingOptions.TextHeader.CenterText = "This is the header text";
Renderer.RenderingOptions.TextHeader.Font = IronPdf.Font.FontTypes.Helvetica;
Renderer.RenderingOptions.TextHeader.FontSize = 12;
Renderer.RenderingOptions.MarginTop = 25; //create 25mm space for header
// Add a footer too
Renderer.RenderingOptions.TextFooter.DrawDividerLine = true;
Renderer.RenderingOptions.TextFooter.Font = IronPdf.Font.FontTypes.Arial;
Renderer.RenderingOptions.TextFooter.FontSize = 12;
Renderer.RenderingOptions.TextFooter.LeftText = "{date} {time}";
Renderer.RenderingOptions.TextFooter.RightText = "{page} of {total-pages}";
Renderer.RenderingOptions.MarginTop = 25; //create 25mm space for footer
using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>This is header and footer generated pdf file</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
Dim Renderer = New ChromePdfRenderer()
' Add a header
Renderer.RenderingOptions.FirstPageNumber = 1 ' use 2 if a cover page will be appended
Renderer.RenderingOptions.TextHeader.DrawDividerLine = True
Renderer.RenderingOptions.TextHeader.CenterText = "This is the header text"
Renderer.RenderingOptions.TextHeader.Font = IronPdf.Font.FontTypes.Helvetica
Renderer.RenderingOptions.TextHeader.FontSize = 12
Renderer.RenderingOptions.MarginTop = 25 'create 25mm space for header
' Add a footer too
Renderer.RenderingOptions.TextFooter.DrawDividerLine = True
Renderer.RenderingOptions.TextFooter.Font = IronPdf.Font.FontTypes.Arial
Renderer.RenderingOptions.TextFooter.FontSize = 12
Renderer.RenderingOptions.TextFooter.LeftText = "{date} {time}"
Renderer.RenderingOptions.TextFooter.RightText = "{page} of {total-pages}"
Renderer.RenderingOptions.MarginTop = 25 'create 25mm space for footer
Dim AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>This is header and footer generated pdf file</h1>", "C:\site\assets\")
AdvancedPDF.SaveAs("html-with-assets.pdf")
輸出如下:
Apitron PDF Kit 將 XML 結構格式的內容轉換為 PDF 來創建 PDF。 在 Apitron PDF Fit 中,可以使用 PageHeader
和 PageFooter
屬性來添加頁眉和頁腳。 執行此操作的程式碼如下:
// register doc's resources first
ResourceManager resourceManager = new ResourceManager();
resourceManager.RegisterResource(new Apitron.PDF.Kit.FixedLayout.Resources.XObjects.Image("logo","../../data/logo.png"));
// create document
FlowDocument doc = new FlowDocument(){Margin = new Thickness(10)};
// register styles
doc.StyleManager.RegisterStyle(".pageHeader",new Style(){Font = new Font(StandardFonts.TimesBold, 20)});
doc.StyleManager.RegisterStyle(".pageFooter",new Style(){Align = Align.Right});
doc.StyleManager.RegisterStyle("hr",new Style(){Height = 2, Margin = new Thickness(0,5,0,5)});
doc.StyleManager.RegisterStyle(".content",new Style(){Align = Align.Left, Display = Display.InlineBlock});
// fill the header section
doc.PageHeader.Class = "pageHeader";
doc.PageHeader.Add(new Image("logo"){Width = 100, Height = 50});
doc.PageHeader.Add(new TextBlock("This document is intended for internal use only"){TextIndent = 20});
doc.PageHeader.Add(new Hr());
// fill the footer section
doc.PageFooter.Class = "pageFooter";
doc.PageFooter.Add(new Hr());
doc.PageFooter.Add(new TextBlock((ctx)=>string.Format("Page {0} from ",ctx.CurrentPage+1)));
doc.PageFooter.Add(new PageCount(3){Display = Display.Inline});
// add pages
for (int i = 0; i < 2; ++i)
{
doc.Add(new TextBlock("This is header and footer generation pdf file.") {Class = "content"});
doc.Add(new PageBreak());
}
// generate PDF
using (Stream stream = File.Create("out.pdf"))
{
doc.Write(stream, resourceManager);
}
Process.Start("out.pdf");
// register doc's resources first
ResourceManager resourceManager = new ResourceManager();
resourceManager.RegisterResource(new Apitron.PDF.Kit.FixedLayout.Resources.XObjects.Image("logo","../../data/logo.png"));
// create document
FlowDocument doc = new FlowDocument(){Margin = new Thickness(10)};
// register styles
doc.StyleManager.RegisterStyle(".pageHeader",new Style(){Font = new Font(StandardFonts.TimesBold, 20)});
doc.StyleManager.RegisterStyle(".pageFooter",new Style(){Align = Align.Right});
doc.StyleManager.RegisterStyle("hr",new Style(){Height = 2, Margin = new Thickness(0,5,0,5)});
doc.StyleManager.RegisterStyle(".content",new Style(){Align = Align.Left, Display = Display.InlineBlock});
// fill the header section
doc.PageHeader.Class = "pageHeader";
doc.PageHeader.Add(new Image("logo"){Width = 100, Height = 50});
doc.PageHeader.Add(new TextBlock("This document is intended for internal use only"){TextIndent = 20});
doc.PageHeader.Add(new Hr());
// fill the footer section
doc.PageFooter.Class = "pageFooter";
doc.PageFooter.Add(new Hr());
doc.PageFooter.Add(new TextBlock((ctx)=>string.Format("Page {0} from ",ctx.CurrentPage+1)));
doc.PageFooter.Add(new PageCount(3){Display = Display.Inline});
// add pages
for (int i = 0; i < 2; ++i)
{
doc.Add(new TextBlock("This is header and footer generation pdf file.") {Class = "content"});
doc.Add(new PageBreak());
}
// generate PDF
using (Stream stream = File.Create("out.pdf"))
{
doc.Write(stream, resourceManager);
}
Process.Start("out.pdf");
' register doc's resources first
Dim resourceManager As New ResourceManager()
resourceManager.RegisterResource(New Apitron.PDF.Kit.FixedLayout.Resources.XObjects.Image("logo","../../data/logo.png"))
' create document
Dim doc As New FlowDocument() With {.Margin = New Thickness(10)}
' register styles
doc.StyleManager.RegisterStyle(".pageHeader",New Style() With {.Font = New Font(StandardFonts.TimesBold, 20)})
doc.StyleManager.RegisterStyle(".pageFooter",New Style() With {.Align = Align.Right})
doc.StyleManager.RegisterStyle("hr",New Style() With {
.Height = 2,
.Margin = New Thickness(0,5,0,5)
})
doc.StyleManager.RegisterStyle(".content",New Style() With {
.Align = Align.Left,
.Display = Display.InlineBlock
})
' fill the header section
doc.PageHeader.Class = "pageHeader"
doc.PageHeader.Add(New Image("logo") With {
.Width = 100,
.Height = 50
})
doc.PageHeader.Add(New TextBlock("This document is intended for internal use only") With {.TextIndent = 20})
doc.PageHeader.Add(New Hr())
' fill the footer section
doc.PageFooter.Class = "pageFooter"
doc.PageFooter.Add(New Hr())
doc.PageFooter.Add(New TextBlock(Function(ctx) String.Format("Page {0} from ",ctx.CurrentPage+1)))
doc.PageFooter.Add(New PageCount(3) With {.Display = Display.Inline})
' add pages
For i As Integer = 0 To 1
doc.Add(New TextBlock("This is header and footer generation pdf file.") With {.Class = "content"})
doc.Add(New PageBreak())
Next i
' generate PDF
Using stream As Stream = File.Create("out.pdf")
doc.Write(stream, resourceManager)
End Using
Process.Start("out.pdf")
輸出如下:
PDF 處理功能中最重要的之一是能夠以數位方式簽署 PDF 文件。 IronPDF提供所有必要的工具來完成此操作。
using IronPdf;
// Cryptographically sign an existing PDF in 1 line of code!
new IronPdf.Signing.PdfSignature("Iron.p12", "123456").SignPdfFile("any.pdf");
/***** Advanced example for more control *****/
// 1. Create a PDF
var Renderer = new IronPdf.ChromePdfRenderer();
var doc = Renderer.RenderHtmlAsPdf("<h1>Testing 2048 bit digital security</h1>");
// 2. Create a Signature.
// You may create a .pfx or .p12 PDF signing certificate using Adobe Acrobat Reader.
var signature = new IronPdf.Signing.PdfSignature("Iron.pfx", "123456");
// 3. Handwritten signature graphic
signature.LoadSignatureImageFromFile("handwriting.png");
// 4. Sign the PDF with the PdfSignature. Multiple signing certificates may be used
doc.SignPdfWithDigitalSignature(signature);
// 5. The PDF is not signed until saved to file, stream or byte array.
doc.SaveAs("signed.pdf");
using IronPdf;
// Cryptographically sign an existing PDF in 1 line of code!
new IronPdf.Signing.PdfSignature("Iron.p12", "123456").SignPdfFile("any.pdf");
/***** Advanced example for more control *****/
// 1. Create a PDF
var Renderer = new IronPdf.ChromePdfRenderer();
var doc = Renderer.RenderHtmlAsPdf("<h1>Testing 2048 bit digital security</h1>");
// 2. Create a Signature.
// You may create a .pfx or .p12 PDF signing certificate using Adobe Acrobat Reader.
var signature = new IronPdf.Signing.PdfSignature("Iron.pfx", "123456");
// 3. Handwritten signature graphic
signature.LoadSignatureImageFromFile("handwriting.png");
// 4. Sign the PDF with the PdfSignature. Multiple signing certificates may be used
doc.SignPdfWithDigitalSignature(signature);
// 5. The PDF is not signed until saved to file, stream or byte array.
doc.SaveAs("signed.pdf");
Imports IronPdf
' Cryptographically sign an existing PDF in 1 line of code!
Call (New IronPdf.Signing.PdfSignature("Iron.p12", "123456")).SignPdfFile("any.pdf")
'''*** Advanced example for more control ****
' 1. Create a PDF
Dim Renderer = New IronPdf.ChromePdfRenderer()
Dim doc = Renderer.RenderHtmlAsPdf("<h1>Testing 2048 bit digital security</h1>")
' 2. Create a Signature.
' You may create a .pfx or .p12 PDF signing certificate using Adobe Acrobat Reader.
Dim signature = New IronPdf.Signing.PdfSignature("Iron.pfx", "123456")
' 3. Handwritten signature graphic
signature.LoadSignatureImageFromFile("handwriting.png")
' 4. Sign the PDF with the PdfSignature. Multiple signing certificates may be used
doc.SignPdfWithDigitalSignature(signature)
' 5. The PDF is not signed until saved to file, stream or byte array.
doc.SaveAs("signed.pdf")
使用 Apitron PDF Kit 在 PDF 上蓋上簽名是一個既耗時又技術性的過程。
static void Main(string [] args)
{
string fileName = "signedTwice.pdf";
using (Stream stream = File.Create(fileName))
{
FlowDocument doc = new FlowDocument(){Margin = new Thickness(10)};
doc.Add(new TextBlock("Signed using Apitron PDF Kit for .NET"));
doc.Write(stream,new ResourceManager());
}
// save
Sign(fileName, "../../data/certs/JohnDoe.pfx", "password", "../../data/images/signatureImage.png", new Boundary(10, 750, 110, 800));
}
// Implementation of Sign Method
private static void Sign(string pathToDocument, string pathToCertificate, string password, string pathToSignatureImage, Boundary signatureViewLocation)
{
// open existing document and sign once
using (Stream inputStream = new FileStream(pathToDocument, FileMode.Open, FileAccess.ReadWrite))
{
using (FixedDocument doc = new FixedDocument(inputStream))
{
string imageResourceId = Guid.NewGuid().ToString("N");
string signatureFieldId = Guid.NewGuid().ToString("N");
// register signature image resource
doc.ResourceManager.RegisterResource(new Image(imageResourceId, pathToSignatureImage));
// create first signature field and initialize it using a stored certificate
SignatureField signatureField = new SignatureField(signatureFieldId);
using (Stream signatureDataStream = File.OpenRead(pathToCertificate))
{
signatureField.Signature = Signature.Create(new Pkcs12Store(signatureDataStream,password));
}
// add signature fields to the document
doc.AcroForm.Fields.Add(signatureField);
// create first signature view using the image resource
SignatureFieldView signatureView = new SignatureFieldView(signatureField, signatureViewLocation);
signatureView.ViewSettings.Graphic = Graphic.Image;
signatureView.ViewSettings.GraphicResourceID = imageResourceId;
signatureView.ViewSettings.Description = Description.None;
// add views to page annotations collection
doc.Pages [0].Annotations.Add(signatureView);
// save as incremental update
doc.Save();
}
}
}
static void Main(string [] args)
{
string fileName = "signedTwice.pdf";
using (Stream stream = File.Create(fileName))
{
FlowDocument doc = new FlowDocument(){Margin = new Thickness(10)};
doc.Add(new TextBlock("Signed using Apitron PDF Kit for .NET"));
doc.Write(stream,new ResourceManager());
}
// save
Sign(fileName, "../../data/certs/JohnDoe.pfx", "password", "../../data/images/signatureImage.png", new Boundary(10, 750, 110, 800));
}
// Implementation of Sign Method
private static void Sign(string pathToDocument, string pathToCertificate, string password, string pathToSignatureImage, Boundary signatureViewLocation)
{
// open existing document and sign once
using (Stream inputStream = new FileStream(pathToDocument, FileMode.Open, FileAccess.ReadWrite))
{
using (FixedDocument doc = new FixedDocument(inputStream))
{
string imageResourceId = Guid.NewGuid().ToString("N");
string signatureFieldId = Guid.NewGuid().ToString("N");
// register signature image resource
doc.ResourceManager.RegisterResource(new Image(imageResourceId, pathToSignatureImage));
// create first signature field and initialize it using a stored certificate
SignatureField signatureField = new SignatureField(signatureFieldId);
using (Stream signatureDataStream = File.OpenRead(pathToCertificate))
{
signatureField.Signature = Signature.Create(new Pkcs12Store(signatureDataStream,password));
}
// add signature fields to the document
doc.AcroForm.Fields.Add(signatureField);
// create first signature view using the image resource
SignatureFieldView signatureView = new SignatureFieldView(signatureField, signatureViewLocation);
signatureView.ViewSettings.Graphic = Graphic.Image;
signatureView.ViewSettings.GraphicResourceID = imageResourceId;
signatureView.ViewSettings.Description = Description.None;
// add views to page annotations collection
doc.Pages [0].Annotations.Add(signatureView);
// save as incremental update
doc.Save();
}
}
}
Shared Sub Main(ByVal args() As String)
Dim fileName As String = "signedTwice.pdf"
Using stream As Stream = File.Create(fileName)
Dim doc As New FlowDocument() With {.Margin = New Thickness(10)}
doc.Add(New TextBlock("Signed using Apitron PDF Kit for .NET"))
doc.Write(stream,New ResourceManager())
End Using
' save
Sign(fileName, "../../data/certs/JohnDoe.pfx", "password", "../../data/images/signatureImage.png", New Boundary(10, 750, 110, 800))
End Sub
' Implementation of Sign Method
Private Shared Sub Sign(ByVal pathToDocument As String, ByVal pathToCertificate As String, ByVal password As String, ByVal pathToSignatureImage As String, ByVal signatureViewLocation As Boundary)
' open existing document and sign once
Using inputStream As Stream = New FileStream(pathToDocument, FileMode.Open, FileAccess.ReadWrite)
Using doc As New FixedDocument(inputStream)
Dim imageResourceId As String = Guid.NewGuid().ToString("N")
Dim signatureFieldId As String = Guid.NewGuid().ToString("N")
' register signature image resource
doc.ResourceManager.RegisterResource(New Image(imageResourceId, pathToSignatureImage))
' create first signature field and initialize it using a stored certificate
Dim signatureField As New SignatureField(signatureFieldId)
Using signatureDataStream As Stream = File.OpenRead(pathToCertificate)
signatureField.Signature = Signature.Create(New Pkcs12Store(signatureDataStream,password))
End Using
' add signature fields to the document
doc.AcroForm.Fields.Add(signatureField)
' create first signature view using the image resource
Dim signatureView As New SignatureFieldView(signatureField, signatureViewLocation)
signatureView.ViewSettings.Graphic = Graphic.Image
signatureView.ViewSettings.GraphicResourceID = imageResourceId
signatureView.ViewSettings.Description = Description.None
' add views to page annotations collection
doc.Pages (0).Annotations.Add(signatureView)
' save as incremental update
doc.Save()
End Using
End Using
End Sub
對於這些庫,輸出幾乎相同。 您可以清楚地看到,IronPDF在操作PDF內容方面更簡單且更方便。 輸出 PDF 已使用證書簽名,並在上面打印簽名。
IronPDF 是一個 C# 庫,開發時可免費使用,並隨時可取得商業使用授權。單一開發者、代理商、多國組織以及 SaaS 和 OEM 重新分發的專案授權都可取得。 所有授權均提供30天退款保證、一年支援與升級、開發/測試/生產有效性,以及永久授權。(一次性購買).
Lite 套件的價格為 $749,無需經常性費用。 更多詳細資訊和選擇最佳授權的協助,請參閱IronPDF 產品授權頁面.
目前有兩種授權計畫在使用-現代計畫和傳統計畫。 如果您已經擁有許可證,那麼舊的許可證方案會在您的許可證到期前繼續有效。 之後,您需要聯繫客戶支援以進行過渡。 如果您是新客戶,現代授權方案才適用於您。
在現代方案下,有三個授權等級:
商業 - 任何在上面未描述的使用情況。 定價取決於使用模式。
如需購買的更多詳細信息,您可以聯繫Apitron銷售代表.
IronPDF庫可以從HTML、JS、CSS、JPG、PNG、GIF和SVG等文件類型創建像素完美的PDF。 Chromium 引擎有助於將 HTML 文件或 URL 呈現為完美的 PDF 輸出。
Apitron 讓您使用固定佈局 API 來創建 PDF,實現與 100% PDF 規範相容。 作為一種類似於HTML和CSS的風格驅動內容生成方法,此固定版面API為您提供在幾分鐘內創建精美報告、賬單、目錄等的能力。 它還支持建立 XML 模板。
Apitron PDF 的授權價格不在他們的網站上提供。您需要聯繫支持以根據您的使用情況獲取報價。 另一方面,IronPDF 在其網站上展示了非常清晰的授權套餐。這使得 IronPDF 從競爭對手中脫穎而出,並讓用戶能夠根據需求明智地選擇。
使用 IronPDF,您可以比使用 Apitron PDF 更輕鬆地處理 PDF 文件。 IronPDF 允許使用者在處理複雜的 PDF 任務時編寫較少的代碼行。 IronPDF 提供多種方法從多種文件類型生成 PDF,而 Apitron 只能將 XML 文件轉換為 PDF 文件。 與Apitron相比,IronPDF在不添加任何技術選項的情況下即可實現完美輸出。
所有 Iron Software 的客戶都可以選擇以兩個產品的價格購買該公司五個產品中的全部。 嘗試IronPDF 提供 30 天免費試用以測試其完整功能。 購買完整套裝的 Iron Software 產品在 IronSoftware.com.