使用C#或命令行将PDF转换为JPG或PNG

25

我需要将PDF文件转换为图片。我用于测试的工具是“Total PDF Converter”,它提供了一个命令行,但这是共享软件,我需要找到一个免费的替代品。

有人知道这样的工具或甚至是免费的C#库吗?

7个回答

34
convert 工具(或 magick 自版本7起)来自 ImageMagick 软件包,可以完成此操作(以及更多其他操作)。
最简单的形式如下:
convert myfile.pdf myfile.png

或者

magick myfile.pdf myfile.png

1
为了进一步解释这个答案,您可以使用http://www.csharp-station.com/HowTo/ProcessStart.aspx。 - delete
1
我已经尝试过ImageMagick,它在图像转换方面表现非常出色。如果要处理PDF文件,则还需要安装GhostScript。http://sourceforge.net/projects/ghostscript/ - Sameh Deabes
2
我也有点困惑,因为这里的许可系统。ImageMagick是根据Apache许可证授权的,这很好,但ghostscript是GPL。当我的程序与商业程序一起发布时,这对我意味着什么? - martinyyyy
2
@Martin 这可能意味着您需要购买来自Artifex的商业许可证或使用其他工具。 - yms
magick: attempt to perform an operation not allowed by the security policy gs' @ error/delegate.c/ExternalDelegateCommand/384.` - xeruf
显示剩余5条评论

19

由于缺少GhostScript的答案,而且尚无有关多页 PDF导出的提示,我认为添加另一个变体是可以的。

gs -dBATCH -dNOPAUSE -sDEVICE=pnggray -r300 -dUseCropBox -sOutputFile=item-%03d.png examples.pdf

选项说明:

  • dBatchdNOPAUSE是告诉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。 CropBox指定页面上感兴趣的区域。 如果您有一个带有大白边框的pdf,并且您不希望在输出中有此边框,则此选项可能有所帮助。
  • -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

Windows:

您可以在http://www.ghostscript.com/download/gsdnld.html找到Windows二进制文件。


7
我找到了解决方案: 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();
    }

2
警告:不要忘记在结尾处调用_rasterizer.Close()。(这很重要,以免在例如循环中使用此代码时发生异常)。 - bau
你知道除了“GetPage”之外还有什么获取整个文档的替代方法吗? - rogerdeuce

6

在我的情况下, @Thomas 的回答不起作用了。 我猜这只适用于您的pdf中有图像的情况。 在我的情况下,有效的方法是使用pdftoppm(源自https://askubuntu.com/a/50180/37527):

pdftoppm input.pdf outputname -png

这将输出使用格式 outputname-01.png 的PDF中的每个页面,其中01是页面索引。

转换PDF的单个页面

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

2

1

6
由于GPL许可证的限制,我无法使用这个。 - martinyyyy

1

2JPEG 命令行工具可以实现该功能,例如:

2jpeg.exe -src "C:\In\*.pdf" -dst "C:\Out"


抱歉,但是它有很多错误,无法正常工作。 - ch271828n
嗨Turtle, 你能告诉我更多关于2JPEG错误的信息吗? - Mikhael Bolgov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接