代码之家  ›  专栏  ›  技术社区  ›  Avi Pinto

使用imagemagick.net将pdf转换为图像-如何设置dpi

  •  6
  • Avi Pinto  · 技术社区  · 14 年前

    我正在尝试将PDF文件转换为图像。 ImageMagick是一个很好的工具,使用命令行工具可以得到我想要的结果。

    但我需要在我的代码中这样做, 因此添加了对 http://imagemagick.codeplex.com/ 下面的代码示例将PDF的每一页呈现为图像:

    MagickNet.InitializeMagick();
    using (ImageList im = new ImageList())
    {
        im.ReadImages(@"E:\Test\" + fileName + ".pdf");
        int count = 0;
        foreach (Image image in im)
        {
            image.Quality = 100;
            image.CompressType = mageMagickNET.CompressionType.LosslessJPEGCompression;
            image.Write(@"E:\Test\" + fileName + "-" + count.ToString() + ".jpg");
            ++count;
        }
    }
    

    问题 :看起来像垃圾 渲染后的图像几乎不可读。 我意识到的问题是它使用了默认的ImageMagick的72 dpi。 我找不到通过.NET包装器设置它的方法(96dpi或120dpi会产生很好的结果)。

    我是错过了什么,还是真的没有办法通过这个包装来设置它?

    谢谢

    1 回复  |  直到 11 年前
        1
  •  1
  •   Community dbr    7 年前

    我对这个做了一个简短的调查。

    这个 Image.Resolution 属性可用于设置PDF呈现分辨率,但ImageMagick.net包装器不公开该属性。

    将缺少的属性添加到Image类就足够简单了。

    Index: ImageMagickNET/Image.h
    ===================================================================
    --- ImageMagickNET/Image.h  (revision 59374)
    +++ ImageMagickNET/Image.h  (working copy)
    @@ -532,6 +532,13 @@
            }
    
    
    +       // Vertical and horizontal resolution in pixels of the image.
    +       property Geometry^  Density
    +       {
    +           void set(Geometry^);
    +       }
    +
    +
            //----------------------------------------------------------------
            // IO
            //----------------------------------------------------------------
    Index: ImageMagickNET/Image.cpp
    ===================================================================
    --- ImageMagickNET/Image.cpp    (revision 59374)
    +++ ImageMagickNET/Image.cpp    (working copy)
    @@ -1099,5 +1099,9 @@
            return bitmap;
        }
    
    +   void Image::Density::set(Geometry^ density_)
    +   {
    +       image->density(*(density_->geometry));
    +   }
     }
    

    不幸的是,看起来 a bug 阻止我们在迭代PDF页面时设置渲染质量,因为您正在尝试这样做。

    另一种选择是单独打开每个页面:

    Image image = new Image();
    image.Density = new Geometry("1000");  // 1000 dpi
    image.Read(@"C:\u\test.pdf[2]");       // Open the 3rd page, index 0 is the first
    

    如果页码超出范围,则 未经加工的 C++异常。同时 you can catch it in C# 包装应该包括 .NET 表示ImageMagick错误的异常类。