当前位置: 首页 > 知识库问答 >
问题:

从pdf文档中提取图像

鲁弘厚
2023-03-14

我知道以前也有人问过类似的问题,但是这些问题已经过时了(有些问题可以追溯到2006年)。

我有一个. net 3.5应用程序(w/iTextSharp 5),我正在转换为. net核心(iText 7),它从联邦快递跟踪文档中提取签名,通过SOAP服务以字节[]数组发送。这段代码多年来一直运行良好,只是略有更新。从联邦快递返回的PDF文档中有几个图像,但签名块不是110x46图像(这是pdf文件中联邦快递的标志,因此我跳过了它。)

PdfReader pdf = new PdfReader(FedexData);

for(Int32 iPage = 1; iPage <= pdfReader.NumberOfPages; iPage++)
{
   PdfDictionary pg = pdf.GetPageN(iPage);
   PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
   PdfDictionary xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));

   foreach(PdfName name in xobj.Keys)
   {
      PdfObject obj = xobj.Get(name);

      if(obj.IsIndirect())
      {
          PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
          String width = tg.Get(PdfName.WIDTH).ToString();
          String height = tg.Get(PdfName.HEIGHT).ToString();
          String decode = tg.Contains(PdfName.DECODEPARMS) ? tg.Get(PdfName.DECODEPARMS).ToString() : "";
          String bitspercomponent = tg.Contains(PdfName.BITSPERCOMPONENT) ? tg.Get(PdfName.BITSPERCOMPONENT).ToString() : "";
          String colorspace = tg.Contains(PdfName.COLORSPACE) ? tg.Get(PdfName.COLORSPACE).ToString() : "";
          if(width != "110" && height != "46" && bitspercomponent != "1")
          {
                ImageRenderInfo imgRI = ImageRenderInfo.CreateForXObject(new GraphicsState(), (PRIndirectReference)obj, tg);
                PdfImageObject image = imgRI.GetImage();
                Image dotnetImg = image.GetDrawingImage();

                if(dotnetImg != null)
                {
                // process image and update database

只需说这段代码不适用于iText7。我试图移植其中一些,但我似乎没有得到图像。。。。因此,我显然做了一些不正确的事情,这是我自己对iText7函数的无知,这些函数似乎无法提供与旧库的向下兼容性。

有人能给我指一下iText7的教程吗?它涉及提取存储在PDF文件中的图像?我找到了关于如何将PDF提取为图像(不是我想要的)、如何将图像存储在PDF文档中(与我想要的相反)的教程,以及类似的问题和答案都是基于不再起作用的旧库。

谢谢,文

共有1个答案

阎阳
2023-03-14
public class MyImageRenderListener implements IEventListener {

    protected String path;
    protected String extension;

    public MyImageRenderListener(String path) {
        this.path = path;
    }

    public void eventOccurred(IEventData data, EventType type) {
        switch (type) {
            case RENDER_IMAGE:
                try {
                    String filename;
                    FileOutputStream os;
                    ImageRenderInfo renderInfo = (ImageRenderInfo) data;
                    PdfImageXObject image = renderInfo.getImage();
                    if (image == null) {
                        return;
                    }

                    // You can access various value from dictionary here:
                    PdfString decodeParamsPdfStr = image.getPdfObject().getAsString(PdfName.DecodeParms);
                    String decodeParams = decodeParamsPdfStr != null ? decodeParamsPdfStr.toUnicodeString() : null;                      

                    byte[] imageByte = image.getImageBytes(true);
                    extension = image.identifyImageFileExtension();
                    // You can use raw image bytes directly, or write image to disk
                    filename = String.format(path, image.getPdfObject().getIndirectReference().getObjNumber(), extension);
                    os = new FileOutputStream(filename);
                    os.write(imageByte);
                    os.flush();
                    os.close();
                } catch (com.itextpdf.io.IOException | IOException e) {
                    System.out.println(e.getMessage());
                }
                break;

            default:
                break;
        }
    }

    public Set<EventType> getSupportedEvents() {
        return null;
    }
}

我已经评论了一些你可能感兴趣的部分。

下面是为所有页面或任何感兴趣的页面调用处理器的代码:

PdfDocument pdfDoc = new PdfDocument(new PdfReader(src));
IEventListener listener = new MyImageRenderListener(outPath);
PdfCanvasProcessor parser = new PdfCanvasProcessor(listener);
for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
    parser.processPageContent(pdfDoc.getPage(i));
}
pdfDoc.close();
 类似资料:
  • 假设我的用户去了他们办公室的扫描仪。扫描仪能够生成扫描文档的PDF。这基本上就是我拥有的文件类型。 我想做的是从这个PDF中提取文本。这不是“第一代”pdf,因为文本没有嵌入到pdf中。文本嵌入在PDF中的图像中。 PDFBox的iText中是否有允许检索此数据的功能?如果可能的话,我正在尝试避免对图像进行OCR。我希望IText或PDFBox中有一些内置的东西可以做到这一点。 请注意,我不是在谈

  • 问题内容: 如何 使用PHP 从PDF文档中提取文本? (我不能使用其他工具,我没有root用户访问权限) 我发现一些函数可用于纯文本,但是它们不能很好地处理Unicode字符: http://www.hashbangcode.com/blog/zend-lucene-and-pdf-documents-part-2-pdf- data-extraction-437.html 问题答案: 下载 c

  • 问题内容: 我需要从服务器上的PDF文件中提取所有图像。我不想要PDF页面,只想要原始尺寸和分辨率的图像。 如何使用Perl,PHP或任何其他基于UNIX的应用程序(我将使用PHP的exec函数调用它)来做到这一点? 问题答案: pdfimages就是这样做的。它是poppler- utils和xpdf-utils软件包的一部分。 从联机帮助页: Pdfimages将可移植文档格式(PDF)文件中

  • 我需要循环一些word文档,并从word文档中提取图像,并将其保存在单独的文件夹中。我尝试过将它们保存为超文本标记语言文档的方法,但它不太适合我的需求。 现在,我使用inlineshapes对象循环浏览图像,然后将它们复制粘贴到publisher文档上,然后将它们保存为图像。但是,在运行脚本时,我会遇到运行时自动化错误。对于使用Publisher运行时库,我尝试了早期绑定和晚期绑定,但都遇到了错误

  • 我正在使用PDFBox从我的pdf(只包含JPG的)中提取图像。 因为我将把这些图像保存在我的数据库中,所以我想先把每个图像直接转换成一个inputstream对象,而不把文件临时放在我的文件系统上。然而,我在这方面遇到了困难。我认为这是因为使用了,就像我在下面的示例中所做的那样: 然而,这是可行的: 知道我如何将每个PDXObjectImage(或我能得到的任何其他对象)转换为InputStre

  • 我正在从一个PDF文档中提取文本。这个PDF是使用一个从AS400读取数据的WS生成的。所以打印文本时,输出是这样的: 和«VS123»,«VS124»是AS400中的变量。Java APi无法从变量中读取值,无法打印变量名而不是变量值。 我用的是PDFBoxhttps://pdfbox.apache.org/提取文本。代码源如下: 输出从以下错误堆栈开始: 避免:字体为ArialMT 2017年