IRONSOFTWAREHOME
PDF工具

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

Curtis Chau
Curtis Chau
Updated: 2026年6月20日

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");
}

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

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();
    }
}

使用這個解決方法,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");
}
C#

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

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

<!-- Invoice HTML with modern styling -->
<!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 程式包管理器控制台:

PM > 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");

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");
    }
}

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

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

特點比較:iText 與 XMLWorker vs. IronPDF
功能iText + XMLWorkerIronPDF
現代 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;
}

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

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

NuGetInstall with NuGet

PM > Install-Package IronPdf

Install IronPDF by running the command above in the NuGet Package Manager Console, or search for the package in the NuGet Package Manager.

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

您的下一步是什麼?

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

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

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

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

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...
Read More

Related Articles

Key in blue circle

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

bullet_checked無需信用卡或建立帳號
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預訂您的免費現場演示
Booking Badge related to IronPDF Product Demo

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

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