从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文档中提取图像 的相关文章

  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • VBA将二进制图像转换为网页的base64编码字符串

    我正在尝试读取 JPG 文件并将该文件转换为 base64 编码的字符串 该字符串可用作网页上的嵌入 jpeg 我在网上发现了两个在 VBA 中进行 Base64 编码 解码的函数 它们似乎被广泛接受 编码 解码过程产生了我的原始二进制字符
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且

随机推荐

  • 使用 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 跟踪文档中提取签名 并通