Ghost脚本pdf缩略图在.NET中

时间:2014-04-23 13:08:52

标签: .net ghostscript ghostscriptsharp

我想在我的网站(ASP.NET)上显示上传的pdf文件的缩略图。 到目前为止,我已经做了以下事情。

  1. 从这个链接我有了使用ghostscript How to generate thumbnail for some pages of a PDF file?
  2. 的想法
      

    您可以使用其中一个通用PDF库:   •Ghostscript - C,可在GPL下获得   •Poppler - C ++,可在GPL下获得   •Adobe PDF Library SDK - 价格昂贵   谷歌揭示了相当多的PDF到图像转换器,如果上述选项之一无效,您可以将其合并。

    1. 然后Generate a pdf thumbnail (open source/free)告诉我去找那个提到的包装
    2.   

      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方法调用并指定选项(如文件格式,页面大小等)来更改它和许多其他选项...

      现在按照http://mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/的说明操作我已经在我的系统上安装了ghostscript,它是Windows 8 64位。

      现在我已经创建了一个包含上面的测试项目的解决方案,在我自己的项目中,我调用了他的项目函数

      try
              {
                  GhostscriptSharpTests.GhostscriptSharpTests ss = new GhostscriptSharpTests.GhostscriptSharpTests();
                  ss.GenerateSinglePageThumbnail();
              }
              catch (Exception ex)
              { 
      
              }
      

      但我得到一个例外:

        

      无法加载DLL'gsdll32.dll':找不到指定的模块。 (HRESULT异常:0x8007007E)

3 个答案:

答案 0 :(得分:1)

关于错误:

您收到的错误可能是由于找不到gsdll32.dll或您使用的Ghostscript版本安装错误。对于64位系统,您需要安装具有gsdll64.dll的64位Ghostscript库。如果您为AnyCPU platfrom目标编译应用程序,在64位系统上它将以64位进程运行,您将需要gsdll64.dll。如果将应用程序编译为x86并在64位系统上运行,则应用程序将以32位进程运行,您可以使用gsdll32.dll。当您使用DllImport时,请确保您尝试调用的DLL位于应用程序执行的相同(bin)文件夹中,或者它可以位于windows \ system中。如果您想要自定义DLL位置,可以在DllImport([DllImport("C:\Program Files\gs\gs9.14\bin\gsdll32.dll", EntryPoint = "gsapi_new_instance")])中使用完整路径,这通常是不推荐的。

为什么不简单地使用Ghostscript.NET库。它是一个经过良好测试的本机Ghostscript库包装器,它允许您执行所需的操作,并且它与x86和x64 Ghostscript库兼容。

示例代码向您展示如何将PDF格式化为图像: https://ghostscriptnet.codeplex.com/SourceControl/latest#Ghostscript.NET/Ghostscript.NET.Samples/Samples/RasterizerSample.cs

尝试使用“desired_x_dpi”和“desired_y_dpi”的不同(较低)值,输出图像会更小。

答案 1 :(得分:0)

我在ASP.NET Core 1.0项目中使用NuGet使用了Ghostscript.NET。不要忘记从here安装GhostScript。

另请注意基于您的平台+应用程序配置使用的32/64位DLL版本。

我希望这个函数支持Name&的其他文件类型。像Word / excel等类型的通用图标

private void createThumbnail(string sourcePath, Guid targetFile, string fileExtension, string uploadPath, string Name)
    {
        if (fileExtension.ToUpper() != ".PDF") // todo: Use "Name" to create thumbnail for other types
            return;
        try
        {
            int dpi = 72;

            //GhostscriptVersionInfo gvi = new GhostscriptVersionInfo(@"C:\Program Files\gs\gs9.20\bin\gsdll64.lib");
            GhostscriptVersionInfo gvi = new GhostscriptVersionInfo(_AppSettings.GhostscriptLibPath);
            _logger.LogInformation("[createThumbnail] gvi.DllPath: {0}, gvi.Version: {1}", gvi.DllPath, gvi.Version);

            GhostscriptProcessor proc = new GhostscriptProcessor(gvi);

            using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
            {
                rasterizer.Open(sourcePath, gvi, false);
                int pageNumber = 1;
                string targetPath = Path.Combine(uploadPath, targetFile + ".png");
                Image img = rasterizer.GetPage(dpi, dpi, pageNumber);
                Image newImage = img.GetThumbnailImage(_AppSettings.DocThumbnailWidth, _AppSettings.DocThumbnailHeight, null, new System.IntPtr());
                newImage.Save(targetPath, ImageFormat.Png);
                _logger.LogInformation("[createThumbnail] Thumbnail image saved, targetPath: {0}", targetPath);
            }
        }
        catch (Exception e)
        {
            _logger.LogError("Thumbnail could not be generated for file: {0}", sourcePath, e);
            //throw;
        }
    }

答案 2 :(得分:0)

将 gsdll32.dll 保留在项目中,但将其设置为复制到 output/bin 文件夹中,它应该会在您的应用中提取它。

visual studio project