PDF To TIFF
找到的几种PDF To Tiff方法:
一:使用Ghostscript,开源项目,注意Win32和Win64版本。
免费,生成的大小适度的图片清晰度一般。当然可以设置生成很大的清晰文件。
下载地址:http://sourceforge.net/projects/ghostscript/files/
下载后解压,只需要Bin中的文件:
gswin32c.exe
gsdll32.dll
gswin32.exe
gsdll32.lib
通过命令行调用:
gswin32c.exe -dSAFER -dBATCH -dNOPAUSE -r100 -dNOTRANSPARENCY -sDEVICE=tiff12nc -sCompression=lzw -dAdjustWidth=0 -dMaxStripSize=999999999 -sOutputFile=D:\Work\Test\PDF\abc.tif D:\Work\Test\PDF\abc.PDF
另外,gswin32c.exe还可以将PDF转为其他格式的图片文件。
如JPG:gswin32c.exe -dSAFER -dBATCH -dNOPAUSE -r100 -sDEVICE=jpeg -dGraphicsAlphaBits=4 -sOutputFile=D:\Work\Test\PDF\abc%d.jpg D:\Work\Test\PDF\abc.PDF
参数设置参见压缩包中的doc\Use.htm
二、oakdoc的PDF to TIFF Converter,收费软件。分GUI、Command、COMPONENT版本。
下载地址:http://www.oakdoc.com/products/pdftotiff.html
GUI网上有破解版。试用版生成的图片上有水印。
收费,价格低,生成的文件小且清晰。支持PDF目录 -> Tif目录的批量操作。
Command版只需要pdftotiff.exe
通过命令行调用:
pdftotiff.exe -i "D:\Work\Test\PDF" -o "D:\Work\Test\Tif" -x 96 -y 96 -q 75 -c 4 -e \"LZW\" -a
参数设置参见压缩包中的help\index.htm
三、Adobe的Professional版,收费。有破解版。
首先,使用Acrobat.CAcroPDDoc将PDF页面CopyToClipboard
然后,从Clipboard.GetData(DataFormats.Bitmap)读取出Image
最后,将Image合并到一个Tif文件中。
private static List<Image> PDFToImage(string InputFilename)
{
List<Image> imgs = new List<Image>();
Acrobat.CAcroPDPage pdfPage = null;
Acrobat.CAcroPoint pdfPoint = null;
Acrobat.CAcroRect pdfRect = null;
Acrobat.CAcroPDDoc pdfDoc = (Acrobat.CAcroPDDoc)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.PDDoc", "");
//pdfDoc = new Acrobat.AcroPDDocClass();
//Type AcroApp = Type.GetTypeFromCLSID(new System.Guid("{85DE1C45-2C66-101B-B02E-04021C009402}"));
//Type AcrobatType = Type.GetTypeFromCLSID(new System.Guid("{72498821-3203-101B-B02E-04021C009402}"));
//Type AcroPD = Type.GetTypeFromCLSID(new System.Guid("{FF76CB60-2EC8-101B-B02E-04021C009402}"));
//Acrobat.CAcroApp oApp = (Acrobat.CAcroApp)Activator.CreateInstance(AcroApp);
//Acrobat.CAcroAVDoc avdoc = (Acrobat.CAcroAVDoc)Activator.CreateInstance(AcrobatType);
//Acrobat.CAcroPDDoc pdfDoc = (Acrobat.CAcroPDDoc)Activator.CreateInstance(AcroPD);
bool llRet = pdfDoc.Open(InputFilename);
if (!llRet)
{
throw new FileNotFoundException();
}
int pageCount = pdfDoc.GetNumPages();
for (int i = 0; i < pageCount; i++)
{
pdfPage = (Acrobat.CAcroPDPage)pdfDoc.AcquirePage(i);
pdfPoint = (Acrobat.CAcroPoint)pdfPage.GetSize();
pdfRect = (Acrobat.CAcroRect)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.Rect", "");
pdfRect.Left = 0;
pdfRect.right = pdfPoint.x;
pdfRect.Top = 0;
pdfRect.bottom = pdfPoint.y;
pdfPage.CopyToClipboard(pdfRect, 0, 0, 100);
IDataObject loClipboardData = Clipboard.GetDataObject();
if (loClipboardData.GetDataPresent(DataFormats.Bitmap))
{
//Get Image
Bitmap pdfBitmap = (Bitmap)loClipboardData.GetData(DataFormats.Bitmap);
imgs.Add(pdfBitmap);
}
}
pdfDoc.Close();
Marshal.ReleaseComObject(pdfPage);
Marshal.ReleaseComObject(pdfRect);
Marshal.ReleaseComObject(pdfDoc);
return imgs;
}
/// Combine some file into 1 tif multipage file
/// if black and write image, we use CCITT4 compression
/// else we use the LZW compression
/// </summary>
/// <param name="InputFilenames">the files to be combined, canbe (bmp, jpg, gif, png, tif)</param>
/// <param name="OutputFilename">the output filename</param>
public static void CombineTif(string[] InputFilenames, string OutputFilename)
{
//get ImageCodecInfo, generate tif format
ImageCodecInfo info = null;
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders())
{
if (ice.MimeType == "image/tiff")
{
info = ice;
break;
}
}
/*
* define the encoderparameter,
* when the 1st page, will be EncoderValue.MultiFrame.
* when the other pages, will be EncoderValue.FrameDimensionPage.
* when all pages saved, will be the EncoderValue.Flush.
*/
EncoderParameters ep = new EncoderParameters(2);
/*
* when the 1st file, 1st frame, will be true.
* from the 1st file, 2nd frame, will be false.
*/
bool b11 = true;
Image img = null;
//create a image instance from the 1st image
for (int nLoopfile = 0; nLoopfile < InputFilenames.Length; nLoopfile++)
{
//get image from src file
Image img_src = Image.FromFile(InputFilenames[nLoopfile]);
Guid guid = img_src.FrameDimensionsList[0];
System.Drawing.Imaging.FrameDimension dimension = new System.Drawing.Imaging.FrameDimension(guid);
//get the frames from src file
for (int nLoopFrame = 0; nLoopFrame < img_src.GetFrameCount(dimension); nLoopFrame++)
{
img_src.SelectActiveFrame(dimension, nLoopFrame);
/*
* if black and write image, we use CCITT4 compression
* else we use the LZW compression
*/
if (img_src.PixelFormat == PixelFormat.Format1bppIndexed)
{
ep.Param[0] = new EncoderParameter(Encoder.Compression, Convert.ToInt32(EncoderValue.CompressionCCITT4));
}
else
{
ep.Param[0] = new EncoderParameter(Encoder.Compression, Convert.ToInt32(EncoderValue.CompressionLZW));
}
if (b11)
{
//1st file, 1st frame, create the master image
img = img_src;
ep.Param[1] = new EncoderParameter(Encoder.SaveFlag, Convert.ToInt32(EncoderValue.MultiFrame));
img.Save(OutputFilename, info, ep);
b11 = false;
continue;
}
ep.Param[1] = new EncoderParameter(Encoder.SaveFlag, Convert.ToInt32(EncoderValue.FrameDimensionPage));
img.SaveAdd(img_src, ep);
}
}
ep.Param[1] = new EncoderParameter(Encoder.SaveFlag, Convert.ToInt32(EncoderValue.Flush));
img.SaveAdd(ep);
}
其他方法:
XpdfRasterizerNet可以将PDF输出为BMP文件,带水印,需要regsvr32注册XpdfRasterizer.dll,没有进一步使用。
含以下DLL:XpdfRasterizer.dll、XpdfRasterizerNet.dll、O2S.Components.PDFRender4NET.dll、O2S.Components.PDFView4NET.dll
rast.loadFile(pdffile);
for (int page = 1; page <= rast.numPages; page++)
{
string jpgfile = fileName + page.ToString() + ".bmp";
rast.writePageBitmap(page, dpi, rast.imageRGB, rast.imageFileBMP, jpgfile);
}
rast.closeFile();
Java中的PDFBox有J#版,不过没有最终完成,没有实现page.convertToImage方法。
List pages = doc.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
while (iter.hasNext())
{
PDPage page = (PDPage)iter.next();
BufferedImage image = page.convertToImage();//error
File file = new java.io.File(@"D:\Work\Test\PDF\abc.tif");
ImageIO.write(image, "tiff", file);
//OutputStream os = new FileOutputStream(file);
//JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
//encoder.encode(image);
}