現在手上有個需求是要將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.net
和imagemagickapp
.我選擇了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位的庫.下載地址如下:
如果不安裝ghostscript,magick.net在執行Read函數讀取pdf時會報如下錯誤.
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
生成image
在工程中引用Magick.net.當然也可以使用nuget來引入.轉換代碼如下,filepath為pdf的路徑.
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來生成的.代碼如下:
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/