使用magick.net将pdf转换为图片

现在手上有个需求是要将pdf转换为一页一页的image.最开始找到的是pdfbox来处理pdf的.在pdfbox.apache.org的官网首页写了一句’convert you pdfs to image files’.所以最开始就使用pdfbox来作为转换库.但是在后面却发现出现了一个问题.由于暂时解决不了,发现了magick这个东西.可以用来处理100多种图片格式,并且提供了各种语言的api.

###下载magick.net

ImageMagick http://www.imagemagick.org/

.net上官网提供了两个类库 magick.netimagemagickapp.我选择了magick.net这个库.下载地址

http://magick.codeplex.com/releases/view/137513
下载 Magick.NET-7.0.0.0007-Q16-AnyCPU-net40-client.zip

其中下载的时候最好选择AnyCPU的库,在vs编译的时候不需要考虑平台性的问题.Q8 Q16 q16-HDRI分别表示8位 16位和32位的.可以根据需要选择不同版本的库.

###下载安装ghostscript

根据自己的需要在ghostscript.com选择下载32位或64位的库.下载地址如下:

http://ghostscript.com/download/gsdnld.html

如果不安装ghostscript,magick.net在执行Read函数读取pdf时会报如下错误.

1
2
iisexpress.exe: FailedToExecuteCommand `"gswin32c.exe" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r300x300" "-sOutputFile=C:/Users/ZHANGW~1/AppData/Local/Temp/magick-10612rmwPHf2ITKBB%d" "-fC:/Users/ZHANGW~1/AppData/Local/Temp/magick-10612_fb2bvFOsIGG" "-fC:/Users/ZHANGW~1/AppData/Local/Temp/magick-10612Pg1c2Td4S-bk"' (ϵͳ�Ҳ���ָ�����ļ��� ) @ error/delegate.c/ExternalDelegateCommand/459

下载安装 Visual C++ Redistributable for Visual Studio

.NET 4.0: Visual C++ Redistributable for Visual Studio 2012
.NET 2.0: Visual C++ Redistributable for Visual Studio 2008 x64 ro x86

由于开发是在vs的环境,所以不需要安装这步.在部署的时候忘了这步,导致程序一直报错找不到magick-xxx.dll.以为是环境的原因,错误的在编译环境上折腾了很久.

生成image

在工程中引用Magick.net.当然也可以使用nuget来引入.转换代码如下,filepath为pdf的路径.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
MagickReadSettings settings = new MagickReadSettings();

settings.Density = new MagickGeometry(72, 72); //设置格式

using (MagickImageCollection images = new MagickImageCollection())
{
images.Read(filepath, settings);

int pageCount = images.Count();

for (int i = 0; i < page;i++ )
{
MagickImage image = images[i];
image.Format = MagickFormat.Jpeg;

string path = string.Format("{0}/{1}.jpg", dir, i);//相对路径

string filename = "d:/img/" + path;

image.Write(filename);

}

}


这里转换就完成了.

###IKVM和pdfbox生成的问题

最开始我是使用pdfbox来生成的.代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PDDocument doc = PDDocument.load(this._path);

int page= doc.getDocumentCatalog().getAllPages().size();//获取总的页数

for (int i = 0; i < page; i++)
{
PDPage pdfPage = allpages.get(i) as PDPage;

java.awt.image.BufferedImage image = pdfPage.convertToImage();

string path = string.Format("{0}/{1}.jpg", dir, i);//相对路径

string filename ="d:\img" + path;

ImageIO.write(image, "jpg", new java.io.File(filename));

}

运行的时候在下面这行代码中出错了.

java.awt.image.BufferedImage image = pdfPage.convertToImage();

原因是IKVM.GNU.Classpath对awt和Swing实现不完整.导致了错误.当然如果不需要使用awt和Swing的库.使用.net来调用java库IKVM还是能够解决一些问题的.

###其他

PDFsharp http://pdfsharp.net/wiki/PDFsharpFAQ.ashx

itextsharp http://itextsharp.sourceforge.net/

ImageMagick http://www.imagemagick.org/
http://magick.codeplex.com/
http://magick.codeplex.com/releases/view/137513

imageMagick 的另一个.net api实现 http://sourceforge.net/projects/imagemagickapp/

作者

张巍

发布于

2014-11-28

更新于

2014-11-28

许可协议

评论