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.经过几个小时的谷歌搜索后,我发现了一个类似这样的片段.现在它有效.
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/
对于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)