gpt4 book ai didi

c# - 使用 iTextSharp 从 pdf 中提取图像及其名称

转载 作者:太空宇宙 更新时间:2023-11-03 12:05:37 26 4
gpt4 key购买 nike

我正在使用 iTextSharp c# 从目录 pdf 中提取图像及其名称。我能够从 pdf 中提取图像,但很难根据随附的屏幕截图提取其相应的图像名称并使用该名称保存文件。请找到下面的代码,让我知道您的建议。 示例 PDF:https://docdro.id/PwBsNR9

代码:

private static List<System.Drawing.Image> ExtractImages(String PDFSourcePath)
{
List<System.Drawing.Image> ImgList = new List<System.Drawing.Image>();

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())
{
}
if ((subtype != null) && subtype.ToString() == iTextSharp.text.pdf.PdfName.IMAGE.ToString())
{
try
{

iTextSharp.text.pdf.parser.PdfImageObject PdfImageObj =
new iTextSharp.text.pdf.parser.PdfImageObject((iTextSharp.text.pdf.PRStream)PDFStremObj);

System.Drawing.Image ImgPDF = PdfImageObj.GetDrawingImage();
ImgList.Add(ImgPDF);

}
catch (Exception)
{

}
}
}
}
PDFReaderObj.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return ImgList;
}

Catalog

最佳答案

不幸的是,示例 PDF 没有标记。因此,人们必须以其他方式尝试关联标题文本和图像,方法是分析彼此的位置或利用内容流中的模式。

在手头的情况下,分析相对于彼此的位置是可行的,因为标题总是(至少部分地)绘制在匹配图像上或者是正下方的文本。因此,可以在第一遍中从页面中提取带有位置的文本,在第二遍中提取图像,同时在图像区域或正下方的先前提取的文本中寻找标题。或者,可以先提取具有位置和大小的图像,然后提取这些区域中的文本。

但是在内容流中也有一个特定的模式:标题总是在绘制相应的图像之后立即在单个文本绘制指令中绘制。因此,也可以继续并一次提取图像和下一个绘制的文本作为关联标题。

这两种方法都可以使用 iText 解析器 API 来实现。例如,在后一种方法的情况下,如下所示:首先,实现一个表现如所描述的渲染监听器,即保存图像和以下文本:

internal class ImageWithTitleRenderListener : IRenderListener
{
int imageNumber = 0;
String format;
bool expectingTitle = false;

public ImageWithTitleRenderListener(String format)
{
this.format = format;
}

public void BeginTextBlock()
{ }

public void EndTextBlock()
{ }

public void RenderText(TextRenderInfo renderInfo)
{
if (expectingTitle)
{
expectingTitle = false;
File.WriteAllText(string.Format(format, imageNumber, "txt"), renderInfo.GetText());
}
}

public void RenderImage(ImageRenderInfo renderInfo)
{
imageNumber++;
expectingTitle = true;

PdfImageObject imageObject = renderInfo.GetImage();

if (imageObject == null)
{
Console.WriteLine("Image {0} could not be read.", imageNumber);
}
else
{
File.WriteAllBytes(string.Format(format, imageNumber, imageObject.GetFileType()), imageObject.GetImageAsBytes());
}
}
}

然后使用渲染监听器解析文档页面:

using (PdfReader reader = new PdfReader(@"EVERMOTION ARCHMODELS VOL.78.pdf"))
{
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
ImageWithTitleRenderListener listener = new ImageWithTitleRenderListener(@"EVERMOTION ARCHMODELS VOL.78-{0:D3}.{1}");
for (var i = 1; i <= reader.NumberOfPages; i++)
{
parser.ProcessContent(i, listener);
}
}

关于c# - 使用 iTextSharp 从 pdf 中提取图像及其名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55197143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com