web-dev-qa-db-ja.com

PDFシャープをMemoryStreamに保存

PdfSharp.Pdf.PdfDocumentをSaveメソッドでストリームに保存したいのですが、PDFヘッダー設定が添付されていません。そのため、ストリームを読み込んで返すとPDFファイルが無効です。PDFsharpがメモリに保存するときにPDFヘッダー設定を添付する解決策はありますか?

30
misnyo

したがって、ソリューション:

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のものがありますが、適切なdoc/faqはほとんど見つかりません。グーグルで何時間も過ごした後、このようなスニペットを見つけました。今では動作します。

25
misnyo

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[]_を受け取るメソッドに非常に役立ちます。

41

私はより簡単な解決策を見つけました:

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/

12
eCorke

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

}
6
Alex G