C# 如何将PDF从iTextSharp 5.x XML呈现到ASP.NET

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

我已经找到了使用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
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。我明白了,这就是原因。