C# 如何使用iText 7将PDF写入HttpResponseMessage

C# 如何使用iText 7将PDF写入HttpResponseMessage,c#,pdf-generation,itext7,C#,Pdf Generation,Itext7,我正在尝试生成一个PDF,并使用iText 7和iText7.pdfHtml库将其写入HTTP响应 PDF的HTML内容存储在StringBuilder对象中 不确定这样做的正确过程是什么,因为只要我使用HtmlConverter.ConvertToPdf,内存流就会关闭,我无法访问字节。我得到以下例外情况: System.ObjectDisposedException:无法访问封闭流 HttpResponseMessage HttpResponseMessage=新的HttpResponseM

我正在尝试生成一个PDF,并使用iText 7和iText7.pdfHtml库将其写入HTTP响应

PDF的HTML内容存储在
StringBuilder
对象中

不确定这样做的正确过程是什么,因为只要我使用
HtmlConverter.ConvertToPdf
内存流就会关闭,我无法访问字节。我得到以下例外情况:

System.ObjectDisposedException:无法访问封闭流

HttpResponseMessage HttpResponseMessage=新的HttpResponseMessage();
StringBuilder htmlText=新的StringBuilder();
附加(“你好,世界!”);
使用(MemoryStream MemoryStream=new MemoryStream())
{
使用(PdfWriter PdfWriter=新PdfWriter(memoryStream))
{
PdfDocument PdfDocument=新的PdfDocument(pdfWriter);
文件=新文件(PDF文件);
字符串headerText=“我的标题”;
string footerText=“我的页脚”;
pdfDocument.AddEventHandler(PdfDocumentEvent.END_页面,新的HeaderFooterEventHandler(文档,headerText,footerText));
HtmlConverter.ConvertToPdf(htmlText.ToString(),pdfWriter);
memoryStream.Flush();
memoryStream.Seek(0,SeekOrigin.Begin);
字节[]字节=新字节[memoryStream.Length];
memoryStream.Read(字节,0,(int)memoryStream.Length);
流=新内存流(字节);
httpResponseMessage.Content=新的流内容(流);
httpResponseMessage.Content.Headers.ContentType=MediaTypeHeaderValue.Parse(“应用程序/pdf”);
httpResponseMessage.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“sample.pdf”
};
httpResponseMessage.StatusCode=HttpStatusCode.OK;
}//使用pdfwriter结束
}//结束使用内存流
编辑
添加了
PdfDocument
Document
对象来操作页眉/页脚和新页面。

利用您拥有
内存流的事实,并替换

    memoryStream.Flush();
    memoryStream.Seek(0, SeekOrigin.Begin);

    byte[] bytes = new byte[memoryStream.Length];
    memoryStream.Read(bytes, 0, (int)memoryStream.Length);


该方法也可用于封闭内存流

memoryStream.ToArray()
工作正常,操作返回了一个好看的PDF文件。但是当我添加
PdfDocument
Document
对象来操作页眉/页脚时,我得到的是一个糟糕的PDF。由于文件损坏,阅读器无法打开返回的PDF。我看不到您的代码关闭
PdfDocument
。因此,结果尚未完成。在
ConvertToPdf
之后关闭它。这是我在添加
PdfDocument.Close()
后得到的结果:
iText.Kernel.PdfException:Pdf间接对象属于其他Pdf文档。将对象复制到当前pdf文档。
由于某种原因,此操作有效
HtmlConverter.ConvertToDocument(htmlText.ToString(),pdfDocument,new ConverterProperties())
而不是
HtmlConverter.ConvertToPdf(htmlText.ToString(),pdfWriter)确定。我假设pdf writer的重载会在内部创建它自己的
PdfDocument
,在同一个writer上工作的两个
PdfDocument
实例可能会导致问题。
    memoryStream.Flush();
    memoryStream.Seek(0, SeekOrigin.Begin);

    byte[] bytes = new byte[memoryStream.Length];
    memoryStream.Read(bytes, 0, (int)memoryStream.Length);
byte[] bytes = memoryStream.ToArray();