【问题标题】:Using sed to fix pdf files使用 sed 修复 pdf 文件
【发布时间】:2017-09-07 16:59:50
【问题描述】:

我在 Windows 上运行 GNU sed 4.2.1 版。我有大量的 PDF 文件,在最后一条记录中有 %%EOF + 换行符 + 很多 NUL 字符。

请参阅下面的 hexdump。

0000b890: 25 25 45 4F 46 0D 0A 00 - 00 00 00 00 00 00 00 00 |%%EOF           
|

0000b8a0: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 |                
|

我只需要将最后一条记录更改为%%EOF。表达式 ^%%EOF\x0d\x0a\x0{10,30000} 匹配 Notepad++ 中的字符,但它似乎在 sed 中不起作用。有人能帮忙吗?非常感谢。

【问题讨论】:

  • sed 面向行操作,因此您无法轻松匹配多行字符串。您的模式包含 \x0a 即换行符。我认为 sed 不是该任务的最佳选择,但如果使用专家级可能是可能的。 %%EOF 后面的换行符和空字节有什么问题?
  • Adobe Reader XI 无法打开这些文件。

标签: pdf sed malformed nul


【解决方案1】:

假设你的 grep 支持它,对于给定的 input.pdf

将文件中最后一个%%EOF的字节偏移量读入变量offset

offset=$( grep -a -b '%%EOF' input.pdf  | tail -1 | cut -d: -f1 )

从原始文件中截去前 offset + 5 个字节(字符串 %%EOF 的长度),那么 output.pdf 应该是你想要的

head -c$(( $offset + 5 )) input.pdf > output.pdf

但取决于 PDF 的性质(例如,最后根本没有 %%EOF,(edit: 或其他数据,但 %%EOF[thx @mkl)后面的空字节)行为可能与您想要的不同或导致许多其他问题。

【讨论】:

  • “从原始文件中截取第一个偏移量 + 5 个字节(字符串 %%EOF 的长度)” - 但这不是 op 想要的,他想要删除 '%%EOF`- 行之后的 0 字节尾部。
  • 我承认这与 %%EOF 后面是否有空字节或其他数据无关,你是对的
猜你喜欢
  • 2020-12-29
  • 2014-10-11
  • 2015-03-19
  • 1970-01-01
  • 2021-03-27
  • 2021-04-28
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多