我想通过PdfSharp.Pdf.PdfDocument的Save方法将其保存到Stream中,但它没有将PDF头设置附加到其中。 因此,当我读取回Stream并将其返回给用户时,他会发现PDF文件无效。 当PDFsharp保存到内存时,是否有一种解决方案可以附加PDF头设置?
MemoryStream stream = new MemoryStream();
document.Save(stream, false);
byte[] bytes = stream.ToArray();
早期版本的PDFsharp不会重置数据流位置。
因此,您需要调用
ms.Seek(0, SeekOrigin.Begin);
在读取流之前重置流位置的操作已经不再需要,只有在使用当前版本之前才需要这样做。
使用 ToArray 方法通常可以替代从流中读取数据。
编辑2: 可以使用 stream.GetBuffer()
替代 stream.ToArray()
,但是这个缓冲区通常比 PDF 文件更大,您只需要使用那个缓冲区的 stream.Length
字节。对于需要同时使用 byte[]
和长度参数的方法非常有用。
所以解决方案:
MigraDoc.DocumentObjectModel.Document doc = new MigraDoc.DocumentObjectModel.Document();
MigraDoc.Rendering.DocumentRenderer renderer = new DocumentRenderer(doc);
MigraDoc.Rendering.PdfDocumentRenderer pdfRenderer = new MigraDoc.Rendering.PdfDocumentRenderer();
pdfRenderer.PdfDocument = pDoc;
pdfRenderer.DocumentRenderer = renderer;
using (MemoryStream ms = new MemoryStream())
{
pdfRenderer.Save(ms, false);
byte[] buffer = new byte[ms.Length];
ms.Seek(0, SeekOrigin.Begin);
ms.Flush();
ms.Read(buffer, 0, (int)ms.Length);
}
有一个叫做MigraDoc的东西,它是与PdfSharp一起使用的,但是我几乎找不到任何合适的文档/常见问题解答。经过几个小时的谷歌搜索,我找到了一个类似于这样的代码片段。现在它可以工作了。
我找到了更简单的解决方案:
byte[] fileContents = null;
using(MemoryStream stream = new MemoryStream())
{
pdfDoc.Save(stream, true);
fileContents = stream.ToArray();
}
ToArray()
。;-) - I liked the old Stack OverflowPdfDocumentRenderer renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always);
renderer.Document = report.m_Document;
renderer.RenderDocument();
using (MemoryStream stream = new MemoryStream())
{
renderer.PdfDocument.Save(stream, false);
... your code in here
}
谢谢Misnyo Solution。但对我来说,它是这样工作的:
Document document = new Document();
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
//Add to document here.......
//render the document with pdf renderer
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
//Save renderer result into stream
using(MemoryStream ms = new MemoryStream())
{
pdfRenderer.PdfDocument.Save(ms, false);
byte[] buffer = new byte[ms.Length];
ms.Seek(0, SeekOrigin.Begin);
ms.Flush();
ms.Read(buffer, 0, (int)ms.Length);
ms.Position = 0;
}