在 C# 中将 PDF 导出为 JPG [关闭]

Posted

技术标签:

【中文标题】在 C# 中将 PDF 导出为 JPG [关闭]【英文标题】:Export PDF to JPG(s) in C# [closed] 【发布时间】:2012-02-05 15:56:52 【问题描述】:

我需要将单页 pdf 文档保存为网站上的缩略图图像。

我一直在搞乱 PDFSharp 并且没有运气。

我试过这个:http://www.pdfsharp.net/wiki/ExportImages-sample.ashx?AspxAutoDetectCookieSupport=1,但它所做的只是提取 PDF 文件中的嵌入图像,这不是预期的结果。

关于如何做到这一点的想法?有人知道可以处理这个问题的好图书馆吗?

编辑:请让我知道为什么这是一个糟糕的问题。如果有人对此有很好的解决方案,那么对于许多其他人来说,这将是一个很好的资源。尤其是因为谷歌搜索是空的。

【问题讨论】:

您在 PDFSharp 中尝试了什么?这里有一个例子:pdfsharp.net/wiki/… 向我们展示您的尝试。我们会为您提供帮助。 感谢投反对票!除了您链接的示例之外,我没有尝试任何其他方法,该示例提取 PDF 中的图像,而不是渲染 PDF 并将其输出到图像。这就是我要问的原因:我在 iTextSharp 或 PDFSharp 中看不到这样做的方法。我在 Google 上搜索了很多,结果空手而归。 PDFsharp 无法渲染 PDF 文件 - 这就是您创建缩略图所需要的。此信息可在常见问题解答中找到。你已经发现 Ghostscript 可以做到。 我没有投反对票,但我可以看出这是一个糟糕的问题,因为之前在 SO 中已经多次询问过它。只需搜索“[pdf] [c#] thumbnails”就会得到 10 个结果。 【参考方案1】:

看看 Ghostscript。您可以使用它将 PDF 渲染为图像。

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

【讨论】:

像冠军一样工作。我建议获取源代码。它更容易理解,并且与博客上的示例也有些不同。唯一的事情是您必须知道所需的宽度/高度。我想我会努力弄清楚从哪里收集这些信息。 我并不喜欢这个解决方案,只是它确实有效。如果有人有更好的解决方案,请告诉我们,我会给你打勾。 你在 pdf 上获取页面大小的解决方案是什么?【参考方案2】:

Ghostscript 目前是渲染 PDF 的事实标准。包装起来有点棘手,即使使用 GhostScriptSharp。

Jason Morse 写了一个great C# wrapper for rendering PDFs 作为开源imageresizing.net library 的插件。

如果是 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 插件是 GPL 许可的,就像 Ghostscript。

【讨论】:

我今天去看看。【参考方案3】:

ABCpdf 使用 C# 将 PDF 文档导出为 JPEG。见:http://www.websupergoo.com/helppdfnet/source/4-examples/19-rendering.htm

【讨论】:

我会看看这个,看看它是否比使用 Ghostscript 更干净(它必须是)。谢谢!【参考方案4】:

(免责声明:我为 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);
        
    

【讨论】:

如果它不花费 2000 多美元,那就太好了。 =P【参考方案5】:

我从网络上的某个地方得到这个 - 不记得确切的位置,但它对我有用! 我刚刚把它变成了一个很好的功能。 它使用 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;
    

【讨论】:

取自mattephraim.com/blog/2009/01/06/…。此外,您还缺少所有辅助方法,例如“GetArgs”等 感谢指正

以上是关于在 C# 中将 PDF 导出为 JPG [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在c#中将对象转换为数组? [关闭]

在 Linux 中将多个 jpg 合并为单个 pdf

在 Autodesk designautomation 中将 DWG 导出为 pdf

在 PHP 中将 html 导出为 PDF? [复制]

在 ASP.NET Core 中将 html 导出为 pdf

如何将Word中的图片批量导出为jpg格式