【发布时间】:2011-06-09 09:40:52
【问题描述】:
我需要将 PDF 文件转换为图像。我使用提供命令行的“Total PDF Converter”进行测试,但它是共享软件,我需要找到一个免费的替代品。
有没有人知道这样的工具或者甚至是免费的 C# 库?
【问题讨论】:
我需要将 PDF 文件转换为图像。我使用提供命令行的“Total PDF Converter”进行测试,但它是共享软件,我需要找到一个免费的替代品。
有没有人知道这样的工具或者甚至是免费的 C# 库?
【问题讨论】:
ImageMagick 捆绑包中的convert 工具(或magick since version 7)可以做到这一点(以及更多)。
最简单的形式就是
convert myfile.pdf myfile.png
或
magick myfile.pdf myfile.png
【讨论】:
这是一个老问题,但由于缺少 GhostScript 答案,并且没有提示 multipage PDF 导出,但我认为添加另一个变体是可以的。
gs -dBATCH -dNOPAUSE -sDEVICE=pnggray -r300 -dUseCropBox -sOutputFile=item-%03d.png examples.pdf
选项说明:
dBatch 和 dNOPAUSE 只是告诉 gs 以批处理模式运行,这意味着
或多或少它不会问任何问题。这些参数也是
如果您想在 bash 脚本中运行该命令,这一点很重要。sDEVICE 告诉 gs 生成什么输出格式。 pnggray 用于
灰度,png16m 用于 24 位 RGB 颜色。如果你坚持创作
Jpeg 使用-sDEVICE=jpeg 生成彩色JPEG 文件。使用-dJPEGQ=N(N 为 0 到 100 之间的整数,默认为 75)
控制 Jpgeg 质量的参数。-r300 将扫描分辨率设置为 300dpi。如果你喜欢更小的
输出大小使用-r70,或者如果您输入的pdf具有高分辨率,请使用
-r600。如果您有 300dpi 的 PDF 并指定 -r600,您的图像将被放大。-dUseCropBox 告诉 gs 使用 CropBox(如果已定义)。裁剪框是
指定页面上的感兴趣区域。如果你有一个带有
大的白色边距,你不希望你的输出上有这个边距
选项可能有帮助。-sOutputFile 定义输出文件的名称。 %03d.png 部分
告诉 gs 包含多个文件的计数器。两页pdf
会产生两个名为 item-001.png 和 item-002.png 的文件。可用性: imagemagick 的 convert 命令确实在内部使用了 gs 命令。如果您可以使用 imagemagick 转换 pdf,则说明您已经安装了 gs。
安装 ghostscript:
RHEL:
yum install ghostscript
SLES:
zypper install ghostscript
Debian/Ubuntu:
sudo apt-get install ghostscript
窗户:
您可以在http://www.ghostscript.com/download/gsdnld.html 下找到 Windows 二进制文件
【讨论】:
问题很老了,但最近我发现了这个对我有用的解决方案:https://github.com/jhabjan/Ghostscript.NET。它也可作为 nuget 下载。
以下是将所有pdf页面转换为png图像的示例代码:
private static void Test()
{
var localGhostscriptDll = Path.Combine(Environment.CurrentDirectory, "gsdll64.dll");
var localDllInfo = new GhostscriptVersionInfo(localGhostscriptDll);
int desired_x_dpi = 96;
int desired_y_dpi = 96;
string inputPdfPath = "test.pdf";
string outputPath = Environment.CurrentDirectory;
GhostscriptRasterizer _rasterizer = new GhostscriptRasterizer();
_rasterizer.Open(inputPdfPath, localDllInfo, false);
for (int pageNumber = 1; pageNumber <= _rasterizer.PageCount; pageNumber++)
{
string pageFilePath = Path.Combine(outputPath, "Page-" + pageNumber.ToString() + ".png");
Image img = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
img.Save(pageFilePath, ImageFormat.Png);
}
_rasterizer.Close();
}
【讨论】:
@Thomas 的答案在我的情况下不起作用。
我想这只有在你的 pdf 中有图像时才有效。
就我而言,有效的是pdftoppm(来自https://askubuntu.com/a/50180/37527):
pdftoppm input.pdf outputname -png
这将使用outputname-01.png 格式输出PDF 中的每一页,01 是页面的索引。
pdftoppm input.pdf outputname -png -f {page} -singlefile
将{page} 更改为页码。它的索引为 1,因此-f 1 将是第一页。
此命令的默认分辨率为 150 DPI。增加它会导致更大的文件大小和更多的细节。
要提高转换后的 PDF 的分辨率,请添加选项 -rx {resolution} 和 -ry {resolution}。例如:
pdftoppm input.pdf outputname -png -rx 300 -ry 300
【讨论】:
您可能想查看此免费解决方案
http://www.codeproject.com/Articles/32274/How-To-Convert-PDF-to-Image-Using-Ghostscript-API
它可以轻松地将 PDF 转换为图像(单个文件或多个文件) 是开源的,并且使用ghostscript(免费下载)
使用示例:
converter = new PDFConverter();
converter.JPEGQuality = 90;
converter.OutputFormat = "jpg";
string output = "output.jpg";
converter.Convert("input.pdf", output);
【讨论】:
你应该使用 iText sharp。它是用于操作 PDF 的开源 Java 项目的一个端口。 http://sourceforge.net/projects/itextsharp/
【讨论】:
2JPEG命令行工具可以做到,比如:
2jpeg.exe -src "C:\In\*.pdf" -dst "C:\Out"
【讨论】: