在 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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 Autodesk designautomation 中将 DWG 导出为 pdf