PDF:提取的图像被切片/平铺

2024-01-08

图像提取pdfimages and mupdf/mutool到目前为止工作正常。

使用 FreePDF 生成的 PDF 中的图像始终会被切片,因此一张图像会生成多个图像文件。

有什么技巧可以避免这种情况吗?我如何使用结果pdfshow? 有没有坐标可以知道位置和高度和宽度 将 PDF 转换为 PNG 或 JPEG 后剪切/裁剪图像?


图像在提取后被“切片”的最可能原因是:它们在提取之前就已经被“切片”了——作为它们在 PDF 文件本身中的生存方式。

不要问我为什么有些 PDF 生成软件会这样做。

MS Powerpoint 因这一点而臭名昭著——显示某些渐变的背景图像经常被分割成数万个1x1, 1x2 or 1x8PDF 中的像素和类似大小的迷你图像。


Update

1. 确定问题的范围

样本 PDF 的图像片段可以通过pdfimages -list命令(这需要最新版本的pdfimages基于 Poppler 叉子,而不是xpdf one!):

pdfimages -list so-28023312-test1.pdf

page   num  type   width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
------------------------------------------------------------------------------------------
   1     0 image     271   271  rgb     3   8  jpeg   no       18 0   163   163 26.7K  12%
   1     1 image     271   271  rgb     3   8  jpeg   no       19 0   163   163 21.7K  10%
   1     2 image     271   271  rgb     3   8  jpeg   no       30 0   163   163 22.9K  11%
   1     3 image     271   271  rgb     3   8  jpeg   no       31 0   163   163 21.8K  10%
   1     4 image     132   271  rgb     3   8  jpeg   no       32 0   162   163 9895B 9.2%
   1     5 image     271   271  rgb     3   8  jpeg   no       33 0   163   163 22.5K  10%
   1     6 image     271   271  rgb     3   8  jpeg   no       34 0   163   163 16.5K 7.7%
   1     7 image     271   271  rgb     3   8  jpeg   no       35 0   163   163 16.9K 7.9%
   1     8 image     271   271  rgb     3   8  jpeg   no       36 0   163   163 20.3K 9.4%
   1     9 image     132   271  rgb     3   8  jpeg   no       37 0   162   163 14.5K  14%
   1    10 image     271   271  rgb     3   8  jpeg   no       20 0   163   163 17.1K 8.0%
   1    11 image     271   271  rgb     3   8  image  no       21 0   163   163  107K  50%
   1    12 image     271   271  rgb     3   8  image  no       22 0   163   163 96.7K  45%
   1    13 image     271   271  rgb     3   8  image  no       23 0   163   163  119K  56%
   1    14 image     132   271  rgb     3   8  jpeg   no       24 0   162   163 10.7K  10%
   1    15 image     271    99  rgb     3   8  jpeg   no       25 0   163   161 7789B 9.7%
   1    16 image     271    99  rgb     3   8  jpeg   no       26 0   163   161 6456B 8.0%
   1    17 image     271    99  rgb     3   8  jpeg   no       27 0   163   161 7202B 8.9%
   1    18 image     271    99  rgb     3   8  jpeg   no       28 0   163   161 8241B  10%
   1    19 image     132    99  rgb     3   8  jpeg   no       29 0   162   161 5905B  15%

因为一页上只有 20 个不同的片段,所以很容易...

  1. ...首先将它们全部提取并转换为 JPEG,然后
  2. ...然后将它们再次缝合在一起。

2. 将片段提取为 JPEG

以下命令将提取片段并尝试将它们保存为 JPEG (-j) 28023312:

pdfimages so-28023312-test1.pdf 28023312

有 3 个图像以 PPM 形式出现。使用 ImageMagick 的convert从它们中制作 JPEG(不是严格要求的,但它简化了“拼接”命令行:

for i in 11 12 13; do
  convert 28023312-0${i}.ppm 28023312-0${i}.jpg
done

以下是前三个片段:280233312-000.jpg、280233312-001.jpg 和 280233312-002.jpg:

  

3.将20个碎片再次缝合在一起

ImageMagick 可以将 20 张图像再次拼接在一起。查看 PDF 页面以及 20 个 JPEG 时,很容易确定它们需要放在一起的顺序:

convert                                         \
   \( 28023312-0{00,01,02,03,04}.jpg +append \) \
   \( 28023312-0{05,06,07,08,09}.jpg +append \) \
   \( 28023312-0{10,11,12,13,14}.jpg +append \) \
   \( 28023312-0{15,16,17,18,19}.jpg +append \) \
 -append                                        \
  complete.jpg

剖析命令:

  1. The +append 图像算子按水平顺序附加所有列出的图像。

  2. The \( ... \)线条表示'aside'处理图像堆栈的相应部分(需要用转义括号分隔)。此水平附加操作的结果将替换当前图像堆栈内的各个片段。

  3. 决赛-append 图像算子附加当前图像垂直.

这是生成的 JPEG,再次完全拼接在一起:

这可以自动化吗?

理论上我们可以自动化这个过程。为此,我们必须分析 PDF 源代码。然而,这相当困难,因为内容流可能被压缩。

为了解压缩全部或大部分内容流并获得 PDF 文件结构的更好表示,我们可以使用mutool clean -d, podofouncompress or qpdf --qdf.

我更喜欢qpdf http://qpdf.sf.net/, the “结构性、内容保留的 PDF 文件转换器”。这是命令:

qpdf --qdf --object-streams=disable so-28023312-test1.pdf qdf.pdf

生成的 PDF 文件,qdf.pdf更容易分析,因为most(但不是all) 以前的二进制部分现在采用 ASCII 格式。当您搜索出现的情况时Do在这个文件中,您将看到图像插入的位置(但是,我无法在这里为您提供完整的 PDF 分析教程,抱歉...)。

以下命令打印所有行Do发生,加上前一行 (-B 1):

grep -a -B 1 " Do" qdf.pdf

1002 0 0 1002 236 5776.67 cm
/Im0 Do
--
1001 0 0 1002 1237 5776.67 cm
/Im1 Do
--
120.12 0 0 120.24 268.44 693.2004 cm
/Im2 Do
--
[...skipping 15 other output segments...]
--
1002 0 0 369 3237 3406.67 cm
/Im18 Do
--
490 0 0 369 4238 3406.67 cm
/Im19 Do
--
1 0 0 1 204.9037018 508.5130005 cm
/Fm0 Do

All the /ImNN Do行插入图像(/Fm0 Do线指的是表单对象不是图像)。

例如前面几行490 0 0 369 4238 3406.67 cm设置当前变换矩阵。仅从这条线,有时就可以推断出图像的位置及其大小。就该文件而言,这还不够——需要更多前面行的内容才能确定当前的“绘图位置”。

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

PDF:提取的图像被切片/平铺 的相关文章

  • 有没有办法为 CSS3 边框图像的每一侧使用不同的图像?

    在 Firefox 和 Safari 上 我可以通过以下 CSS 使用图像作为边框 moz border image url shadow left png 0 7 0 7 round round webkit border image u
  • android:web服务图像替换为本地文件夹中的图像

    我进入了 Android 聊天应用程序的最后阶段 我在使用图像和网络服务时遇到了一些问题 因此 当我选择图像并将该图像发送到 Web 服务时 我从服务获取 URL 我如何将该网址转换为本地文件夹中的图像 我很困惑如何才能使其发挥作用 我想在
  • C# 计算图像差异

    我怎样才能生成一个System Drawing Image包含其他两个图像的像素之间的差异 类似的东西确实如此 但是用 C 编写 The 算法 https github com Phrogz context blender blob mas
  • 打开 PDF 到书签/指定目标?

    我正在尝试使用 python 打开特定书签的 PDF 到目前为止 我可以在命令提示符中运行以下命令并得到我想要的 last是 PDF test pdf 中指定目的地的名称 C Program Files x86 Adobe Reader 1
  • 使用其他应用程序打开 pdf

    我正在应用程序中显示 pdf 文件 我想在 nag bar 上显示 打开方式 选项 显示 iPhone 上安装的可以打开相同 pdf 的应用程序 如果用户选择任何应用程序 例如 pdf 查看器 则应该使用 pdf 查看器应用程序打开 pdf
  • CGContextDrawImage 绘制非常模糊的大图像

    我正在尝试制作一个可以使用 CGContextDrawImage 绘制大图像 例如 2048 x 1537 图像的一部分的对象 它工作得很好 只是它非常模糊 我正在使用一个 drawingController 它覆盖了drawLayer i
  • 动态显示数百张图像

    我必须创建一个能够显示电影院大厅 不知道确切的词 模式的表单 本质上 我必须显示大量 由另一个来源提供 独立的椅子状图像 这些图像可以在单击时改变颜色 状态 我上网寻找解决方案 但我真的不知道如何管理这个问题 有人能帮我吗 如果您需要绘制那
  • 创建一个带有可填充字段的pdf python

    因此 我的任务是创建一个 pdf 允许最终用户在 pdf 中输入信息并打印或保存它 或者 我尝试创建的 pdf 是从具有可填充字段的 pdf 模板呈现的 我遇到的问题是 每次我使用任何 python 库 pypdf2 pdfrw repor
  • 在上传过程中调整网页中的图像大小和优化图像的最佳类是什么?

    我正在寻找一个类 使用 C 来检查我的图像尺寸 宽度和高度 或以 kb 为单位的图像尺寸 如果它们与我最喜欢的尺寸不匹配 请调整它们的大小 意味着使用 Constrain 和相对宽度和高度 new大小就像 Photoshop 中的图像大小
  • 使用 Angular JS ng-src 的后备(默认)图像

    我正在尝试使用从模式返回的数据设置图像源 这是在 ng repeat 循环内 div div span table tr td class imgContainer img td tr table span div div
  • CoreData:是否将图像存储到数据库?

    我正在制作一个应用程序 它从网站上为某些用户名拍摄照片 并将其显示在带有用户名的 UITable 中 然后当单击用户名时 它会显示该用户的照片 然后单击照片名称 它会显示全屏照片 我的问题是我正在使用 NSData 从互联网获取照片 我必须
  • UIDocumentInteractionController 显示空白 pdf

    我尝试使用 UIDocumentInteractionController PresentPreviewAnimated 方法在 iOS 设备上显示 pdf 但它一直显示空白文档 我认为这可能与字符编码有关 但我不确定 如果我使用 UIWe
  • 隐藏嵌入的 pdf 周围的工具栏?

    虽然我认为答案可能在这另一个问题 https stackoverflow com questions 770949 how to disable the default toolbar of pdf page关于pdf规范的回答 是否可以不
  • 从图像创建 PDF 时设置文档名称

    我使用以下代码从 jpg 图像创建 pdf im new Imagick im gt readImage image jpg im gt setImageFormat pdf im gt writeImage images pdf imag
  • 找到图像特征宽度的正确方法和Python包

    输入是一个在黑色背景上带有彩色 抱歉 垂直线的光谱 给定该带的近似 x 坐标 用 X 标记 我想找到该带的宽度 我对图像处理不熟悉 请引导我前往正确的方法图像处理和Python图像处理package也能起到同样的作用 我认为 PIL Ope
  • 在 C# WinForms 中预览文档(Word、Excel、PDF、文本文件等)?

    我正在开发一个 C WinForms 应用程序 我希望能够 预览 其中的各种文档类型 也就是说 当用户从列表中选择文件名时 它会在下面以相同的形式显示所选文件的预览 这很像 Outlook 允许您无需双击即可预览选定邮件的方式 有没有什么方
  • 如何在 Microsoft 报告中显示字节数组中的图像

    我使用报表文件和 ReportViewer 控件来显示在运行时从对象动态加载数据的报表 我需要显示一个以字节数组形式存储在对象中的图像 PictureBox 的值当前设置为 First Fields ImageData Value dtst
  • 适用于 iPhone / iPad / iOS 的快速、精益 PDF 查看器 - 提示和提示?

    最近有很多关于绘制 PDF 的问题 是的 您可以使用UIWebView但这无法提供您所期望的优秀 PDF 查看器的性能和功能 您可以绘制PDF页面到 CALayer http www cocoabuilder com archive coc
  • 在 Android 中调整可绘制对象的大小

    我正在为进度对话框设置一个可绘制对象 pbarDialog 但我的问题是我想每次调整可绘制的大小 但不知道如何调整 这是一些代码 Handler progressHandler new Handler public void handleM
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np

随机推荐

  • 如何将 Excel 中的值限制在某个范围内?

    在 C 中我会使用boost clamp为了这 基本上我有一些excel函数 A1 B2 C3 D4 我想将其限制为 某个数字 称之为X1 显而易见的方法是这样的 MAX X1 MIN X1 A1 B2 C3 D4 但我希望能够做到这一点
  • Hive-Tez 上的 Map-Reduce 日志

    我想在 Hive Tez 上运行查询后获得 Map Reduce 日志的解释 INFO 后面的几行传达什么 这里我附上了一个样本 INFO Session is already open INFO Dag name SELECT a Mod
  • 使用 TPL 时如何在 UI 线程上调用方法?

    我正在开发一个 MVVM 应用程序 它使用 TPL 在后台执行多项任务 任务需要向 UI 报告进度 以便可以更新进度对话框 由于应用程序是 MVVM 因此进度对话框绑定到名为 Progress 的视图模型属性 该属性由具有签名的视图模型方法
  • JavaFX 拖放到 GridPane?

    我已经为我的游戏实现了拖放功能 但到目前为止我只能 拖放到 硬编码的位置 如图所示 我想要的是 当船舶被放下时 它的 x y 值 相对于 GridPane 被保存 或者 飞船掉落到的单元格被保存 我的 setOnDragDropped 事件
  • Jenkins gerrit 触发器在构建时未获取我的更改

    我已经使用 gerrit 触发器插件配置了 jenkins 以验证我们推送到 gerrit 的每个提交 我希望这个触发器包含我对原始存储库的最新更改并进行构建 但是 它仅克隆回购项目并进行编译 而无需我进行更改 以下是我在詹金斯中对 ger
  • 如何运行快照插件

    当我尝试使用以下命令运行下面的 Maven 插件时 com wordpress pomfromjarmavenplugin generate 0 0 1 SNAPSHOT generatepom 我收到此错误 下载中 https oss s
  • 如果数字以 1 结尾做某事

    我想做这样的事情 if day 1 day 11 day 21 day 31 day 41 result dan else result dana 我怎样才能对每个以 1 结尾的数字做到这一点 当然又不写出所有数字 只需检查除以 10 的余
  • 始终使用 Serilog 记录上下文数据

    我正在使用 Serilog 进行日志记录 对于每个日志 我想记录上下文信息 例如用户名和其他一些上下文信息 所以我用静态方法创建了包装器 如下所示 public static class MyLogger public static voi
  • Windows .cmd 标准输出 - 多重重定向

    给定一个 windows cmd 文件abc cmd abc cmd gt output log 上述命令行操作会将执行的输出保存到output log 文件中 是否有选项可以运行此命令以创建此日志的多个副本 也就是说 我希望在一个位置创建
  • highcharts 不尊重我的 x 轴日期间隔

    几周以来 我每 15 分钟收集一次一系列数据 不幸的是 中间有一个星期的数据缺失 这只是我的一个事实 当我使用 Highcharts 绘制这些数据的图表时 它会压缩 x 轴 时间 从而使图表倾斜 例如 x 轴每 2 小时就有一次主要刻度 直
  • 代码中的注释页眉和页脚真的有必要吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C++ 构造函数初始化列表中的 vim 缩进

    include
  • 让 Gmail 自动显示我嵌入 HTML 电子邮件中的图像?

    我正在使用 Zend Mail 在 PHP 中构建 HTML 电子邮件 并且我想嵌入 附加 任何图像 以便 Gmail 会自动显示它们而不提示用户 我怎样才能做到这一点 谷歌的假设 Gmail 将自动为已验证其域的发件人显示图像 为确保 G
  • java.lang.IllegalStateException:查询 GraphQL 后递归更新

    我正在查询 graphQL 但遇到了这个异常 java lang IllegalStateException Recursive update at java base java util concurrent ConcurrentHash
  • tkinter Checkbutton 小部件返回错误的布尔值

    我这里有一个简单的 GUI 它应该根据检查按钮是否被选中返回一个布尔值 我已将布尔变量设置为 False 因此检查按钮为空 我不明白的是 当我检查按钮时 绑定到该小部件的函数返回 False 而不是 True 这是为什么 这是代码 from
  • Swift:对 NSNotFound 的引用不明确

    在向某些 Objective C 代码添加桥接标头后 我开始收到有关以下内容的编译器错误 NSNotFound是一个不明确的参考 我的猜测是它可以用某种模块前缀来修复 是的 将其更改为 Foundation NSNotFound
  • 如何在 Android SeekBar 上添加数字刻度

    我正在使用开箱即用的 android SeekBar 组件 下面我想添加 1 到 5 中的数字来显示 SeekBar 的进度 我在搜索栏上正确分配数字时遇到问题 就像下图一样 要在搜索栏拇指上绘制文本 请使用此功能 public Bitma
  • Rails 中用户注销后如何使所有会话失效?

    我是 Rails 新手 并且正在关注 Michael Hartl 的 Rails 教程 因此我的代码大部分是从那里借来的 这是场景 我使用以下方式登录我的网站Computer A 然后我使用相同的用户 ID 登录该网站Computer B
  • Android 文件路径 (Xamarin)

    我目前正在尝试选择一个具有意图的文件 我的问题是 返回的路径格式不正确 我的意图 private void selectAudioFile object sender EventArgs eventArgs Intent new Inten
  • PDF:提取的图像被切片/平铺

    图像提取pdfimages and mupdf mutool到目前为止工作正常 使用 FreePDF 生成的 PDF 中的图像始终会被切片 因此一张图像会生成多个图像文件 有什么技巧可以避免这种情况吗 我如何使用结果pdfshow 有没有坐