PDFsharp保存到MemoryStream

mis*_*nyo 31 .net c# pdf stream pdfsharp

我想通过Save方法将PdfSharp.Pdf.PdfDocument保存到Stream,但它不会将PDF标头设置附加到它.因此,当我回读Stream并将其返回给用户时,他看到PDF文件无效.当PDFsharp保存到内存时,是否有附加PDF标头设置的解决方案?

Je *_*not 41

如果您认为PdfDocument.Save存在问题,请在PDFsharp论坛上报告(但请更具体地说明您的错误说明).你的"解决方案"对我来说就像是一个黑客."pdfRenderer.Save"在内部调用"PdfDocument.Save".无论问题是什么 - 您的"解决方案"仍然会调用相同的Save例程.

编辑:要获得包含PDF文件的byte [],您只需调用:

MemoryStream stream = new MemoryStream();
document.Save(stream, false);
byte[] bytes = stream.ToArray();
Run Code Online (Sandbox Code Playgroud)

早期版本的PDFsharp不会重置流位置.

所以你必须打电话

ms.Seek(0, SeekOrigin.Begin); 
Run Code Online (Sandbox Code Playgroud)

在从流中读取之前重置流位置; 当前版本不再需要此功能.

通常可以使用ToArray而不是从流中读取.

编辑2:而不是使用stream.ToArray()它可能更有效stream.GetBuffer(),但此缓冲区通常大于PDF文件,您只需使用stream.Length该缓冲区中的字节.对于byte[]带有长度参数的方法非常有用.


mis*_*nyo 26

所以解决方案:

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);
}
Run Code Online (Sandbox Code Playgroud)

有这个MigraDoc的东西与PdfSharp一起提供,但我几乎找不到任何适当的doc/faq.经过几个小时的谷歌搜索后,我发现了一个类似这样的片段.现在它有效.

  • 什么是pDoc?这跟doc一样吗? (6认同)
  • 它对我有用:pdfRenderer.Document = doc; pdfRenderer.RenderDocument(); pdfRenderer.PdfDocument.Save(流); (2认同)

eCo*_*rke 12

我发现更简单的解决方案:

byte[] fileContents = null; 
using(MemoryStream stream = new MemoryStream()) 
{ 
    pdfDoc.Save(stream, true); 
    fileContents = stream.ToArray(); 
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http: //usefulaspandcsharp.wordpress.com/2010/03/09/save-a-pdf-to-a-byte-array-using-pdf-sharpmigradoc/

  • 我的回答显示自 2010 年以来可以使用 `ToArray()`。;-) (2认同)

Ale*_*x G 6

对于MigraDoc(版本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

}
Run Code Online (Sandbox Code Playgroud)