跳過到頁腳內容
產品比較

修復 iTextSharp 在 HTML 到 PDF 轉換中的“文檔沒有頁面”錯誤 | IronPDF

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

當 XMLWorker 無法解析 HTML 內容時,iTextSharp 會出現"文件沒有頁面"錯誤,但IronPDF 基於 Chrome 的渲染器透過像瀏覽器一樣處理 HTML 來消除此問題,從而提供可靠的 PDF 生成,而不會出現解析異常。

在 .NET 應用程式中,將 HTML 轉換為 PDF 是一個常見的需求,但使用 iTextSharp 的開發人員經常會遇到"文件沒有頁面"的錯誤。 當 PDF 文件產生過程失敗時,會出現此錯誤,導致開發人員需要尋找解決方案。 本分析探討了發生這種情況的原因以及如何使用IronPDF 的 HTML 轉 PDF 功能有效地解決它。

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

當 iTextSharp 的解析器無法將 HTML 內容處理成有效的 PDF 文件時,就會發生"文件沒有頁面"的異常。 此錯誤通常發生在文件關閉作業期間, Stack Overflow 上有許多關於此問題的討論貼文對此進行了詳細描述。 了解根本原因有助於開發人員根據自身需求選擇合適的 PDF 庫

發生此錯誤的原因是,XMLWorker(iTextSharp 的 HTML 解析元件)在遇到無法處理的 HTML 結構時會靜默失敗。 它不會在解析過程中引發異常,而是產生一個空文檔。 當文件關閉時,iTextSharp 偵測到沒有寫入任何內容,並拋出"文件沒有頁面"異常。 這種靜默故障模式使得偵錯特別令人沮喪,因為堆疊追蹤指向的是關閉操作,而不是實際的解析失敗。

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 偵錯控制台顯示"文件沒有頁面"錯誤訊息,粉紅色標題位於深色背景上,並顯示堆疊追蹤詳細資訊以及在 PDF 生成過程中 HTML 解析失敗時發生的 iTextSharp XMLWorker 異常。

這段程式碼嘗試從 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 文件,其中包含"Hello, World!"標題、"Draft version"標題和測試內容,表明 XMLWorker 在實施空段落變通方案後成功渲染了 HTML,從而避免了"文件沒有頁面"錯誤。

為什麼複雜的HTML元素仍然無法渲染?

新增一個空白段落可以避免立即出現錯誤,但包含表格元素、圖像或自訂字體的複雜 HTML 經常無法正確渲染。 產生的PDF文件中可能缺少內容或格式錯誤。 開發人員在處理具有嵌入式樣式、超連結元素或特定寬度屬性的 HTML 時會遇到相同的問題。 空引用和缺失元素渲染會引發其他問題,需要進一步解決。

XMLWorker 的設計初衷是處理 HTML 4 和基本 CSS 2 的子集。現代網頁經常使用遠超此範圍的功能:CSS Grid、Flexbox、CSS 變數、表達式、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 無tSupportedException("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 無tSupportedException("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

iTextSharp 處理此發票時會發生什麼事?

此基本發票 PDF 文件顯示了發票 #12345,採用簡單的表格格式,包含一項價值 100 美元的服務項目,展示了 iTextSharp 有限的 CSS 樣式功能以及 XMLWorker 成功處理簡單 HTML 結構時的基本表格渲染效果。

當 iTextSharp 處理此發票範本時,輸出結果通常會遺失 CSS 樣式、背景顏色和表格邊框。 查詢 @media print 將被忽略,任何 Web 字型參考都會導致靜默解析失敗。 如果 HTML 中包含 XMLWorker 無法辨識的 CSS 屬性,則整個區塊可能無法渲染-導致內容缺失,且在解析時不會拋出任何錯誤。

IronPDF 如何渲染同一張發票?

專業發票 PDF 文件 #12345 使用 IronPDF 渲染,保留了 CSS 樣式,表格格式正確,包含 100 美元的服務項目,並且"查看條款"超連結功能正常,這證明了 Chrome 渲染引擎相比 XMLWorker 具有更優越的 HTML/CSS 支援。

為什麼這些 HTML 元素會導致 iTextSharp 出現問題?

使用 iTextSharp 的 XMLWorker 時,由於表格樣式、寬度屬性或字型規格的原因,此發票可能會失敗。 當不支援這些元素時,通常會出現"文件沒有頁面"錯誤。 超連結和媒體查詢引用也可能無法正確呈現。 在商業應用中實現數位簽章或頁碼等進階 PDF 功能時,這些限制就顯得至關重要了。

根據Mozilla 開發者網路關於 CSS 的文檔,現代 CSS 包含數百個瀏覽器原生支援的屬性和值。 XMLWorker 僅涵蓋其中的一小部分,這就是為什麼現實世界的 Web 內容經常觸發解析失敗的原因。

如何處理HTML到PDF的轉換而不會出現解析錯誤?

IronPDF使用基於 Chrome 的渲染引擎,能夠完全按照 HTML 在網頁瀏覽器中的顯示方式進行處理。 這種方法可以消除解析錯誤,並支援所有現代 HTML 和 CSS 功能。 您可以查閱ChromePdfRenderer API 參考文檔,以取得完整的設定選項清單。 Chrome 引擎支援 JavaScript 執行、Web 字型和響應式佈局,而 XMLWorker 無法處理這些功能。

如何透過 NuGet 安裝 IronPDF?

在編寫任何程式碼之前,請先安裝 IronPDF NuGet 套件。 您可以透過 .NET CLI 執行此操作:

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

或從 Visual Studio 中的 NuGet 套件管理器控制台:

Install-Package IronPdf
Install-Package IronPdf
SHELL

安裝完成後,您就可以使用 ChromePdfRenderer,它將整個 iTextSharp + XMLWorker 管道替換為可靠的呼叫。

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

以下範例渲染了與 iTextSharp 中導致故障的相同發票 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 選項允許在捕獲 PDF 之前執行 JavaScript——這是 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的品質和部署可靠性:

功能對比:iTextSharp(附 XMLWorker)與 IronPDF
特點 iTextSharp + XMLWorker IronPDF
現代 HTML/CSS 支持 有限(HTML 4,CSS 2) 完整版(Chrome渲染引擎)
JavaScript 執行
錯誤處理 常見的解析異常 可靠渲染
複雜表 經常失敗 全面支援
自定義字體 需要手動嵌入 自動處理
SVG 支援
非同步渲染
Docker/Linux 支持 限額 完全原生支援
CSS媒體類型 基本 螢幕和印刷
偵錯工具 限額 Chrome DevTools 集成

如何從 iTextSharp 遷移到 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 可在各個平台上提供一致的行為。

!{--010011000100100101000010010100100100000101010010010110010101111101001110010101010101010101010101010101010101010 0100010111110100100101001101010100010000010100110001001100010111110100001001001100010011110010101010

立即開始免費試用,體驗無誤的HTML 轉 PDF 轉換

下一步計劃是什麼?

"文件沒有頁面"錯誤源自於 iTextSharp 的 XMLWorker 內建的基本解析限制。 雖然有一些變通方法——例如預先在文件中填充一個空段落——但它們並不能解決複雜的 HTML 處理這一根本問題。 IronPDF 基於 Chrome 的渲染提供了一個可靠的解決方案,可以處理現代 Web 內容而不會出現解析異常。

對於需要從 HTML 產生一致 PDF 的生產應用程式,IronPDF 可消除調試解析器錯誤的挫折感,並提供專業的結果。 此引擎負責處理所有 HTML 元素、CSS 樣式和 JavaScript,確保文件每次都能正確渲染。無論您是建立發票、報告,還是任何包含文字、表格和圖像的文檔,IronPDF 都能提供您所需的解決方案。

為了繼續推進,建議採取以下後續步驟:

請注意iTextSharp 和 XMLWorker 是其各自所有者的註冊商標。 本網站與 iTextSharp 或 XMLWorker 無任何關聯,也未獲得其認可或贊助。 所有產品名稱、標誌和品牌均為其各自擁有者的財產。 比較僅供參考,反映了撰寫時的公開信息。

常見問題解答

是什麼導致 iTextSharp HTML to PDF 'the document has no pages' 錯誤?

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 而非 iTextSharp,因為它易於使用,完全支援 HTML 和 CSS,並且能夠生成高質量的 PDF,沒有常見錯誤。

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

是的,IronPDF 完全支持 JavaScript、CSS 和現代 HTML5,确保在 PDF 輸出中保持原始 HTML 的视觉完整性。

如何開始使用 IronPDF 進行 HTML 至 PDF 的轉換?

若要開始使用 IronPDF,您可以探索其網站上提供的詳細教學和說明文件,這些文件提供了分步實施的指南。

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

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

IronPDF 是否提供任何 PDF 轉換錯誤的疑難排解支援?

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

在購買之前,有沒有辦法測試 IronPDF 的功能?

IronPDF 提供免費試用版本,讓開發人員在做出購買決定之前,可以測試其功能並評估其效能。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

鋼鐵支援團隊

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