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

mar*_*yyy 22 c# pdf

我需要将PDF文件转换为图像.我用于测试目的"Total PDF Converter"提供命令行,但它是共享软件,我需要找到一个免费的替代品.

有谁知道这样的工具,甚至可能是一个免费的C#库?

Tho*_*mas 29

ImageMagick软件包中的convert工具(或magick 自版本7开始)可以做到这一点(还有更多).

最简单的形式就是这样

convert myfile.pdf myfile.png
Run Code Online (Sandbox Code Playgroud)

要么

magick myfile.pdf myfile.png
Run Code Online (Sandbox Code Playgroud)

  • 由于这里的许可证制度,我也有点困惑.ImageMagick是根据Apache许可证授权的,但很好,但ghostscript是GPL.当我的程序附带商业程序时,这对我意味着什么? (2认同)
  • @Martin 这可能意味着您需要购买 [Artifex 的商业许可证](http://www.artifex.com/indexlicense.htm) 或使用其他东西 (2认同)

tob*_*obs 14

这是一个老问题,但由于缺少GhostScript答案,并且没有多页 PDF导出的提示,我认为添加另一个变体是可以的.

gs -dBATCH -dNOPAUSE -sDEVICE=pnggray -r300 -dUseCropBox -sOutputFile=item-%03d.png examples.pdf
Run Code Online (Sandbox Code Playgroud)

选项说明:

  • dBatch并dNOPAUSE告诉gs以批处理模式运行,这或多或少意味着它不会提出任何问题.如果要在bash脚本中运行该命令,那么这些参数也很重要.
  • sDEVICE告诉gs要生成什么输出格式.pnggray用于灰度,png16m适用于24位RGB颜色.如果你坚持创建Jpegs用于-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
Run Code Online (Sandbox Code Playgroud)

SLES:

zypper install ghostscript
Run Code Online (Sandbox Code Playgroud)

于Debian/Ubuntu:

sudo apt-get install ghostscript
Run Code Online (Sandbox Code Playgroud)

视窗:

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


Grz*_*ski 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();
    }
Run Code Online (Sandbox Code Playgroud)

  • 警告:不要忘了最后调用_rasterizer.Close()。(这很重要,请避免发生异常,以防例如在循环中使用此代码)。 (2认同)

Jac*_*ace 6

@Thomas 的回答在我的情况下不起作用。我想只有当您的 pdf 中有图像时才有效。就我而言,有效的是pdftoppm(来源来自https://askubuntu.com/a/50180/37527):

pdftoppm input.pdf outputname -png
Run Code Online (Sandbox Code Playgroud)

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

转换 PDF 的单页

pdftoppm input.pdf outputname -png -f {page} -singlefile
Run Code Online (Sandbox Code Playgroud)

更改{page}为页码。它的索引为 1,因此-f 1将是第一页。

指定转换图像的分辨率

此命令的默认分辨率为 150 DPI。增加它会导致更大的文件大小和更多的细节。

要提高转换后的 PDF 的分辨率,请添加选项-rx {resolution}和-ry {resolution}. 例如:

pdftoppm input.pdf outputname -png -rx 300 -ry 300
Run Code Online (Sandbox Code Playgroud)