44

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

4

5 回答 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(); 
}

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

于 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 回答