12

1 ページの PDF ドキュメントを Web サイトのサムネイル用の画像として保存する必要があります。

私はPDFSharpをいじっていましたが、運がありませんでした.

私はこれを試しました: http://www.pdfsharp.net/wiki/ExportImages-sample.ashx?AspxAutoDetectCookieSupport=1しかし、PDFファイルに埋め込まれた画像を抽出するだけで、望ましい結果ではありません。

これを行う方法についてのアイデアはありますか?これを処理できる優れたライブラリを知っている人はいますか?

編集:なぜこれがそんなに悪い質問なのか教えてください. 誰かがこれに対する良い解決策を持っているなら、それは他の多くの人々にとって素晴らしいリソースになるでしょう. 特にGoogle検索は空になるので。

4

5 に答える 5

5

Ghostscript は現在、PDF をレンダリングするためのデファクト スタンダードです。GhostScriptSharp を使用しても、ラップするのは少し難しいです。

Jason Morse は、PDF をレンダリングするための優れた C# ラッパーを、オープンソースのimageresizing.net ライブラリのプラグインとして作成しました。

asp.net アプリケーションの場合、ライブラリはオンザフライ レンダリングを許可するため、クエリ文字列を追加するだけで jpeg/png バージョンを取得できます。

/pdfs/letter.pdf?format=jpg&page=2

代わりにマネージ API を使用することもできます (任意のアプリケーション タイプで - asp.net 固有ではありません)。

ImageBuilder.Current.Build("letter.pdf","dest.jpg",new ResizeSettings("format=jpg;page=2"));

PdfRenderer プラグインは、Ghostscript と同様に GPL ライセンスです。

于 2012-01-20T17:18:53.017 に答える
5

Ghostscript を見てください。それを使用してPDFを画像にレンダリングできます。

http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/

于 2012-01-09T04:12:13.170 に答える
2

ABCpdf は、C# を使用して PDF ドキュメントを JPEG にエクスポートします。参照: http://www.websupergoo.com/helppdfnet/source/4-examples/19-rendering.htm

于 2012-01-13T09:55:56.567 に答える
1

(免責事項: 私は Atalasoft で働いており、多くの PDF テクノロジを作成しています) Atalasoft dotImage でPdfDecoderを使用する場合、これは簡単です。

public void PdfToJpegThumb(Stream srcStream, int pageNo, int maxDimension, Stream dstStream)
{
    PdfDecoder decoder = new PdfDecoder();
    decoder.Resolution = 96; // reduce default resolution to speed up rendering
    // render page
    using (AtalaImage pdfimage = decoder.read(srcStream, pageNo, null)) {
        Thumbnail tn = new Thumbnail(maxDimension, maxDimension);
        // make a thumbnail image
        using (AtalaImage tnImage = tn.Create(pdfImage)) {
            // save it
            tnImage.Save(dstStream, new JpegEncoder(), null);
        }
    }
}
于 2012-01-10T15:43:54.047 に答える
0

私はこれをウェブ上のどこかから入手しました - どこからか正確に思い出せませんが、私にとってはうまくいきます!
私はそれを素晴らしい関数にしました。

GhostScript API (GSdll32.dll) を使用します

。imageFormat パラメータの例は、「jpeg」、「tiff32nc」などです。

    #region GhostScript API functions
    [DllImport("gsdll32.dll", EntryPoint = "gsapi_new_instance")]
    private static extern int CreateAPIInstance(out IntPtr pinstance,
                                            IntPtr caller_handle);

    [DllImport("gsdll32.dll", EntryPoint = "gsapi_init_with_args")]
    private static extern int InitAPI(IntPtr instance, int argc, IntPtr argv);

    [DllImport("gsdll32.dll", EntryPoint = "gsapi_exit")]
    private static extern int ExitAPI(IntPtr instance);

    [DllImport("gsdll32.dll", EntryPoint = "gsapi_delete_instance")]
    private static extern void DeleteAPIInstance(IntPtr instance);
    #endregion

    public bool CreateImage(string inputPath, string outputPath, string imageFormat, int firstPage, int lastPage, int width, int height)
    {
        bool result = false;
        try
        {
            string[] args = GetArgs(inputPath, outputPath, imageFormat, firstPage, lastPage, width, height);
            var argStrHandles = new GCHandle[args.Length];
            var argPtrs = new IntPtr[args.Length];

            // Create a handle for each of the arguments after 
            // they've been converted to an ANSI null terminated
            // string. Then store the pointers for each of the handles
            for (int i = 0; i < args.Length; i++)
            {
                argStrHandles[i] = GCHandle.Alloc(StringToAnsi(args[i]), GCHandleType.Pinned);
                argPtrs[i] = argStrHandles[i].AddrOfPinnedObject();
            }

            // Get a new handle for the array of argument pointers
            var argPtrsHandle = GCHandle.Alloc(argPtrs, GCHandleType.Pinned);

            // Get a pointer to an instance of the GhostScript API 
            // and run the API with the current arguments
            IntPtr gsInstancePtr;
            CreateAPIInstance(out gsInstancePtr, IntPtr.Zero);
            InitAPI(gsInstancePtr, args.Length, argPtrsHandle.AddrOfPinnedObject());

            // Cleanup arguments in memory
            for (int i = 0; i < argStrHandles.Length; i++)
                argStrHandles[i].Free();

            argPtrsHandle.Free();

            // Clear API
            ExitAPI(gsInstancePtr);
            DeleteAPIInstance(gsInstancePtr);

            result = true;
        }
        catch(Exception e)
        {
            throw e;
        }
        return result;
    }
于 2012-01-19T14:02:22.777 に答える