跳至頁尾內容
PDF工具

PDF與PDF/A(對比及使用方式)

Full Comparison

Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.

View Full Comparison

iText 的"文件沒有頁面"錯誤發生在 XMLWorker 無法解析 HTML 內容時,但IronPDF 的基於 Chrome 的渲染器通過與瀏覽器一樣精確地處理 HTML,消除了這個問題,提供了可靠的 PDF 產生而不會出現解析例外。

.NET 應用程式中,將 HTML 轉換為 PDF 是常見需求,但使用 iText 的開發人員經常遇到"文件沒有頁面"錯誤。 這個錯誤出現在 PDF 文件生成過程失敗時,讓開發人員尋找解決方案。 本分析探討為什麼會發生這種情況以及如何有效地解決,請參閱IronPDF 的 HTML 到 PDF 能力

什麼導致"文件沒有頁面"錯誤?

當 iText 的解析器無法將 HTML 內容處理成有效的 PDF 文件時,就會發生"文件沒有頁面"例外。 許多 Stack Overflow 討論串關於這個問題中的詳細說明中,此錯誤通常在文件關閉操作期間出現。 理解根本原因有助於開發人員選擇適合其需求的PDF 程式庫

此錯誤表現是因為 XMLWorker - iText 的 HTML 解析組件 - 在遇到無法處理的 HTML 結構時,悄然失敗。 它在解析過程中沒有拋出例外,而是生成了一個空文件。 當文件關閉時,iText 檢測到沒有任何內容被寫入,於是拋出"文件沒有頁面"例外。 這種默默失敗模式使除錯變得特別令人沮喪,因為堆疊追蹤指向的是關閉操作而非實際的解析失敗。

static void Main(string[] args)
{
    Document pdfDoc = new Document(PageSize.A4);
    FileStream stream = new FileStream("output.pdf", FileMode.Create);
    PdfWriter writer = PdfWriter.GetInstance(pdfDoc, stream);
    pdfDoc.Open();
    // HTML parsing fails silently -- no exception here
    var sr = new StringReader("<div>Complex HTML</div>");
    XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
    pdfDoc.Close(); // Exception: The document has no pages
    Console.WriteLine("Error: Document has no pages");
}
static void Main(string[] args)
{
    Document pdfDoc = new Document(PageSize.A4);
    FileStream stream = new FileStream("output.pdf", FileMode.Create);
    PdfWriter writer = PdfWriter.GetInstance(pdfDoc, stream);
    pdfDoc.Open();
    // HTML parsing fails silently -- no exception here
    var sr = new StringReader("<div>Complex HTML</div>");
    XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
    pdfDoc.Close(); // Exception: The document has no pages
    Console.WriteLine("Error: Document has no pages");
}
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.tool.xml

Module Program
    Sub Main(args As String())
        Dim pdfDoc As New Document(PageSize.A4)
        Dim stream As New FileStream("output.pdf", FileMode.Create)
        Dim writer As PdfWriter = PdfWriter.GetInstance(pdfDoc, stream)
        pdfDoc.Open()
        ' HTML parsing fails silently -- no exception here
        Dim sr As New StringReader("<div>Complex HTML</div>")
        XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr)
        pdfDoc.Close() ' Exception: The document has no pages
        Console.WriteLine("Error: Document has no pages")
    End Sub
End Module
$vbLabelText   $csharpLabel

當此錯誤發生時,控制台輸出顯示什麼?

Microsoft Visual Studio 偵錯控制台顯示

此程式碼嘗試從 HTML 建立 PDF 文件,但因 XMLWorker 無法成功解析 HTML 內容而遇到例外。 寫入操作完成,但沒有內容新增到文件中,結果產生了空文件。這種解析失敗是在 ASP.NET 應用程式中進行 HTML 到 PDF 轉換時開發人員面臨的最常見問題之一。 在處理自訂的 CSS 樣式或 JavaScript 渲染內容時,問題愈加複雜。

為什麼替代程式庫面臨同樣的問題?

儘管 XMLWorker 取代了已淘汰的 HTMLWorker,但它仍然在某些 HTML 結構上遇到相同問題。 問題的持續存在是因為 XMLWorker 有嚴格的解析需求,這在 iText 的官方論壇上有紀錄。 這個限制影響了那些試圖實現像素級完美 HTML 到 PDF 轉換或在現代 web 應用中工作於響應式 CSS 佈局的開發人員。

通常使用的方法是在解析 HTML 之前先填充一個空段落到文件中。 這能防止"沒有頁面"例外,確保在文件關閉時至少存在一個內容元素:

public static void CreatePDF(string html, string path)
{
    using (var fs = new FileStream(path, FileMode.Create))
    {
        var document = new Document();
        var writer = PdfWriter.GetInstance(document, fs);
        document.Open();
        document.Add(new Paragraph("")); // Workaround to avoid error
        var phrase = new Phrase("Draft version", FontFactory.GetFont("Arial", 8));
        document.Add(phrase);
        using (var sr = new StringReader(html))
        {
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr);
        }
        document.Close();
    }
}
public static void CreatePDF(string html, string path)
{
    using (var fs = new FileStream(path, FileMode.Create))
    {
        var document = new Document();
        var writer = PdfWriter.GetInstance(document, fs);
        document.Open();
        document.Add(new Paragraph("")); // Workaround to avoid error
        var phrase = new Phrase("Draft version", FontFactory.GetFont("Arial", 8));
        document.Add(phrase);
        using (var sr = new StringReader(html))
        {
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr);
        }
        document.Close();
    }
}
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.tool.xml

Public Shared Sub CreatePDF(html As String, path As String)
    Using fs As New FileStream(path, FileMode.Create)
        Dim document As New Document()
        Dim writer As PdfWriter = PdfWriter.GetInstance(document, fs)
        document.Open()
        document.Add(New Paragraph("")) ' Workaround to avoid error
        Dim phrase As New Phrase("Draft version", FontFactory.GetFont("Arial", 8))
        document.Add(phrase)
        Using sr As New StringReader(html)
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr)
        End Using
        document.Close()
    End Using
End Sub
$vbLabelText   $csharpLabel

使用這個解決方法,PDF 的輸出會是什麼樣子?

成功生成的 PDF 顯示

為什麼複雜的 HTML 元素仍然無法呈現?

新增空段落防止了即時錯誤,但帶有表格元素、圖片或自定字型的複雜 HTML 通常無法正確呈現。 在生成的 PDF 文件中,內容可能丟失或格式錯誤。 開發人員在處理嵌入樣式、超連結元素或具體寬度屬性的 HTML 時也會遇到相同問題。 空引用和漏掉元素的呈現創造出了需要更多解決方案的額外問題。

XMLWorker 被設計為處理 HTML 4 的子集和基本的 CSS 2。現代網頁經常使用超出該範圍的功能:CSS Grid、Flexbox、CSS 變數、calc() 表達式、SVG 圖形和 JavaScript 驅動的渲染。 其中任何一項都能觸發"沒有頁面"錯誤或默默無聲地生成破損的輸出 - 並且沒有描述性錯誤來指引修復方法。

// Common XMLWorker limitations that require manual handling
public void ProcessComplexHTML(string htmlContent)
{
    // CSS flexbox -- not supported by XMLWorker
    if (htmlContent.Contains("display: flex"))
        throw new NotSupportedException("Flexbox layout not supported");

    // JavaScript content -- silently ignored
    if (htmlContent.Contains("<script>"))
        Console.WriteLine("Warning: JavaScript will be ignored");

    // 自訂字型 -- require manual embedding
    if (htmlContent.Contains("@font-face"))
        Console.WriteLine("Warning: Web fonts need manual setup");
}
// Common XMLWorker limitations that require manual handling
public void ProcessComplexHTML(string htmlContent)
{
    // CSS flexbox -- not supported by XMLWorker
    if (htmlContent.Contains("display: flex"))
        throw new NotSupportedException("Flexbox layout not supported");

    // JavaScript content -- silently ignored
    if (htmlContent.Contains("<script>"))
        Console.WriteLine("Warning: JavaScript will be ignored");

    // 自訂字型 -- require manual embedding
    if (htmlContent.Contains("@font-face"))
        Console.WriteLine("Warning: Web fonts need manual setup");
}
' Common XMLWorker limitations that require manual handling
Public Sub ProcessComplexHTML(htmlContent As String)
    ' CSS flexbox -- not supported by XMLWorker
    If htmlContent.Contains("display: flex") Then
        Throw New NotSupportedException("Flexbox layout not supported")
    End If

    ' JavaScript content -- silently ignored
    If htmlContent.Contains("<script>") Then
        Console.WriteLine("Warning: JavaScript will be ignored")
    End If

    ' 自訂字型 -- require manual embedding
    If htmlContent.Contains("@font-face") Then
        Console.WriteLine("Warning: Web fonts need manual setup")
    End If
End Sub
$vbLabelText   $csharpLabel

您如何在沒有同樣錯誤的情況下轉換現代 HTML?

這個現實情況示範了將一個有樣式的發票從 HTML 轉換為 PDF 的過程。 範例包括常見的可能引發問題的元素:內嵌 CSS、媒體查詢、表格佈局及超連結。 這些結構是會在 XMLWorker 中觸發"沒有頁面"錯誤的型別:


<!DOCTYPE html>
<html>
<head>
    <title>Invoice Sample</title>
    <style>
        .invoice-header {
            background-color: #f0f0f0;
            padding: 20px;
        }
        .invoice-table {
            margin-top: 20px;
        }
        @media print {
            .no-print { display: none; }
        }
    </style>
</head>
<body>
    <div style="font-family: Arial; width: 100%;">
        <div class="invoice-header">
            <h1 style="color: #2e6c80;">Invoice #12345</h1>
            <p>Date: <span id="date">2025-01-15</span></p>
        </div>
        <table class="invoice-table" style="width: 100%; border-collapse: collapse;">
            <thead>
                <tr>
                    <th style="border: 1px solid #ddd; padding: 8px;">Item</th>
                    <th style="border: 1px solid #ddd; padding: 8px;">Price</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td style="border: 1px solid #ddd; padding: 8px;">Service</td>
                    <td style="border: 1px solid #ddd; padding: 8px;">$100.00</td>
                </tr>
            </tbody>
        </table>
        <a href="https://example.com/terms" class="no-print">View Terms</a>
    </div>
</body>
</html>

<!DOCTYPE html>
<html>
<head>
    <title>Invoice Sample</title>
    <style>
        .invoice-header {
            background-color: #f0f0f0;
            padding: 20px;
        }
        .invoice-table {
            margin-top: 20px;
        }
        @media print {
            .no-print { display: none; }
        }
    </style>
</head>
<body>
    <div style="font-family: Arial; width: 100%;">
        <div class="invoice-header">
            <h1 style="color: #2e6c80;">Invoice #12345</h1>
            <p>Date: <span id="date">2025-01-15</span></p>
        </div>
        <table class="invoice-table" style="width: 100%; border-collapse: collapse;">
            <thead>
                <tr>
                    <th style="border: 1px solid #ddd; padding: 8px;">Item</th>
                    <th style="border: 1px solid #ddd; padding: 8px;">Price</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td style="border: 1px solid #ddd; padding: 8px;">Service</td>
                    <td style="border: 1px solid #ddd; padding: 8px;">$100.00</td>
                </tr>
            </tbody>
        </table>
        <a href="https://example.com/terms" class="no-print">View Terms</a>
    </div>
</body>
</html>
HTML

當 iText 處理此發票時會發生什麼?

基本 invoice PDF displaying Invoice #12345 with simple table formatting containing one service item for $100, demonstrating iText's limited CSS styling capabilities and basic table rendering when XMLWorker successfully processes simple HTML structures

當 iText 處理此發票範本時,輸出經常會缺乏 CSS 樣式、缺失背景顏色,甚至失去表格邊框。 @media print 查詢被忽略,且任何網頁字型引用會導致靜默解析失敗。 如果 HTML 包含 XMLWorker 不認可的 CSS 屬性,整個塊可能無法渲染 - 解析時沒有任何錯誤會被拋出,結果是內容缺失。

IronPDF 如何渲染同一張發票?

Professional invoice PDF #12345 rendered with IronPDF showing preserved CSS styling, properly formatted table with service item for $100, and functioning 'View Terms' hyperlink, demonstrating the Chrome rendering engine's superior HTML/CSS support compared to XMLWorker

為什麼這些 HTML 元素會在 iText 中引發問題?

using iText 的 XMLWorker,該發票可能因表格樣式、寬度屬性或字型規範而失敗。 當這些元素不受支援時,"文件沒有頁面"錯誤通常會出現。 超連結和媒體查詢引用也可能無法正確渲染。 當實現數位簽名或頁碼等高級 PDF 功能到商業應用中時,這些限制變得至關重要。

根據Mozilla Developer Network 關於CSS的文件,現代CSS包括瀏覽器原生支持的數百種屬性和值。 XMLWorker 僅涵蓋了其中的少部分,這就是為什麼現實的網頁內容總是會觸發解析失敗。

如何在不出現解析錯誤的情況下進行 HTML 到 PDF 轉換?

IronPDF 使用 Chrome-based 渲染引擎,精確地處理呈現在 web 瀏覽器中的 HTML。 這種方法消除了解析錯誤並支援所有現代的 HTML 和 CSS 功能。 您可以探索 ChromePdfRenderer API 參考文件以獲取完整的配置選項列表。 Chrome 引擎提供了 JavaScript 執行、網頁字型和響應式佈局支援,這是 XMLWorker 無法處理的。

如何通過 NuGet 安裝 IronPDF?

在編寫任何程式碼之前,先安裝 IronPDF 的 NuGet 包。 您可以從 .NET CLI 完成此操作:

dotnet add package IronPdf

或者從 Visual Studio 的 NuGet 程式包管理器控制台:

Install-Package IronPdf

一旦安裝完成,您可以使用 ChromePdfRenderer,這替換了整個 iText + XMLWorker pipeline,以單一、可靠的呼叫。

如何使用 IronPDF 將 HTML 渲染為 PDF?

以下範例渲染了同樣在 iText 中引起失敗的發票 HTML。 注意沒有任何解決方法,無需預置空段落,不需要處理靜默失敗:

using IronPdf;

ChromePdfRenderer renderer = new ChromePdfRenderer();

// Configure rendering options for production use
renderer.RenderingOptions.MarginTop = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;

string html = @"<div style='font-family: Arial; width: 100%;'>
    <h1 style='color: #2e6c80;'>Invoice #12345</h1>
    <table style='width: 100%; border-collapse: collapse;'>
        <tr>
            <th style='border: 1px solid #ddd; padding: 8px;'>Item</th>
            <th style='border: 1px solid #ddd; padding: 8px;'>Price</th>
        </tr>
        <tr>
            <td style='border: 1px solid #ddd; padding: 8px;'>Service</td>
            <td style='border: 1px solid #ddd; padding: 8px;'>$100.00</td>
        </tr>
    </table>
</div>";

PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");
using IronPdf;

ChromePdfRenderer renderer = new ChromePdfRenderer();

// Configure rendering options for production use
renderer.RenderingOptions.MarginTop = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;

string html = @"<div style='font-family: Arial; width: 100%;'>
    <h1 style='color: #2e6c80;'>Invoice #12345</h1>
    <table style='width: 100%; border-collapse: collapse;'>
        <tr>
            <th style='border: 1px solid #ddd; padding: 8px;'>Item</th>
            <th style='border: 1px solid #ddd; padding: 8px;'>Price</th>
        </tr>
        <tr>
            <td style='border: 1px solid #ddd; padding: 8px;'>Service</td>
            <td style='border: 1px solid #ddd; padding: 8px;'>$100.00</td>
        </tr>
    </table>
</div>";

PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Configure rendering options for production use
renderer.RenderingOptions.MarginTop = 40
renderer.RenderingOptions.MarginBottom = 40
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
renderer.RenderingOptions.PrintHtmlBackgrounds = True

Dim html As String = "<div style='font-family: Arial; width: 100%;'>" & _
    "<h1 style='color: #2e6c80;'>Invoice #12345</h1>" & _
    "<table style='width: 100%; border-collapse: collapse;'>" & _
        "<tr>" & _
            "<th style='border: 1px solid #ddd; padding: 8px;'>Item</th>" & _
            "<th style='border: 1px solid #ddd; padding: 8px;'>Price</th>" & _
        "</tr>" & _
        "<tr>" & _
            "<td style='border: 1px solid #ddd; padding: 8px;'>Service</td>" & _
            "<td style='border: 1px solid #ddd; padding: 8px;'>$100.00</td>" & _
        "</tr>" & _
    "</table>" & _
"</div>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("invoice.pdf")
$vbLabelText   $csharpLabel

IronPDF 輸出是什麼樣的?

乾淨整齊的專業發票 PDF,顯示發票 #12345,正確格式的兩列表格,包含項目與價格標頭,展示 IronPDF 穩定的 HTML 表格渲染而不出現解析錯誤或格式問題

這種方法為什麼能消除解析錯誤?

此程式碼成功建立了 PDF 文件而不帶有任何例外。 該方法自動處理複雜的 HTML 和 CSS,消除了對解決方法的需求。 內容呈現出來的效果達到像素完美,與瀏覽器預覽相匹配。 IronPDF 還支援 非同步渲染、自訂邊距和 PDF 壓縮以優化文件大小。

對於涉及大量 JavaScript 的內容或單頁應用程式,IronPDF 的 RenderDelay 選擇讓 JavaScript 在 PDF 被截取前執行 - 這是 XMLWorker 完全無法做到的。 以下範例新增了適合生產環境的非同步模式中的標頭、頁腳和安全設定:

using IronPdf;
using Microsoft.Extensions.Logging;

// Production-ready PDF generation with IronPDF
public class PdfGenerator
{
    private readonly ChromePdfRenderer _renderer;
    private readonly ILogger<PdfGenerator> _logger;

    public PdfGenerator(ILogger<PdfGenerator> logger)
    {
        _logger = logger;
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.Timeout = 60;
        _renderer.RenderingOptions.EnableJavaScript = true;
        _renderer.RenderingOptions.RenderDelay = 2000;
        _renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
        {
            Height = 25,
            HtmlFragment = "<div style='text-align: center;'>{page} of {total-pages}</div>"
        };
    }

    public async Task<PdfDocument> GenerateWithRetry(string html, int maxRetries = 3)
    {
        for (int i = 0; i < maxRetries; i++)
        {
            try
            {
                _logger.LogInformation("Generating PDF, attempt {Attempt}", i + 1);
                return await _renderer.RenderHtmlAsPdfAsync(html);
            }
            catch (Exception ex)
            {
                _logger.LogWarning("PDF generation failed: {Message}", ex.Message);
                if (i == maxRetries - 1) throw;
                await Task.Delay(1000 * (i + 1));
            }
        }
        throw new InvalidOperationException("PDF generation failed after retries");
    }
}
using IronPdf;
using Microsoft.Extensions.Logging;

// Production-ready PDF generation with IronPDF
public class PdfGenerator
{
    private readonly ChromePdfRenderer _renderer;
    private readonly ILogger<PdfGenerator> _logger;

    public PdfGenerator(ILogger<PdfGenerator> logger)
    {
        _logger = logger;
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.Timeout = 60;
        _renderer.RenderingOptions.EnableJavaScript = true;
        _renderer.RenderingOptions.RenderDelay = 2000;
        _renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
        {
            Height = 25,
            HtmlFragment = "<div style='text-align: center;'>{page} of {total-pages}</div>"
        };
    }

    public async Task<PdfDocument> GenerateWithRetry(string html, int maxRetries = 3)
    {
        for (int i = 0; i < maxRetries; i++)
        {
            try
            {
                _logger.LogInformation("Generating PDF, attempt {Attempt}", i + 1);
                return await _renderer.RenderHtmlAsPdfAsync(html);
            }
            catch (Exception ex)
            {
                _logger.LogWarning("PDF generation failed: {Message}", ex.Message);
                if (i == maxRetries - 1) throw;
                await Task.Delay(1000 * (i + 1));
            }
        }
        throw new InvalidOperationException("PDF generation failed after retries");
    }
}
Imports IronPdf
Imports Microsoft.Extensions.Logging

' Production-ready PDF generation with IronPDF
Public Class PdfGenerator
    Private ReadOnly _renderer As ChromePdfRenderer
    Private ReadOnly _logger As ILogger(Of PdfGenerator)

    Public Sub New(logger As ILogger(Of PdfGenerator))
        _logger = logger
        _renderer = New ChromePdfRenderer()
        _renderer.RenderingOptions.Timeout = 60
        _renderer.RenderingOptions.EnableJavaScript = True
        _renderer.RenderingOptions.RenderDelay = 2000
        _renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
            .Height = 25,
            .HtmlFragment = "<div style='text-align: center;'>{page} of {total-pages}</div>"
        }
    End Sub

    Public Async Function GenerateWithRetry(html As String, Optional maxRetries As Integer = 3) As Task(Of PdfDocument)
        For i As Integer = 0 To maxRetries - 1
            Try
                _logger.LogInformation("Generating PDF, attempt {Attempt}", i + 1)
                Return Await _renderer.RenderHtmlAsPdfAsync(html)
            Catch ex As Exception
                _logger.LogWarning("PDF generation failed: {Message}", ex.Message)
                If i = maxRetries - 1 Then Throw
                Await Task.Delay(1000 * (i + 1))
            End Try
        Next
        Throw New InvalidOperationException("PDF generation failed after retries")
    End Function
End Class
$vbLabelText   $csharpLabel

可靠 PDF 生成的最佳解決方案是什麼?

比較用於 HTML 到 PDF 轉換的兩個程式庫時,能力上的差異直接影響了 PDF 的質量和部署的可靠性:

特點比較:iText 與 XMLWorker vs. IronPDF
功能 iText + XMLWorker IronPDF
現代 HTML/CSS 支援 有限(HTML 4,CSS 2) 完整(Chrome 渲染引擎)
JavaScript 執行
錯誤處理 解析例外普遍 可靠的渲染
複雜表格 經常失敗 完整支持
自訂字型 需要手動嵌入 自動處理
SVG 支援
非同步渲染
Docker/Linux 支援 有限 完全原生支援
CSS 媒體型別 基本 螢幕和列印
偵錯工具 有限 Chrome DevTools 整合

如何從 iText 遷移到 IronPDF?

對於經歷"文件沒有頁面"錯誤的開發人員,遷移到 IronPDF 提供了立即的解決方案。 轉換過程很簡單,IronPDF 提供了完整的文件程式碼範例。 以下的事前與事後比較顯示了復雜度的減少:

// Before (iTextSharp) -- error-prone approach requiring workarounds
public byte[] CreatePdfWithIText(string htmlContent)
{
    using var ms = new MemoryStream();
    var document = new Document();
    var writer = PdfWriter.GetInstance(document, ms);
    document.Open();

    // Must add empty paragraph to avoid "no pages" error
    document.Add(new Paragraph(""));

    try
    {
        using var sr = new StringReader(htmlContent);
        XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr);
    }
    catch (Exception ex)
    {
        document.Add(new Paragraph("Error: " + ex.Message));
    }

    document.Close();
    return ms.ToArray();
}

// After (IronPDF) -- reliable, no workarounds needed
public byte[] CreatePdfWithIron(string htmlContent)
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.RenderDelay = 500;

    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
    return pdf.BinaryData;
}
// Before (iTextSharp) -- error-prone approach requiring workarounds
public byte[] CreatePdfWithIText(string htmlContent)
{
    using var ms = new MemoryStream();
    var document = new Document();
    var writer = PdfWriter.GetInstance(document, ms);
    document.Open();

    // Must add empty paragraph to avoid "no pages" error
    document.Add(new Paragraph(""));

    try
    {
        using var sr = new StringReader(htmlContent);
        XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr);
    }
    catch (Exception ex)
    {
        document.Add(new Paragraph("Error: " + ex.Message));
    }

    document.Close();
    return ms.ToArray();
}

// After (IronPDF) -- reliable, no workarounds needed
public byte[] CreatePdfWithIron(string htmlContent)
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.RenderDelay = 500;

    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
    return pdf.BinaryData;
}
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.tool.xml

Public Class PdfCreator

    ' Before (iTextSharp) -- error-prone approach requiring workarounds
    Public Function CreatePdfWithIText(htmlContent As String) As Byte()
        Using ms As New MemoryStream()
            Dim document As New Document()
            Dim writer As PdfWriter = PdfWriter.GetInstance(document, ms)
            document.Open()

            ' Must add empty paragraph to avoid "no pages" error
            document.Add(New Paragraph(""))

            Try
                Using sr As New StringReader(htmlContent)
                    XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr)
                End Using
            Catch ex As Exception
                document.Add(New Paragraph("Error: " & ex.Message))
            End Try

            document.Close()
            Return ms.ToArray()
        End Using
    End Function

    ' After (IronPDF) -- reliable, no workarounds needed
    Public Function CreatePdfWithIron(htmlContent As String) As Byte()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.EnableJavaScript = True
        renderer.RenderingOptions.RenderDelay = 500

        Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
        Return pdf.BinaryData
    End Function

End Class
$vbLabelText   $csharpLabel

什麼使得 IronPDF 的 API 更具開發者友好性?

簡化的 API 意味著更少的程式碼需要維護,並且沒有需要除錯的解析錯誤。 IronPDF 還提供了新增標頭和頁腳合併 PDF應用數位簽名等功能,無需複雜的解決方法。 對於在Docker 環境中工作或部署到 Linux 伺服器的團隊,IronPDF 提供跨平臺的一致行為。

NuGet 使用NuGet安裝

PM >  Install-Package IronPdf

查看在NuGet上的https://www.nuget.org/packages/IronPdf,快速安裝。超過1000萬次下載,正在用C#轉變PDF開發。 您也可以下載DLLWindows安裝程式

開始您的免費試用 體驗無錯誤的 HTML 到 PDF 轉換

您的下一步是什麼?

"文件沒有頁面"錯誤源於 iText 的 XMLWorker 內建的基本解析限制。 雖然存在解決方法 - 例如用空段落預填文件 - 但它們無法解決處理複雜 HTML 的根本問題。 IronPDF 的 Chrome-based 渲染提供了一個可靠的解決方案,能夠處理現代 Web 內容而不會出現解析例外。

對於需要從 HTML 穩定產生 PDF 的生產應用程式,IronPDF 消除了除錯解析器錯誤的煩惱,並提供了專業的結果。 引擎處理所有 HTML 元素、CSS 樣式和 JavaScript,確保文件每次都正確呈現。無論您是建立發票、報告,或任何包含文字、表格和圖像的文件,IronPDF 提供您所需要的解決方案。

若要繼續以下是推薦的下一步驟:

請注意iText 和 XMLWorker 是他們各自所有者的註冊商標。 本網站未經 iText 或 XMLWorker 認可。 所有產品名稱、徽標和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時的公開可用資訊。

常見問題

什麼原因導致iTextSharp HTML轉PDF「文件沒有頁面」錯誤?

iTextSharp中的「文件沒有頁面」錯誤是在HTML轉PDF過程中解析失敗,通常是因為HTML內容或不支持的功能問題。

是否有iTextSharp的替代方案可用於HTML轉PDF轉換?

是的,IronPDF為.NET應用提供了一個可靠的HTML轉PDF轉換解決方案,克服了iTextSharp中的許多限制。

IronPDF如何在HTML轉PDF轉換上與iTextSharp不同?

IronPDF提供了更全面的解析能力,支持更廣泛的HTML和CSS功能,降低了轉換錯誤(如無頁面錯誤)的可能性。

IronPDF可以將複雜的HTML文件轉換為PDF嗎?

IronPDF被設計用於處理複雜的HTML文件,包括高級CSS、JavaScript和多媒體元素,確保PDF輸出的準確性。

為什麼開發者應考慮使用IronPDF而非iTextSharp?

開發者可能會因為IronPDF易於使用、全面支持HTML和CSS,以及能夠在沒有常見錯誤的情況下生成高品質PDF而更喜歡使用IronPDF。

IronPDF在PDF轉換過程中是否支持JavaScript和CSS?

是的,IronPDF完全支持JavaScript、CSS和現代HTML5,確保原始HTML的視覺完整性在PDF輸出中得到維護。

我可以如何開始使用IronPDF進行HTML轉PDF轉換?

要開始使用IronPDF,您可以瀏覽其網站上的詳細教學和文件,提供一步步的實施指南。

使用IronPDF對.NET開發者有什麼好處?

IronPDF為.NET開發者提供了一個靈活的PDF生成工具,具有支持複雜HTML內容、易於整合和可靠性能的優勢。

IronPDF是否提供支援以解決PDF轉換錯誤?

是的,IronPDF提供豐富的支援資源,包括文件和支援團隊,以協助排除和解決PDF轉換過程中遇到的任何問題。

是否有辦法在購買前測試IronPDF的功能?

IronPDF提供免費試用版本,允許開發者在購買決策之前測試其功能並評估其性能。

Curtis Chau
技術作家

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

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

Iron 支援團隊

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