使用c#中的itextsharp从PDF中提取位图图像
本文关键字:提取 位图 图像 PDF 中的 itextsharp 使用 | 更新日期: 2023-09-27 18:11:33
我使用以下代码使用ittext -sharp将PDF转换为图像。
private static System.Drawing.Image ExtractImages(String PDFSourcePath)
{
iTextSharp.text.pdf.RandomAccessFileOrArray RAFObj = null;
iTextSharp.text.pdf.PdfReader PDFReaderObj = null;
iTextSharp.text.pdf.PdfObject PDFObj = null;
iTextSharp.text.pdf.PdfStream PDFStremObj = null;
try
{
RAFObj = new iTextSharp.text.pdf.RandomAccessFileOrArray(PDFSourcePath);
PDFReaderObj = new iTextSharp.text.pdf.PdfReader(RAFObj, null);
for (int i = 0; i <= PDFReaderObj.XrefSize - 1; i++)
{
PDFObj = PDFReaderObj.GetPdfObject(i);
if ((PDFObj != null) && PDFObj.IsStream())
{
PDFStremObj = (iTextSharp.text.pdf.PdfStream)PDFObj;
iTextSharp.text.pdf.PdfObject subtype = PDFStremObj.Get(iTextSharp.text.pdf.PdfName.SUBTYPE);
if ((subtype != null) && subtype.ToString() == iTextSharp.text.pdf.PdfName.IMAGE.ToString())
{
byte[] bytes = iTextSharp.text.pdf.PdfReader.GetStreamBytesRaw((iTextSharp.text.pdf.PRStream)PDFStremObj);
if ((bytes != null))
{
try
{
System.IO.MemoryStream MS = new System.IO.MemoryStream(bytes);
Bitmap ImgPDF = new Bitmap(MS);
return ImgPDF;
}
catch (Exception)
{
}
}
}
}
}
RAFObj.Close();
PDFReaderObj.Close();
return null;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
它适用于某些pdf文件,但对于某些文件,它会在
抛出异常Bitmap ImgPDF = new Bitmap(MS);
参数无效
我真的很困惑。为什么会这样。是由于文件的安全性差异还是其他原因?
您需要检查流的/Filter以查看给定图像使用的图像格式。可以是标准的图像格式:
-
DCTDecode (jpeg)
-
JPXDecode (jpeg 2000)
-
JBIG2Decode (jbig是一个B&W格式)
-
CCITTFaxDecode(传真格式,PDF支持组3和组4)
除此之外,您还需要获得原始字节(就像您一样),并使用图像流的宽度,高度,每个组件的位数,颜色组件的数量(可以是CMYK,索引,RGB或奇怪的东西)和其他一些在ISO PDF规范(免费提供)第8.9节中定义的图像来构建图像。
因此,在某些情况下,您的代码将工作,但在其他情况下,它将失败,您提到的异常。源
我想我也有同样的问题。在我的情况下,当图像为jbig2格式时抛出异常。在我的例子中,图像流的宽度和高度设置为0,流有一些字节。