跳至頁尾內容
影片

如何使用 C# 將 XML 轉換為 PDF

從PdfPig遷移到IronPDF可以擴展您的PDF功能,從一個專注於閱讀的程式庫(具有基於座標的撰寫和基本合併的狹窄編寫介面)轉變為一個全面的PDF解決方案,可處理建立、操作、文字提取和安全性功能。 本指南提供完整且逐步的遷移路徑,保留您現有的提取工作流程,同時增加HTML轉換、高層次文件操作、浮水印和安全撰寫,這些是PdfPig不提供的。

為何從PdfPig遷移到IronPDF

了解PdfPig

PdfPig(NuGet套件UglyToad.PdfPig)是一個開源.NET PDF閱讀和提取程式庫,最初受Apache PDFBox Java專案啟發,並部分移植自該專案。 它允許開發者以高精度存取PDF的結構內容。 雖然PdfPig在提取方面表現出色,但其範圍比完整生命週期的商業程式庫更窄。 該專案仍為pre-1.0(目前穩定發布版為0.1.14),其README中指出"在版本低於1.0.0時,小版本將無需警告更改公共API。"

PdfPig提供可靠的工具來提取文字(具有字母和單詞級位置)、圖像、只讀的表單資料、註釋和元資料。 它還暴露了有限的編寫介面——UglyToad.PdfPig.Writer中)用於合併現有的PDF文件。 這使得它成為一個主要專注於文件分析、資料挖掘和基本合併的應用程式的合適選擇。

閱讀為主的限制

PdfPig是以閱讀為先,其編寫介面是有意設計得很狹窄。 當您的應用程式需要超越提取和基本合併時,PdfPig無法提供幫助:

  1. 有限的PDF生成: 新文件需要通過PdfPoint手動座標放置,無法進行高層次布局。

  2. 沒有HTML到PDF轉換: PdfPig是一個PDF閱讀/解析程式庫,不是PDF生成程式庫。 您將需要使用不同的程式庫進行HTML到PDF的轉換。

  3. 有限的文件操作: PdfMerger支持合併,但沒有高層次的拆分/旋轉/編輯API。

  4. 沒有安全撰寫: 能閱讀加密的PDF(有密碼)但不能新增密碼、加密或數位簽章。

  5. 沒有浮水印/印章: 沒有高層次API用於現有文件的視覺覆蓋。

  6. 無表單填寫: 表單是只讀的,值不能更改或新增。

PdfPig與IronPDF比較

功能 PdfPig IronPDF
授權 開源(Apache 2.0) 商業
NuGet套件 PdfPig(v0.1.14,pre-1.0) IronPdf
PDF閱讀/提取 優秀 優秀
PDF 生成 有限(基於座標通過PdfDocumentBuilder 全面
HTML 到 PDF 不支持 支援
文字提取 優秀(具單詞框) 優秀(僅文字)
PDF合併 支持(PdfMerger 支持(PdfDocument.Merge
拆分/旋轉/編輯 不支持(高層次) 支援
水印 不支持 支援
安全性/加密撰寫 不支持 支援
支持和檔 社群支持 專項支持
頁碼編索 基於1 0起始基數

IronPDF支持完整的PDF建立、閱讀、編輯和簽名功能。 這種靈活性使開發者能夠在現代.NET上從頭到尾管理PDF文件,提供超越PdfPig閱讀功能的完整PDF生命週期解決方案。


開始之前

前提條件

  1. .NET環境:.NET Framework 4.6.2+ 或.NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet存取: 有能力安裝NuGet套件
  3. IronPDF授權:ironpdf.com獲取您的授權金鑰

NuGet包變更

# Remove PdfPig
dotnet remove package PdfPig

# Install IronPDF
dotnet add package IronPdf
# Remove PdfPig
dotnet remove package PdfPig

# Install IronPDF
dotnet add package IronPdf
SHELL

授權配置

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

識別PdfPig使用情況

# FindPdfPigusage
grep -r "UglyToad\.PdfPig\|PdfDocument\.Open\|GetPages\(\)" --include="*.cs" .

# Find page index references (may need 1→0 conversion)
grep -r "GetPage(\|NumberOfPages" --include="*.cs" .
# FindPdfPigusage
grep -r "UglyToad\.PdfPig\|PdfDocument\.Open\|GetPages\(\)" --include="*.cs" .

# Find page index references (may need 1→0 conversion)
grep -r "GetPage(\|NumberOfPages" --include="*.cs" .
SHELL

完整API參考

名稱空間變更

// Before: PdfPig
using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;
using UglyToad.PdfPig.DocumentLayoutAnalysis.WordExtractor;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PdfPig
using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;
using UglyToad.PdfPig.DocumentLayoutAnalysis.WordExtractor;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: PdfPig
Imports UglyToad.PdfPig
Imports UglyToad.PdfPig.Content
Imports UglyToad.PdfPig.DocumentLayoutAnalysis.WordExtractor

' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
$vbLabelText   $csharpLabel

文件載入映射

PdfPig IronPDF
PdfDocument.Open(path) PdfDocument.FromFile(path)
PdfDocument.Open(bytes) PdfDocument.FromBinaryData(bytes)
PdfDocument.Open(stream) PdfDocument.FromStream(stream)
using (var doc = ...) var pdf = ...

頁面存取與屬性映射

PdfPig IronPDF
document.NumberOfPages pdf.PageCount
document.GetPages() pdf.Pages
document.GetPage(1) pdf.Pages[0]

文字提取映射

PdfPig IronPDF
page.Text pdf.Pages[i].Text
page.GetWords() pdf.ExtractTextFromPage(i)
(manual loop) pdf.ExtractAllText()

元資料存取映射

PdfPig IronPDF
document.Information.Title pdf.MetaData.Title
document.Information.Author pdf.MetaData.Author
document.Information.Subject pdf.MetaData.Subject
document.Information.Creator pdf.MetaData.Creator
document.Information.Producer pdf.MetaData.Producer

PdfPig中無法使用的新功能

IronPDF功能 說明
renderer.RenderHtmlAsPdf(html) HTML到PDF轉換
renderer.RenderUrlAsPdf(url) URL到PDF轉換
pdf.ApplyWatermark(html) 新增水印
pdf.SecuritySettings.UserPassword 密碼保護
pdf.Sign(certificate) 數位簽名

注意:PDF合併在兩個程式庫中均可用(PdfPig中的PdfDocument.Merge)。


程式碼遷移範例

範例1:從PDF中提取文字

之前(PdfPig):

// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        using (var document = PdfDocument.Open("input.pdf"))
        {
            var text = new StringBuilder();
            foreach (var page in document.GetPages())
            {
                text.AppendLine(page.Text);
            }
            Console.WriteLine(text.ToString());
        }
    }
}
// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        using (var document = PdfDocument.Open("input.pdf"))
        {
            var text = new StringBuilder();
            foreach (var page in document.GetPages())
            {
                text.AppendLine(page.Text);
            }
            Console.WriteLine(text.ToString());
        }
    }
}
Imports UglyToad.PdfPig
Imports System
Imports System.Text

Class Program
    Shared Sub Main()
        Using document = PdfDocument.Open("input.pdf")
            Dim text = New StringBuilder()
            For Each page In document.GetPages()
                text.AppendLine(page.Text)
            Next
            Console.WriteLine(text.ToString())
        End Using
    End Sub
End Class
$vbLabelText   $csharpLabel

之後(IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");
        string text = pdf.ExtractAllText();
        Console.WriteLine(text);
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");
        string text = pdf.ExtractAllText();
        Console.WriteLine(text);
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim pdf = PdfDocument.FromFile("input.pdf")
        Dim text As String = pdf.ExtractAllText()
        Console.WriteLine(text)
    End Sub
End Class
$vbLabelText   $csharpLabel

PdfPig和IronPDF都提供卓越的文字提取能力。 主要區別在於程式碼模式。 PdfPig需要page.Text屬性中的文字。

IronPDF簡化為單一呼叫:ExtractAllText()一次返回所有文字內容。 不需要using語句,無需手動迭代,無需StringBuilder。 請參見文字提取文件以獲得更多選項。

範例2:HTML到PDF轉換

之前(PdfPig):

PdfPig不支持HTML到PDF的轉換。 PdfPig是一個PDF閱讀/解析程式庫,不是PDF生成程式庫。 您將需要使用不同的程式庫進行HTML到PDF的轉換。

之後(IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

此範例突出顯示了最顯著的功能差距。PdfPig明確指出其"不支持HTML到PDF轉換",並"是PDF閱讀/解析程式庫,不是PDF生成程式庫。"如果您需要用PdfPig將HTML製作成PDF,您需要完全使用其他程式庫。

IronPDF通過ChromePdfRenderer提供原生的HTML到PDF轉換。 RenderHtmlAsPdf()方法接受HTML字串,並使用內部Chromium引擎進行準確呈現HTML、CSS和JavaScript的PDF文件轉換。 生成的SaveAs()保存,或在保存前進一步操作。 查看更多HTML到PDF文件以獲得完整的範例。

範例3:讀取PDF元資料

之前(PdfPig):

// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;

class Program
{
    static void Main()
    {
        using (var document = PdfDocument.Open("input.pdf"))
        {
            var info = document.Information;
            Console.WriteLine($"Title: {info.Title}");
            Console.WriteLine($"Author: {info.Author}");
            Console.WriteLine($"Subject: {info.Subject}");
            Console.WriteLine($"Creator: {info.Creator}");
            Console.WriteLine($"Producer: {info.Producer}");
            Console.WriteLine($"Number of Pages: {document.NumberOfPages}");
        }
    }
}
// NuGet: Install-Package PdfPig
using UglyToad.PdfPig;
using System;

class Program
{
    static void Main()
    {
        using (var document = PdfDocument.Open("input.pdf"))
        {
            var info = document.Information;
            Console.WriteLine($"Title: {info.Title}");
            Console.WriteLine($"Author: {info.Author}");
            Console.WriteLine($"Subject: {info.Subject}");
            Console.WriteLine($"Creator: {info.Creator}");
            Console.WriteLine($"Producer: {info.Producer}");
            Console.WriteLine($"Number of Pages: {document.NumberOfPages}");
        }
    }
}
Imports UglyToad.PdfPig
Imports System

Class Program
    Shared Sub Main()
        Using document = PdfDocument.Open("input.pdf")
            Dim info = document.Information
            Console.WriteLine($"Title: {info.Title}")
            Console.WriteLine($"Author: {info.Author}")
            Console.WriteLine($"Subject: {info.Subject}")
            Console.WriteLine($"Creator: {info.Creator}")
            Console.WriteLine($"Producer: {info.Producer}")
            Console.WriteLine($"Number of Pages: {document.NumberOfPages}")
        End Using
    End Sub
End Class
$vbLabelText   $csharpLabel

之後(IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");
        var info = pdf.MetaData;
        Console.WriteLine($"Title: {info.Title}");
        Console.WriteLine($"Author: {info.Author}");
        Console.WriteLine($"Subject: {info.Subject}");
        Console.WriteLine($"Creator: {info.Creator}");
        Console.WriteLine($"Producer: {info.Producer}");
        Console.WriteLine($"Number of Pages: {pdf.PageCount}");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");
        var info = pdf.MetaData;
        Console.WriteLine($"Title: {info.Title}");
        Console.WriteLine($"Author: {info.Author}");
        Console.WriteLine($"Subject: {info.Subject}");
        Console.WriteLine($"Creator: {info.Creator}");
        Console.WriteLine($"Producer: {info.Producer}");
        Console.WriteLine($"Number of Pages: {pdf.PageCount}");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim pdf = PdfDocument.FromFile("input.pdf")
        Dim info = pdf.MetaData
        Console.WriteLine($"Title: {info.Title}")
        Console.WriteLine($"Author: {info.Author}")
        Console.WriteLine($"Subject: {info.Subject}")
        Console.WriteLine($"Creator: {info.Creator}")
        Console.WriteLine($"Producer: {info.Producer}")
        Console.WriteLine($"Number of Pages: {pdf.PageCount}")
    End Sub
End Class
$vbLabelText   $csharpLabel

兩個程式庫都能以幾乎相同的模式提供元資料存取。 PdfPig通過document.NumberOfPages存取頁面計數。 IronPDF使用pdf.PageCount讀取頁面計數。

遷移很簡單:用document.NumberOfPages。 移除using語句包裝,因為IronPDF不需要它。


關鍵遷移注意事項

頁碼編索變更

PdfPig使用1為基索引; IronPDF使用0為基索引:

// PdfPig: 基於1 indexing
var firstPage = document.GetPage(1);  // First page

// IronPDF:0起始基數indexing
var firstPage = pdf.Pages[0];  // First page

// Migration helper
int pdfPigIndex = 1;
int ironPdfIndex = pdfPigIndex - 1;
// PdfPig: 基於1 indexing
var firstPage = document.GetPage(1);  // First page

// IronPDF:0起始基數indexing
var firstPage = pdf.Pages[0];  // First page

// Migration helper
int pdfPigIndex = 1;
int ironPdfIndex = pdfPigIndex - 1;
' PdfPig: 基於1 indexing
Dim firstPage = document.GetPage(1)  ' First page

' IronPDF:0起始基數indexing
Dim firstPage = pdf.Pages(0)  ' First page

' Migration helper
Dim pdfPigIndex As Integer = 1
Dim ironPdfIndex As Integer = pdfPigIndex - 1
$vbLabelText   $csharpLabel

使用語句不需要

// PdfPig: Requires using for disposal
using (var document = PdfDocument.Open("input.pdf"))
{
    // ...
}

// IronPDF: No using required (but can use for cleanup)
var pdf = PdfDocument.FromFile("input.pdf");
// ...
// pdf.Dispose(); // Optional
// PdfPig: Requires using for disposal
using (var document = PdfDocument.Open("input.pdf"))
{
    // ...
}

// IronPDF: No using required (but can use for cleanup)
var pdf = PdfDocument.FromFile("input.pdf");
// ...
// pdf.Dispose(); // Optional
Imports PdfPig
Imports IronPDF

Using document = PdfDocument.Open("input.pdf")
    ' ...
End Using

Dim pdf = PdfDocument.FromFile("input.pdf")
' ...
' pdf.Dispose() ' Optional
$vbLabelText   $csharpLabel

文件載入更改

// PdfPig: PdfDocument.Open()
using (var document = PdfDocument.Open("input.pdf"))

// IronPDF: PdfDocument.FromFile()
var pdf = PdfDocument.FromFile("input.pdf");
// PdfPig: PdfDocument.Open()
using (var document = PdfDocument.Open("input.pdf"))

// IronPDF: PdfDocument.FromFile()
var pdf = PdfDocument.FromFile("input.pdf");
Imports PdfPig
Imports IronPDF

Using document = PdfDocument.Open("input.pdf")
End Using

Dim pdf = PdfDocument.FromFile("input.pdf")
$vbLabelText   $csharpLabel

元資料屬性名稱變更

// PdfPig: document.Information
var info = document.Information;

// IronPDF: pdf.MetaData
var info = pdf.MetaData;
// PdfPig: document.Information
var info = document.Information;

// IronPDF: pdf.MetaData
var info = pdf.MetaData;
' PdfPig: document.Information
Dim info = document.Information

' IronPDF: pdf.MetaData
Dim info = pdf.MetaData
$vbLabelText   $csharpLabel

頁數屬性變更

// PdfPig: document.NumberOfPages
Console.WriteLine($"Pages: {document.NumberOfPages}");

// IronPDF: pdf.PageCount
Console.WriteLine($"Pages: {pdf.PageCount}");
// PdfPig: document.NumberOfPages
Console.WriteLine($"Pages: {document.NumberOfPages}");

// IronPDF: pdf.PageCount
Console.WriteLine($"Pages: {pdf.PageCount}");
' PdfPig: document.NumberOfPages
Console.WriteLine($"Pages: {document.NumberOfPages}")

' IronPDF: pdf.PageCount
Console.WriteLine($"Pages: {pdf.PageCount}")
$vbLabelText   $csharpLabel

遷移後的新能力

遷移到IronPDF後,您獲得了PdfPig無法提供的功能:

PDF合併

var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
$vbLabelText   $csharpLabel

水印

pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>")
$vbLabelText   $csharpLabel

密碼保護

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
$vbLabelText   $csharpLabel

數位簽名

var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningContact = "support@company.com",
    SigningReason = "Document Approval"
};
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningContact = "support@company.com",
    SigningReason = "Document Approval"
};
pdf.Sign(signature);
Dim signature As New PdfSignature("certificate.pfx", "password") With {
    .SigningContact = "support@company.com",
    .SigningReason = "Document Approval"
}
pdf.Sign(signature)
$vbLabelText   $csharpLabel

功能比較總結

功能 PdfPig IronPDF
文字提取
元資料存取
圖像提取
PDF建立 有限(基於座標)
HTML轉PDF
URL到PDF
合併PDF ✓(PdfMerger
拆分PDF
浮水印
表單填寫
密碼保護
數位簽名
單詞位置資料

遷移檢查表

遷移前

  • 清點程式碼庫中的所有PdfPig用法
  • 確認是否需要單詞級位置資料(考慮混合方法)
  • 記錄所有頁面索引引用(需要從1為基轉換為0為基)
  • 規劃IronPDF授權密鑰的儲存(建議使用環境變數)
  • 先使用IronPDF試用授權進行測試

套件變更

  • 移除PdfPig NuGet套件:dotnet remove package PdfPig
  • 安裝IronPdf NuGet套件:dotnet add package IronPdf

程式碼變更

  • 更新命名空間導入(using UglyToad.PdfPig;using IronPdf;
  • PdfDocument.Open()
  • document.Information
  • document.NumberOfPages
  • 將頁面索引從1為基轉換為0為基
  • 移除using語句(可選,IronPDF不需要它們)
  • 在應用程式啟動時新增IronPDF授權金鑰

遷移後

  • 測試文字提取輸出是否符合預期
  • 測試所有PDF生成場景
  • 根據需要新增新功能(合併,水印,安全性)
  • 如果部署到Linux,安裝Linux依賴項

請注意Apache PDFBox和PdfPig是各自所有者的註冊商標。 本網站未與Apache Software Foundation或UglyToad有關聯、未經其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映撰寫時公開可用的資訊。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話