IRONSOFTWAREHOME
影片

如何在 C# 中從 PDF 中提取嵌入文字和圖像

Curtis Chau
Curtis Chau
Updated: 2026年7月19日

Api2pdf 提供了一種基於雲的 PDF 生成服務,但將敏感文件發送到外部伺服器可能會導致安全風險、合規問題以及隨時間累積的持續成本。本指南提供了從Api2pdf遷移到IronPDF的詳細路徑,IronPDF 是一款原生 .NET PDF 程式庫,可以完全在您的基礎架構上處理文件,消除了資料傳輸的顧慮,並將每次轉換成本轉化為一次性投資。

為何考慮從Api2pdf遷移?

雖然Api2pdf提供方便的雲端 PDF 生成,但有多個因素導致開發團隊尋找內部替代方案來滿足其 PDF 生成需求。

安全與合規考量

Api2pdf 作為一項雲服務,將您的敏感 HTML 和文件發送到第三方伺服器進行處理。 這對於正在處理受監管資料的組織帶來了重大擔憂。

風險Api2pdfIronPDF
資料傳輸所有內容發送至外部伺服器在您的基礎架構上本地處理
GDPR 合規性資料跨越管轄區域資料從未離開您的環境
HIPAA 合規性PHI 外部傳輸PHI 保持在您的系統內
SOC 2第三方依賴完全控制資料處理
PCI DSS卡資料可能暴露無外部傳輸

成本隨時間累積

Api2pdf 每月收費 1 美元的基礎費用,加上按使用量計費(帶寬和計算時間),而IronPDF提供一次性永久授權。 在 api2pdf.com/pricing 上驗證當前數字:

組件Api2pdfIronPDF
基礎每月 $1一次性授權
帶寬每 MB $0.001不適用(本地)
計算每秒 $0.00019551不適用(本地)
容量擴展隨使用和文件大小線性增加固定(Lite ~ $999、Plus ~ $1,499、Professional ~ $2,399)

較重的工作負載(大文件、JS 重的頁面、長渲染時間)會提高 api2pdf 的賬單;IronPDF的成本一旦授權即固定。

性能和可用性

Api2pdf 需要網路往返,為每個 PDF 生成請求增加 2-5 秒的延遲。而IronPDF以 100-500 毫秒在本地處理。 此外,IronPDF 完全離線工作並支持氣隙環境——這對於無法依賴外部服務可用性的應用至關重要。

##Api2pdfvs. IronPDF:關鍵區別

方面Api2pdfIronPDF
資料處理發送至第三方雲伺服器在您的基礎架構上本地處理
定價$1/月基礎費 + 按使用量計費($0.001/MB 帶寬,$0.00019551/秒計算)一次性永久授權
延遲2-5 秒(網路往返)100-500 毫秒(本地處理)
離線不可用完全離線工作
安裝API 密鑰 + HTTP 客戶端簡單的NuGet 套件
合規性GDPR/HIPAA 擔憂(資料離開網路)完全合規控制

逐步遷移過程

步驟1:更新NuGet包

移除Api2pdf程式包並安裝 IronPDF:

# Remove Api2pdf
dotnet remove package Api2Pdf

# Install IronPDF
dotnet add package IronPdf
SHELL

或者通過包管理器控制台:

Uninstall-Package Api2Pdf
Install-Package IronPdf
PowerShell

步驟 2:更新命名空間引用

將Api2pdf命名空間替換為 IronPDF:

// Remove these
using Api2Pdf;

// Add these
using IronPdf;
using IronPdf.Rendering;

步驟 3:配置授權金鑰

在應用程式啟動時設置IronPDF授權金鑰:

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";

// Or configure via appsettings.json:
// { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" }

步驟 4:移除 API 密鑰配置

IronPDF 在本地運行,不需要 API 密鑰:

// Remove thisApi2pdfpattern
var client = new Api2Pdf("API_KEY");

// Just create the renderer directly
var renderer = new ChromePdfRenderer();
C#

完整 API 遷移參考

核心類映射

Api2pdf 類IronPDF等價
Api2Pdf(客戶端)ChromePdfRenderer
Api2PdfResultPdfDocument
ChromeHtmlToPdfOptionsChromePdfRenderOptions

方法映射

Api2pdf 方法IronPDF方法
client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest { Html = html })renderer.RenderHtmlAsPdf(html)
client.Chrome.UrlToPdfAsync(new ChromeUrlToPdfRequest { Url = url })renderer.RenderUrlAsPdf(url)
result.FileUrl(下載 URL)pdf.SaveAs(path)
result.GetFileBytes()pdf.BinaryData
client.PdfSharp.MergePdfs(new PdfMergeRequest { Urls = urls })PdfDocument.Merge(pdfs)
client.PdfSharp.SetPassword(new PdfPasswordRequest { Url, OwnerPassword })pdf.SecuritySettings.OwnerPassword

渲染選項映射

Api2pdf 選項IronPDF 選項
Landscape = trueRenderingOptions.PaperOrientation = Landscape
PreferCSSPageSize = true / FormatRenderingOptions.PaperSize = PdfPaperSize.A4
PrintBackground = trueRenderingOptions.PrintHtmlBackgrounds = true
MarginTop,等等。RenderingOptions.MarginTop,等等。
Delay = 5000RenderingOptions.WaitFor.RenderDelay(5000)

程式碼遷移範例

HTML到PDF轉換

最常見的Api2pdf操作展示了從雲 API 呼叫到本地處理的根本轉變。

Api2pdf 實施:

// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new Api2Pdf("your-api-key");
        var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
        {
            Html = "<h1>Hello World</h1>"
        });
        Console.WriteLine(result.FileUrl);
    }
}

IronPDF實現:

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}

IronPDF 消除了網路往返、API 密鑰管理以及Api2pdf的基於 URL 的響應模式所要求的獨立下載步驟。

URL 到 PDF 轉換

Api2pdf 實施:

// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new Api2Pdf("your-api-key");
        var result = await client.Chrome.UrlToPdfAsync(new ChromeUrlToPdfRequest
        {
            Url = "https://www.example.com"
        });
        Console.WriteLine(result.FileUrl);
    }
}

IronPDF實現:

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("PDF created from URL successfully");
    }
}

帶選項的 HTML 文件轉 PDF

Api2pdf 實施:

// NuGet: Install-Package Api2Pdf
using System;
using System.IO;
using System.Threading.Tasks;
using Api2Pdf;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new Api2Pdf("your-api-key");
        string html = File.ReadAllText("input.html");
        var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
        {
            Html = html,
            Options = new ChromeHtmlToPdfOptions
            {
                Landscape = true,
                PrintBackground = true
            }
        });
        Console.WriteLine(result.FileUrl);
    }
}

IronPDF實現:

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
        string html = File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created with options successfully");
    }
}

IronPDF 將渲染選項直接配置在渲染器物件上,而不是在每次 API 調用中作為單獨的選項參數傳遞。

合併多個 PDF

Api2pdf 實施:

using Api2Pdf;

var client = new Api2Pdf("YOUR_API_KEY");

var pdfUrls = new List<string>
{
    "https://example.com/pdf1.pdf",
    "https://example.com/pdf2.pdf",
    "https://example.com/pdf3.pdf"
};

var request = new PdfMergeRequest { Urls = pdfUrls };
var result = await client.PdfSharp.MergePdfsAsync(request);

if (result.Success)
{
    // Download merged PDF from result.FileUrl
}

IronPDF實現:

using IronPdf;

// Load PDFs from files
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var pdf3 = PdfDocument.FromFile("document3.pdf");

// Merge all PDFs
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("merged.pdf");

IronPDF 的靜態 Merge 方法直接接受多個文件,消除了基於 URL 的工作流程。

密碼保護的 PDF

Api2pdf 實施:

using Api2Pdf;

var client = new Api2Pdf("YOUR_API_KEY");

// Generate PDF first
var pdfResult = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
    Html = "<h1>Confidential</h1>"
});

// Then add password protection in a second round-trip
var protectedResult = await client.PdfSharp.SetPasswordAsync(new PdfPasswordRequest
{
    Url = pdfResult.FileUrl,
    OwnerPassword = "secretpassword"
});

IronPDF實現:

using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

// Set security in one step
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

pdf.SaveAs("protected.pdf");

IronPDF 通過 SecuritySettings 屬性提供對 PDF 權限的細粒度控制。

頭部和尾部

Api2pdf 實施:

using Api2Pdf;

var client = new Api2Pdf("YOUR_API_KEY");

var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
    Html = html,
    Options = new ChromeHtmlToPdfOptions
    {
        DisplayHeaderFooter = true,
        HeaderTemplate = "<div style='font-size:10px'>Company Header</div>",
        FooterTemplate = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>"
    }
});

IronPDF實現:

using IronPdf;

var renderer = new ChromePdfRenderer();

// HTML headers and footers with full styling
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>",
    DrawDividerLine = true
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>",
    DrawDividerLine = true
};

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("with-headers.pdf");

IronPDF 支持占位符標記,如 {page}{total-pages} 用於動態頁碼。 欲了解更多選項,請參見 頁眉和頁腳文件

ASP.NET Core 整合

Api2pdf 的異步 HTTP 模式與IronPDF的直接 PDF 生成有顯著不同。

Api2pdf 模式:

[ApiController]
public class PdfController : ControllerBase
{
    private readonly Api2Pdf _client;

    public PdfController()
    {
        _client = new Api2Pdf("YOUR_API_KEY");
    }

    [HttpGet("generate")]
    public async Task<IActionResult> GeneratePdf()
    {
        var result = await _client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
        {
            Html = "<h1>Report</h1>"
        });

        if (!result.Success)
            return BadRequest(result.Error);

        // Redirect to download URL
        return Redirect(result.FileUrl);
    }
}

IronPDF模式:

[ApiController]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public IActionResult GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");

        // Return PDF directly - no download step needed
        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }

    [HttpGet("generate-async")]
    public async Task<IActionResult> GeneratePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");

        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }
}

IronPDF 通過 BinaryDataStream 直接返回 PDF,消除了重定向至下載模式。

依賴注入配置

// Program.cs or Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IPdfService, IronPdfService>();
}

// IPdfService.cs
public interface IPdfService
{
    PdfDocument GenerateFromHtml(string html);
    Task<PdfDocument> GenerateFromHtmlAsync(string html);
}

// IronPdfService.cs
public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    }

    public PdfDocument GenerateFromHtml(string html) =>
        _renderer.RenderHtmlAsPdf(html);

    public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
        _renderer.RenderHtmlAsPdfAsync(html);
}

錯誤處理遷移

Api2pdf 使用響應物件檢查。IronPDF使用標準 .NET 異常。

Api2pdf 模式:

var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest { Html = html });

if (!result.Success)
{
    Console.WriteLine($"Error: {result.Error}");
    return;
}

IronPDF模式:

try
{
    var renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs("output.pdf");
}
catch (IronPdf.Exceptions.IronPdfLicenseException ex)
{
    Console.WriteLine($"License error: {ex.Message}");
}
catch (IronPdf.Exceptions.IronPdfRenderingException ex)
{
    Console.WriteLine($"Rendering error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}

性能比較

指標Api2pdfIronPDF
簡單 HTML2-5 秒(網路)100-500 毫秒(本地)
複雜頁面5-10 秒500 毫秒至 2 秒
100 批次分鐘(速率限制)秒(並行)
離線不可用工作完全
冷啟動None~2 秒(首次渲染)

性能優化技巧

// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();

public PdfDocument GeneratePdf(string html)
{
    return SharedRenderer.RenderHtmlAsPdf(html);
}

// 2. Parallel generation
var tasks = htmlDocs.Select(html =>
    Task.Run(() => SharedRenderer.RenderHtmlAsPdf(html)));
var results = await Task.WhenAll(tasks);

// 3. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0);   // No delay

故障排除常見的遷移問題

問題:PDF 與Api2pdf輸出的差異

匹配Api2pdf的 Headless Chrome 設置:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.ViewPortWidth = 1280;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1000);

問題:外部資源未載入

配置資源載入超時:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.AllFontsLoaded(timeout: 10000);
renderer.RenderingOptions.WaitFor.NetworkIdle(timeout: 10000);

// Or use base URL for relative paths
var pdf = renderer.RenderHtmlAsPdf(html, baseUrl: "https://example.com/");

問題:PDF 文件尺寸過大

生成後壓縮圖片:

renderer.RenderingOptions.ImageQuality = 80;

// Or compress after generation
pdf.CompressImages(quality: 75);
pdf.SaveAs("compressed.pdf");

後遷移檢查清單

完成程式碼遷移後,請驗證以下內容:

  • 驗證 PDF 輸出質量符合期望
  • 測試所有邊緣案例(大文件,特殊字元)
  • 驗證性能指標(應有顯著改善)
  • 更新 Docker 配置(如適用)
  • 移除Api2pdf入口帳戶及 API 密鑰
  • 更新監控(不再需要 API 延遲跟蹤)
  • 為您的團隊記錄新模式
  • 更新 CI/CD 管道

其他資源


從Api2pdf遷移到IronPDF將您的 PDF 生成從依賴於雲,每次轉換成本模式轉變為本地的一次性投資。 您的敏感文件保存在您的基礎架構中,延遲從秒下降到毫秒,並且您消除了此關鍵應用功能的供應商依賴。

請注意: API2PDF 和 PDFSharp 是其各自所有者的註冊商標。 本網站與 Api2Pdf 或 empira Software GmbH 無關,也未獲其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映撰寫時公開可用的資訊。
Curtis Chau
技術作家

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

...
閱讀更多

相關文章

Key in blue circle

立即免費取得 30 天試用金鑰

Your trial license will be sent to your email address

無任何限制。100% 解鎖。無需信用卡。

bullet_checked無需信用卡或建立帳號無任何限制。100% 解鎖。無需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預訂您的免費現場演示
Booking Badge

受到全球數百萬工程師的信任

Iron Software的客戶標誌
獲取您的無義務諮詢
填寫以下表格或電子郵件sales@ironsoftware.com
您的詳細資訊將始終保密
受到全球數百萬工程師的信任
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立