IRONSOFTWAREHOME
视频

如何从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 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-heavy 页面、长渲染时间)会增加 api2pdf 的费用;IronPDF的成本一旦授权即固定。

性能和可用性

Api2pdf 需要网络往返,每次生成 PDF 请求会增加 2-5 秒的延迟。IronPDF 的本地处理时间为 100-500 毫秒。 此外,IronPDF 可在完全离线和空气屏蔽的环境中工作--这对于不能依赖外部服务可用性的应用程序来说至关重要。

##Api2pdf与 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:更新命名空间引用

用IronPDF替换Api2pdf命名空间:

// 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 (client)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 (下载链接)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
MarginTopRenderingOptions.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 秒500ms-2s
每批 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的无头 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 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

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 天试用密钥
无需信用卡或创建账户