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);
}
}