C# 如何将PDF从iTextSharp 5.x XML呈现到ASP.NET
我已经找到了使用iTextSharp转换的视图。不幸的是,这是基于iTextSharp 4.x的,现在最新的版本是5.x,它放弃了对ITextHandler的支持 我试图将示例改写为iTextSharp 5.x。我相信我已经很接近了,但我没有经验完成它。我的代码有问题。它抛出异常:C# 如何将PDF从iTextSharp 5.x XML呈现到ASP.NET,c#,xml,asp.net-mvc,pdf,itextsharp,C#,Xml,Asp.net Mvc,Pdf,Itextsharp,我已经找到了使用iTextSharp转换的视图。不幸的是,这是基于iTextSharp 4.x的,现在最新的版本是5.x,它放弃了对ITextHandler的支持 我试图将示例改写为iTextSharp 5.x。我相信我已经很接近了,但我没有经验完成它。我的代码有问题。它抛出异常: An exception of type 'System.IO.IOException' occurred in itextsharp.dll but was not handled in user code Add
An exception of type 'System.IO.IOException' occurred
in itextsharp.dll but was not handled in user code
Additional information: The document has no pages.
以下是我对第条提供的代码的修改:
/// <summary>
/// Returns a PDF action result. This method renders the view to a string then
/// use that string to generate a PDF file. The generated PDF file is then
/// returned to the browser as binary content. The view associated with this
/// action should render an XML compatible with iTextSharp xml format.
/// </summary>
/// <param name="model">The model to send to the view.</param>
/// <returns>The resulted BinaryContentResult.</returns>
protected ActionResult ViewPdf(object model)
{
// Render the view xml to a string, then parse that string into an XML dom.
string xmltext = this.RenderActionResultToString(this.View(model));
using (MemoryStream outStream = new MemoryStream())
{
Document pdfDocument = new Document();
PdfWriter pdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(pdfDocument, outStream);
pdfDocument.Open();
//pdfDocument.Add(new Paragraph("Hello World!")); - this works
using (StringReader stringReader = new StringReader(xmltext))
{
//this does not works
XMLWorkerHelper.GetInstance().ParseXHtml(pdfWriter, pdfDocument, stringReader);
}
pdfDocument.Close();
pdfWriter.Flush();
byte[] buffer = outStream.ToArray();
// Send the binary data to the browser.
return new BinaryContentResult(buffer, "application/pdf");
}
}
//
///返回PDF操作结果。此方法将视图渲染为字符串,然后
///使用该字符串生成PDF文件。然后生成PDF文件
///作为二进制内容返回到浏览器。与此关联的视图
///操作应呈现与iTextSharp XML格式兼容的XML。
///
///要发送到视图的模型。
///结果为BinaryContentResult。
受保护的ActionResult视图PDF(对象模型)
{
//将视图xml呈现为字符串,然后将该字符串解析为xml dom。
string xmltext=this.renderActionResultString(this.View(model));
使用(MemoryStream outStream=新MemoryStream())
{
文档pdfDocument=新文档();
PdfWriter PdfWriter=iTextSharp.text.pdf.PdfWriter.GetInstance(pdfDocument,outStream);
pdfDocument.Open();
//添加(新段落(“Hello World!”);-这很有效
使用(StringReader StringReader=新StringReader(xmltext))
{
//这是行不通的
XMLWorkerHelper.GetInstance().ParseXHtml(pdfWriter、pdfDocument、stringReader);
}
pdfDocument.Close();
pdfWriter.Flush();
byte[]buffer=outStream.ToArray();
//将二进制数据发送到浏览器。
返回新的BinaryContentResult(缓冲区,“应用程序/pdf”);
}
}
最后我简化了观点:
@model int
@{
Layout = null;
}<?xml version="1.0" encoding="UTF-8" ?>
<itext creationdate="2/4/2003 5:49:07 PM" producer="iTextSharpXML">
<paragraph leading="18.0" font="unknown" size="16.0" align="Default">
<chunk>Generated PDF</chunk>
</paragraph>
<paragraph leading="18.0" font="unknown" size="10.0" align="Default">
<chunk>Hello wolrd: @Model</chunk><newline />
</paragraph>
</itext>
@model int
@{
布局=空;
}
生成的PDF
你好,沃尔德:@Model
代码的其余部分并不有趣,而是在中
问题在哪里?NET MVC部件工作时,XML中的视图被正确地生成为变量xmltext。问题是XMLWorkerHelper将字符串XML生成为字节。怎么了
更新:
问题在于,XHtml解析器期望的是HTML文件,而不是itext格式的XML文件,因为它在itextSharp 4.x和ITEXTDhandler中工作。您尝试使用的东西是基于互联网“XML非常棒”阶段创建的itext DTD。(我认为我们现在正处于JSON阶段。)无论如何,iText的DTD是专有的,它被放弃了,取而代之的是一个国际公认的、广泛使用的文档标记XML标准XHTML。更多信息请参见。我明白了,这就是原因。您尝试使用的东西基于iText的DTD,该DTD是在互联网的“xml非常棒”阶段创建的。(我认为我们现在正处于JSON阶段。)无论如何,iText的DTD是专有的,它被放弃了,取而代之的是一个国际公认的、广泛使用的文档标记XML标准XHTML。我明白了,这就是原因。