PdfSharp.Pdf.PdfDocumentをSaveメソッドでストリームに保存したいのですが、PDFヘッダー設定が添付されていません。そのため、ストリームを読み込んで返すとPDFファイルが無効です。PDFsharpがメモリに保存するときにPDFヘッダー設定を添付する解決策はありますか?
したがって、ソリューション:
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はほとんど見つかりません。グーグルで何時間も過ごした後、このようなスニペットを見つけました。今では動作します。
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[]
_を受け取るメソッドに非常に役立ちます。
私はより簡単な解決策を見つけました:
byte[] fileContents = null;
using(MemoryStream stream = new MemoryStream())
{
pdfDoc.Save(stream, true);
fileContents = stream.ToArray();
}
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
}