PDFsharp 保存到 MemoryStream
Posted
技术标签:
【中文标题】PDFsharp 保存到 MemoryStream【英文标题】:PDFsharp save to MemoryStream 【发布时间】:2010-11-07 13:55:21 【问题描述】:我想通过其 Save 方法将 PdfSharp.Pdf.PdfDocument 保存到 Stream,但它没有将 PDF 标题设置附加到它。因此,当我读回 Stream 并将其返回给用户时,他看到 PDF 文件无效。 PDFsharp保存到内存时是否有附加PDF标题设置的解决方案?
【问题讨论】:
【参考方案1】:所以解决办法:
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);
PdfSharp 附带了这个 MigraDoc 的东西,但我几乎没有找到任何合适的文档/常见问题解答。经过数小时的谷歌搜索,我发现了一个类似这样的 sn-p。现在可以了。
【讨论】:
什么是 pDoc?和doc一样吗? 它对我有用:pdfRenderer.Document = doc; pdfRenderer.RenderDocument(); pdfRenderer.PdfDocument.Save(stream);【参考方案2】:如果您认为 PdfDocument.Save 存在问题,请在 PDFsharp 论坛上报告此问题(但请更具体地说明您的错误描述)。 你的“解决方案”对我来说就像一个黑客。 “pdfRenderer.Save”在内部调用“PdfDocument.Save”。 无论问题是什么 - 您的“解决方案”仍然调用相同的保存例程。
编辑: 要获取包含 PDF 文件的 byte[],您只需调用:
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[]
和长度参数的方法非常有用。
【讨论】:
【参考方案3】:我找到了更简单的解决方案:
byte[] fileContents = null;
using(MemoryStream stream = new MemoryStream())
pdfDoc.Save(stream, true);
fileContents = stream.ToArray();
来源: http://usefulaspandcsharp.wordpress.com/2010/03/09/save-a-pdf-to-a-byte-array-using-pdf-sharpmigradoc/
【讨论】:
我的回答显示自 2010 年以来可以使用ToArray()
。 ;-)【参考方案4】:
对于 MigraDoc (ver 1.30),我可以用
保存它PdfDocumentRenderer 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
【讨论】:
【参考方案5】:感谢 Misnyo 解决方案。但对我来说,它是这样工作的:
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;
【讨论】:
以上是关于PDFsharp 保存到 MemoryStream的主要内容,如果未能解决你的问题,请参考以下文章
MemoryStream 到 HttpResponseMessage
将 MemoryStream 文件存储到 Azure Blob
将 iTextSharp 文档加载到 MemoryStream
将文件从 MemoryStream 附加到 C# 中的 MailMessage