C#使用iText7以及FreeImage導出JPXDecode格式的圖片

1、安裝iText7包

2、安裝FreeImage.Net包

3、注意需要下載FreeImage.dll到bin目錄下,有X86和X64兩個版本,注意選一個符合的,如果沒有這個dll文件,運行時會報“不能正確加載FreeImage.dll"

4、代碼如下:

/// <summary>
///  PDF版本
/// </summary>
private static readonly PdfVersion pdfVersion = PdfVersion.PDF_1_5;

/// <summary>
/// 轉換文件
/// </summary>
/// <param name="src"></param>
/// <param name="dest"></param>
public void ConvertFile(string src, string dest)
{
	PdfDocument pdfDoc = new PdfDocument(new PdfReader(src),
		new PdfWriter(dest,
			new WriterProperties().AddUAXmpMetadata().SetPdfVersion(pdfVersion)).SetSmartMode(true)
			);

	try
	{
		int numberOfPdfObjects = pdfDoc.GetNumberOfPdfObjects();
		for (int i = 1; i <= numberOfPdfObjects; i++)
		{
			PdfObject pdfObject = pdfDoc.GetPdfObject(i);
			if (pdfObject == null || !pdfObject.IsStream())
			{
				continue;
			}

			var dictionary = (PdfDictionary)pdfObject;
			PdfObject type = dictionary.Get(PdfName.Type);
			PdfObject subType = dictionary.Get(PdfName.Subtype);
			PdfObject filter = dictionary.Get(PdfName.Filter);
			if (PdfName.XObject.Equals(type)
				&& PdfName.Image.Equals(subType)
				)
			{
				if (PdfName.JPXDecode.Equals(filter))
				{
					string fileName = String.Format(@"test.jpg", i);
					ExportJpg2000FromPDF(dictionary, fileName);
				}
				else
				{
					if (filter is PdfArray)
					{
						var filtes = (PdfArray)filter;
						if (filtes.Contains(PdfName.DCTDecode))
						{
							string fileName = String.Format(@"test.jpg", i);
							ExportJpgFromPDF(dictionary, fileName);
						}
					}
				}
			}
		}
	}
	catch (Exception)
	{

	}
	finally
	{
		pdfDoc.Close();
	}
}

/// <summary>
/// 導出Jpg2000
/// </summary>
/// <param name="dictionary"></param>
/// <param name="fileName"></param>
/// 參考https://stackoverflow.com/questions/5013993/convert-byte-of-jp2-to-jpg-file
public static void ExportJpg2000FromPDF(PdfDictionary dictionary, string fileName)
{
	PdfDictionary pdfStream = dictionary;
	byte[] b;
	try
	{
		// Get decoded stream bytes.
		b = ((PdfStream)pdfStream).GetBytes();
	}
	catch (PdfException)
	{
		// Get originally encoded stream bytes
		b = ((PdfStream)pdfStream).GetBytes(false);
	}

	MemoryStream ms = new MemoryStream(b);
	FreeImageBitmapBase fbm = FreeImageBitmap.FromStream(ms);
	fbm.Save(fileName, FREE_IMAGE_FORMAT.FIF_JPEG);
	ms.Close();
	fbm.Dispose();
}

/// <summary>
/// 導出Jpg
/// </summary>
/// <param name="dictionary"></param>
/// <param name="fileName"></param>
public static void ExportJpgFromPDF(PdfDictionary dictionary, string fileName)
{
	PdfDictionary pdfStream = dictionary;
	byte[] b;
	try
	{
		// Get decoded stream bytes.
		b = ((PdfStream)pdfStream).GetBytes();
	}
	catch (PdfException)
	{
		// Get originally encoded stream bytes
		b = ((PdfStream)pdfStream).GetBytes(false);
	}

	using (FileStream fos = new FileStream(fileName, FileMode.Create))
	{
		fos.Write(b, 0, b.Length);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章