[.NET]透過 Ghostscript.NET 來將 Pdf 檔轉成 Tiff 檔

要將 PDF檔案轉成 Tiff檔很難嗎? 找不到方向,的確是粉難! 同事說 Ghostscript 應該是可以的,於是找到 Ghostscript.NET。
透過 Ghostscript + Ghostscript.NET 讓您很方便的將 Pdf 檔轉成 Tiff 檔。

image

最近在Survey要將PDF檔案轉成Tiff,有看到「How To Convert PDF to Image Using Ghostscript API」。

但同事測試起來如果有些pdf沒有內嵌字型的話,似乎有問題。

而且它限定是要 GhostScript 8.64 版,目前最新是 9.14 版。

後來在codeplex.com上有找到 Ghostscript.NET ,它是將 GhostScript 包裝起來讓 .NET 使用者可以方便的使用。

所以我先下載 GhostScript 9.14 版(有分x86/x64,License有分GPL及商用版本)來安裝。

安裝完成後,開啟VS.NET,就可以從NuGet來安裝 Ghostscript.NET ,如下,

image

 

而它網站上的範例程式,就可以將pdf一頁一頁轉成 png圖檔,那我們可以將格式改成Tiff即可,如下, ConvertPDF2MutiTiffs Method,


//預設的dpi都是96
const int desired_x_dpi = 96;
const int desired_y_dpi = 96;

/// <summary>
/// 將一個pdf檔,依每頁轉成一個Tiff檔
/// </summary>
/// <param name="pdfFilePath"></param>
/// <param name="tiffFilePathFormat">必須有{0}放pageNumber</param>
public void ConvertPDF2MutiTiffs(string pdfFilePath, string tiffFilePathFormat)
{
	var _lastInstalledVersion =
		GhostscriptVersionInfo.GetLastInstalledVersion(
				GhostscriptLicense.GPL | GhostscriptLicense.AFPL,
				GhostscriptLicense.GPL);
	var _rasterizer = new GhostscriptRasterizer();
	
	_rasterizer.Open(pdfFilePath, _lastInstalledVersion, false);
	int pageCount = _rasterizer.PageCount;
	for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++)
	{
		string pageFilePath = string.Format(tiffFilePathFormat,  pageNumber);
		Image img = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
		img.Save(pageFilePath, ImageFormat.Tiff);
	}
}

 

使用方式如下,


string inputPdfPath = @"d:\t1.pdf";
string outputFormatPath = @"d:\t1-{0}.tiff";
ConvertPDF2MutiTiffs(inputPdfPath, outputFormatPath);

 

那如果要將多頁存成一頁呢? 可以利用 Image.SaveAdd 來合併進去,如下, ConvertPDF2Tiff Method,


/// <summary>
/// 將pdfFile轉存成Tiff檔
/// </summary>
/// <param name="pdfFilePath"></param>
/// <param name="tiffFilePath"></param>
public void ConvertPDF2Tiff(string pdfFilePath, string tiffFilePath)
{
	var _lastInstalledVersion =
		GhostscriptVersionInfo.GetLastInstalledVersion(
				GhostscriptLicense.GPL | GhostscriptLicense.AFPL,
				GhostscriptLicense.GPL );
	var _rasterizer = new GhostscriptRasterizer();
	Encoder encoder = Encoder.SaveFlag;
	ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");
	EncoderParameters encoderParameters = new EncoderParameters(1);
	encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);

	_rasterizer.Open(pdfFilePath, _lastInstalledVersion, false);
	Image allImg = null;
	int pageCount = _rasterizer.PageCount;
	for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++)
	{
		if (pageCount == 1)
		{
			//只有一頁,所以直接存檔即可
			allImg = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
			allImg.Save(tiffFilePath, ImageFormat.Tiff);
		}
		else if (pageNumber == 1 && pageCount > 1)
		{
			allImg = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
			allImg.Save(tiffFilePath, encoderInfo, encoderParameters);
		}
		else
		{
			encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage);
			Image img = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
			allImg.SaveAdd(img, encoderParameters);
		}
	}

	if (pageCount > 1)
	{
		// Close out the file
		encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush);
		allImg.SaveAdd(encoderParameters);
	}
}

 

使用方式如下,


string inputPdfPath = @"d:\t3.pdf";
string outputPath = @"d:\t3.tiff";
ConvertPDF2Tiff(inputPdfPath, outputPath);

 

註:
目前測試,如果是中文檔名會有「輸入字串格式不正確。」的錯誤哦!

 

參考資料

GhostScript

Ghostscript.NET

How To Convert PDF to Image Using Ghostscript API

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^