从pdf文档中提取图像

2024-01-08

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

我有一个 .net 3.5 应用程序(带有 iTextSharp 5),我正在转换为 .net core(iText 7),它从 FedEx 跟踪文档中提取签名,并通过 SOAP 服务以 byte[] 数组形式发送。该代码多年来一直运行良好,仅进行了少量更新。从 Fedex 返回的 PDF 文档中有几个图像,但签名块不是 110x46 图像(这是 pdf 文件中的 fedex 徽标,因此我跳过它。)

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 文档中(与我想要的相反)的教程,以及类似问题的答案基于不再起作用的旧库。

谢谢, 文号


这是一个 Java 实现IEventListener您可以使用它来访问特定页面的所有图像:

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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从pdf文档中提取图像 的相关文章

随机推荐

  • 使用 Javascript 在多个 CSS 文件之间切换

    我目前正在尝试制作一系列按钮 网站的用户可以单击这些按钮来在不同的 CSS3 文件之间进行更改 这将改变某些效果 为了实现这个目标 我需要某种方式来访问 href example1 css 我的 HTML 中的标签 并将其更改为 href
  • Jenkins - 最大并发作业数

    我可以在 Jenkins 中同时运行的最大作业数是多少 Jenkins 作业的最大数量取决于您在主站和从站中设置的限制 通常 我们会限制核心数量 但您的里程可能会有所不同 具体取决于可用内存 磁盘速度 SSD 的可用性以及源代码的重叠 对于
  • 如何更改 F# 交互式换行符

    在 fs 文件中 换行符表示为 r n 但在 F 交互窗口中是 n 在我当前正在尝试解决的问题中 多行文字字符串的长度很重要 因此 当我在 F 交互窗口中测试代码时出现问题 因为字符串的长度与正常执行时的长度不同 我希望有一个选项可以将 F
  • jQuery DataTables sDom 命令不起作用

    我需要左上角的 过滤器 和右上角的 大小 但不起作用 document ready function jQuery example dataTable sDom lt top fl gt rt lt bottom ip gt lt clea
  • 在vba中一次循环遍历所有可用的自动筛选条件

    我想知道是否有一种方法可以获取列表中所有不同的自动过滤条件 以便迭代每个条件 最后复制并粘贴每个不同的表 这些表在迭代时会显示在单独的工作表中 理想情况下 这将运行 n 次 ActiveSheet Range AllRows AutoFil
  • 我应该关心 React Redux 应用程序中的状态变化率吗?

    我正在使用 React Redux 和 Websocket 实现 评估 实时 Web 应用程序 在服务器上 我的数据集以每秒大约 32 次更改的速度发生更改 每次更改都会使用 Websocket 向应用程序发送一条异步消息 异步消息在我的
  • 用于 Java 的 LZ4 和 Zstd

    是否有适用于 LZ4 和 ZStd 的最佳 Java 压缩库 我尝试过 apache commons 这是 zstd jni 实现 String fileURL TestFileUtil getFileURL TestFileCategor
  • 实现 (.m) 文件中的 IBOutlet 实例变量

    假设我有一个视图控制器或窗口控制器 它 像往常一样 是相应 XIB 文件中的 文件所有者 众所周知 这是很常见的IBOutlet然后您可以使用 Interface Builder 在 XIB 中连接控制器类 到目前为止 我一直在创造IBOu
  • 选择以下划线(_)开头的所有对象键

    我需要在以下对象中创建一个包含所有键 而不是值 的数组 其中键以下划线开头 在下面的代码片段中我试图得到getSubscriptions 回来 foo1 foo2 let myObj foo0 test foo1 test foo2 tes
  • 使用 JavaScript 在浏览器中触发全屏 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在Javascript中制作全屏窗口 伸展到整个屏幕 https stackoverflow com questions 1125084 how to make in javascript ful
  • 禁用 DrawerLayout 的稀松布触摸手势

    我需要禁用稀松布上的触摸手势 红色突出显示的部分 我只想通过滑动来关闭抽屉 问题是 当抽屉布局打开并且我需要从红色突出显示部分下方的 ListView 中选择一个元素时 发生的情况是抽屉关闭 只有此时我才能从 ListView 中选择一个元
  • Jenkinsfile 参数化构建中的环境和参数之间有什么关系?

    最近 我在与同事一起进行 Jenkins 构建时遇到了一些难题 他一直在使用params VARIABLE and env VARIABLE可以互换并且没有任何问题 与此同时 我开始在他通过这行代码的环境对参数对象的调用之一中收到空对象错误
  • 通过在 Javascript 中单击外部来关闭下拉菜单(教程说明)

    我尝试通过以下方式使用 Javascript 实现打开和关闭下拉菜单的方法this https www w3schools com howto howto js dropdown aspw3schools com 上的教程 虽然 显示 下拉
  • PHP - 一小时后检查 json 值

    我创建了一个函数 它使用 json 获取 Twitter 计数 但是 我想在一段时间后 例如一个小时 再次检查一次 但目前它每次加载页面时都会进行检查 以及这会影响页面加载时间 已经有一个 PHP 函数可以完全满足我的要求 但我不记得它了
  • HTTP GET 请求、ASP - 我迷路了!

    将 VBScript 与 ASP 结合使用 我尝试设置一个 HTTP GET 请求 该请求将访问一个页面 该页面又生成一行 ASCII 非 HTML 然后 我想将 ASCII 行 包含由分号分隔的 4 个值 推断回原始 ASP 页面中的 4
  • 如何在 POST 请求后返回重定向到 Django 中的上一页

    我正在编写一个新闻网站 在详细新闻页面中 有一个评论喷泉 如果人们想发表评论 他们需要先登录 我想让他们登录成功后 页面可以返回到上一个新闻页面 这是我的观点 py def newsDetailView request news pk ne
  • Rails 3 库只有在需要时才加载

    我正在尝试在 Rails 3 中加载 Tokbox SDK 我已将该库放置在 lib 目录中 因此目前我的目录结构如下所示 libopentok rb OpenTok异常 rbOpenTokSDK rb会话 rb 我使用 applicati
  • 如何将所有 C# 8 可空引用警告视为错误?

    使用 Visual Studio 2019 v16 3 2 将 NET Core 3 0 项目设置为 C 8 并启用可为 null 的引用类型
  • 如何在 Xcode 中创建具有多列的 UI TableView?

    我正在使用 Xcode 开发 iOS 8 应用程序 我需要在一个视图中显示一张包含多列和多行数据的表 Example Name Time In Time Out ETA Johnnys Supplies 8 30AM 9 00AM 10 1
  • 从pdf文档中提取图像

    我知道以前也有人问过类似的问题 但是它们已经过时了 有些可以追溯到 2006 年 我有一个 net 3 5 应用程序 带有 iTextSharp 5 我正在转换为 net core iText 7 它从 FedEx 跟踪文档中提取签名 并通