web-dev-qa-db-ja.com

PDFサムネイルを生成する(オープンソース/無料)

これについて他の投稿を見ると、私のニーズに合った適切な解決策を見つけることができませんでした。 PDFドキュメントの最初のページをサムネイルとして取得しようとしています。これはサーバーアプリケーションとして実行されるため、PDFドキュメントをファイルに書き込んでから、PDFを読み取る3番目のアプリケーションを呼び出してディスク上にイメージを生成することは望ましくありません。

doc = new PDFdocument("some.pdf");
page = doc.page(1);
Image image = page.image;

ありがとう。

26
AndrewB

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メソッド呼び出しを使用して、ファイル形式、ページサイズなどのオプションを指定することにより、それや他の多くのオプションを変更できます。

26
Peter

Microsoft.NETフレームワーク用のWindowsAPIコードパック が最も簡単なトリックだと思います。 Windowsエクスプローラーと同じサムネイル(つまり最初のページ)を生成できます。いくつかのサイズを選択できます。サイズは最大1024x1024なので、十分なはずです。 ShellObject.FromParsingName(filepath)を作成し、そのサムネイルサブクラスを見つけるだけです。

問題はサーバーが何であるかである可能性があります。これは、Windows 7、Windows Vista、およびWindows Server 2008で機能します。また、Windowsエクスプローラーはそのマシンでサムネイルを表示できる必要があります。それを保証する最も簡単な方法は、AdobeReaderをインストールすることです。これらすべてが問題にならないのであれば、これが最もエレガントな方法だと思います。

更新:Adobe Readerは最近のバージョンでサムネイルのサポートを終了したため、レガシーバージョンを使用する必要があります。

UPDATE2:Robertoのコメントによると、[編集]-[設定]-[一般]でサムネイルオプションをオンにすると、最新バージョンのAdobeReaderを引き続き使用できます。

19
Ivan Ičin

ダウンロード 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

1

http://www.codeproject.com/KB/cs/GhostScriptUseWithCSharp.aspx

これは非常にうまく機能します。唯一の依存関係は、GhostScriptのgsdll32.dll(これを取得するには、GhostScriptを個別にダウンロードする必要がありますが、本番環境にGhostScriptをインストールする必要はありません)と、プロジェクトに含まれているPDFSharp.dllです。

0
saille