これについて他の投稿を見ると、私のニーズに合った適切な解決策を見つけることができませんでした。 PDFドキュメントの最初のページをサムネイルとして取得しようとしています。これはサーバーアプリケーションとして実行されるため、PDFドキュメントをファイルに書き込んでから、PDFを読み取る3番目のアプリケーションを呼び出してディスク上にイメージを生成することは望ましくありません。
doc = new PDFdocument("some.pdf");
page = doc.page(1);
Image image = page.image;
ありがとう。
Matthew Ephraimは、Ghostscriptのオープンソースラッパーをリリースしました。これは、C#で実行しているように聞こえます。
ソースコードへのリンク: https://github.com/mephraim/ghostscriptsharp
ブログ投稿へのリンク: http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/
GeneratePageThumbメソッドを簡単に呼び出してサムネイルを生成できます(または、開始ページ番号と終了ページ番号を指定してGeneratePageThumbsを使用して、複数の個別のページのサムネイルを生成します。各ページは個別の出力ファイルです)。デフォルトのファイル形式はjpegですが、代替のGenerateOutputメソッド呼び出しを使用して、ファイル形式、ページサイズなどのオプションを指定することにより、それや他の多くのオプションを変更できます。
Microsoft.NETフレームワーク用のWindowsAPIコードパック が最も簡単なトリックだと思います。 Windowsエクスプローラーと同じサムネイル(つまり最初のページ)を生成できます。いくつかのサイズを選択できます。サイズは最大1024x1024なので、十分なはずです。 ShellObject.FromParsingName(filepath)を作成し、そのサムネイルサブクラスを見つけるだけです。
問題はサーバーが何であるかである可能性があります。これは、Windows 7、Windows Vista、およびWindows Server 2008で機能します。また、Windowsエクスプローラーはそのマシンでサムネイルを表示できる必要があります。それを保証する最も簡単な方法は、AdobeReaderをインストールすることです。これらすべてが問題にならないのであれば、これが最もエレガントな方法だと思います。
更新:Adobe Readerは最近のバージョンでサムネイルのサポートを終了したため、レガシーバージョンを使用する必要があります。
UPDATE2:Robertoのコメントによると、[編集]-[設定]-[一般]でサムネイルオプションをオンにすると、最新バージョンのAdobeReaderを引き続き使用できます。
ダウンロード PDFLibNet そして次のコードを使用します
public void ConvertPDFtoJPG(string filename, String dirOut)
{
PDFLibNet.PDFWrapper _pdfDoc = new PDFLibNet.PDFWrapper();
_pdfDoc.LoadPDF(filename);
for (int i = 0; i < _pdfDoc.PageCount; i++)
{
Image img = RenderPage(_pdfDoc, i);
img.Save(Path.Combine(dirOut, string.Format("{0}{1}.jpg", i,DateTime.Now.ToString("mmss"))));
}
_pdfDoc.Dispose();
return;
}
public Image RenderPage(PDFLibNet.PDFWrapper doc, int page)
{
doc.CurrentPage = page + 1;
doc.CurrentX = 0;
doc.CurrentY = 0;
doc.RenderPage(IntPtr.Zero);
// create an image to draw the page into
var buffer = new Bitmap(doc.PageWidth, doc.PageHeight);
doc.ClientBounds = new Rectangle(0, 0, doc.PageWidth, doc.PageHeight);
using (var g = Graphics.FromImage(buffer))
{
var hdc = g.GetHdc();
try
{
doc.DrawPageHDC(hdc);
}
finally
{
g.ReleaseHdc();
}
}
return buffer;
}
私はずっと前にimagemagick(Convert)でこの種のことをしていました。そのための.Netラッパーがあります。おそらくチェックする価値があります: http://imagemagick.codeplex.com/releases/view/30302
http://www.codeproject.com/KB/cs/GhostScriptUseWithCSharp.aspx
これは非常にうまく機能します。唯一の依存関係は、GhostScriptのgsdll32.dll(これを取得するには、GhostScriptを個別にダウンロードする必要がありますが、本番環境にGhostScriptをインストールする必要はありません)と、プロジェクトに含まれているPDFSharp.dllです。