我想在我的网站(ASP.NET)上显示上传的pdf文件的缩略图。 到目前为止,我已经做了以下事情。
您可以使用其中一个通用PDF库: •Ghostscript - C,可在GPL下获得 •Poppler - C ++,可在GPL下获得 •Adobe PDF Library SDK - 价格昂贵 谷歌揭示了相当多的PDF到图像转换器,如果上述选项之一无效,您可以将其合并。
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)
答案 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)