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.
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
當此錯誤發生時,控制台輸出顯示什麼?

此程式碼嘗試從 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
使用這個解決方法,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
您如何在沒有同樣錯誤的情況下轉換現代 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>
當 iText 處理此發票時會發生什麼?

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

為什麼這些 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")
IronPDF 輸出是什麼樣的?

這種方法為什麼能消除解析錯誤?
此程式碼成功建立了 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
可靠 PDF 生成的最佳解決方案是什麼?
比較用於 HTML 到 PDF 轉換的兩個程式庫時,能力上的差異直接影響了 PDF 的質量和部署的可靠性:
| 功能 | 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
什麼使得 IronPDF 的 API 更具開發者友好性?
簡化的 API 意味著更少的程式碼需要維護,並且沒有需要除錯的解析錯誤。 IronPDF 還提供了新增標頭和頁腳、合併 PDF 和 應用數位簽名等功能,無需複雜的解決方法。 對於在Docker 環境中工作或部署到 Linux 伺服器的團隊,IronPDF 提供跨平臺的一致行為。
開始您的免費試用 體驗無錯誤的 HTML 到 PDF 轉換。
您的下一步是什麼?
"文件沒有頁面"錯誤源於 iText 的 XMLWorker 內建的基本解析限制。 雖然存在解決方法 - 例如用空段落預填文件 - 但它們無法解決處理複雜 HTML 的根本問題。 IronPDF 的 Chrome-based 渲染提供了一個可靠的解決方案,能夠處理現代 Web 內容而不會出現解析例外。
對於需要從 HTML 穩定產生 PDF 的生產應用程式,IronPDF 消除了除錯解析器錯誤的煩惱,並提供了專業的結果。 引擎處理所有 HTML 元素、CSS 樣式和 JavaScript,確保文件每次都正確呈現。無論您是建立發票、報告,或任何包含文字、表格和圖像的文件,IronPDF 提供您所需要的解決方案。
若要繼續以下是推薦的下一步驟:
- 透過 NuGet 安裝 IronPDF(
dotnet add package IronPdf)並運行 快速入門指南 - 查看 HTML 到 PDF 教程了解渲染選項的完整指南
- 探索 ChromePdfRenderer API 參考配置邊距、標頭、JavaScript 等待時間和安全設置
- 檢查 iText vs. IronPDF 比較了解庫的詳細差異
- 查看故障排除指南以便為高容量負載優化輸出
- 對於雲部署,請參閱 Azure 和 Docker 設置指南
常見問題
什麼原因導致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提供免費試用版本,允許開發者在購買決策之前測試其功能並評估其性能。



