我想通过其 Save 方法将 PdfSharp.Pdf.PdfDocument 保存到流中,但它没有将 PDF 标题设置附加到它。因此,当我读回 Stream 并将其返回给用户时,他看到 PDF 文件无效。当 PDFsharp 保存到内存时,是否有附加 PDF 标题设置的解决方案?
问问题
61893 次
5 回答
57
如果您认为 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.ToArray()
它可能更有效stream.GetBuffer()
,但是这个缓冲区通常比PDF文件大,你只需要使用stream.Length
那个缓冲区中的字节。byte[]
对于带有长度参数的方法非常有用。
于 2009-08-25T09:23:17.783 回答
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);
}
PdfSharp 附带了这个 MigraDoc 的东西,但我几乎没有找到任何合适的文档/常见问题解答。经过数小时的谷歌搜索,我发现了一个类似这样的片段。现在它起作用了。
于 2009-07-03T11:25:28.760 回答
20
我找到了更简单的解决方案:
byte[] fileContents = null;
using(MemoryStream stream = new MemoryStream())
{
pdfDoc.Save(stream, true);
fileContents = stream.ToArray();
}
于 2012-12-05T13:09:57.253 回答
7
对于 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
}
于 2015-02-12T17:26:34.290 回答
-2
感谢 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;
}
于 2018-12-13T17:45:07.793 回答