在 Linux 上使用命令行检查 PDF 文件是否损坏

Kok*_*zzu 21 linux pdf

我在一个文件夹中有许多 PDF 文件。

是否可以使用命令行检查一个或多个文件是否已损坏(零页或未完成的下载),而无需逐个打开它们?

von*_*and 24

您可以尝试使用pdfinfo(在poppler-utils软件包中的Fedora 上)。pdfinfo从其字典中获取有关 PDF 文件的信息,因此如果找到它,该文件应该没问题

for f in *.pdf; do
  if ! pdfinfo "$f" &> /dev/null; then
    echo "$f" is broken
  fi
done
Run Code Online (Sandbox Code Playgroud)

  • 我建议用 pdftotext 替换 pdfinfo。这样,每页上的所有文本都将被检查。> gt 字符应该是 &> 以便所有错误消息都不会显示。 (6认同)

sch*_*tbi 15

find . -iname '*.pdf' | while read -r f
  do
    if pdftotext "$f" - &> /dev/null; then 
        echo "$f" was ok;   
    else
        mv "$f" "$f.broken";
        echo "$f" is broken;   
    fi; 
done
Run Code Online (Sandbox Code Playgroud)


moo*_*moo 11

我选择的检查 PDF 的工具是qpdf. qpdf有一个--check论点可以很好地发现 PDF 中的问题。

使用以下命令检查单个 PDF qpdf

qpdf --check test_file.pdf
Run Code Online (Sandbox Code Playgroud)

使用以下命令检查目录中的所有 PDF qpdf

find ./directory_to_scan/ -type f -iname '*.pdf' \( -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; -o -exec echo "{}": FAILED \; \)
Run Code Online (Sandbox Code Playgroud)

命令说明:

  • find ./directory_to_scan/ -type f -iname '*.pdf' 查找所有扩展名为“.pdf”的文件

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \;qpdf对找到的每个文件 执行并将所有输出通过管道传输到/dev/null. 如果返回状态qpdf为 0(即没有错误),还打印文件名后跟“:OK”

  • -o -exec echo "{}": FAILED \; \) 如果发现错误,则执行此操作:打印文件名后跟“:失败”


获取方式qpdf

qpdf在以下位置提供 Linux 和 Windows 二进制文件:https : //github.com/qpdf/qpdf/releases。您也可以使用您选择的包管理器来获取它。例如,在 Ubuntu 上,您可以使用 apt 和以下命令安装 qpdf:

apt install qpdf
Run Code Online (Sandbox Code Playgroud)


kra*_*vil 5

所有使用pdfinfopdftotext没有对我有用的方法。事实上,他们不断给我误报,有时还创建了我不需要的文件。

起作用的是JHOVE

安装:

从上面的链接安装 jar 并使用以下命令更新 PATH 环境变量:

echo "export PATH=\$PATH:/REPLACE_WITH/YOUR/PATH_TO/jhove/" >> ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

刷新每个终端 source ~/.bash_profile,您就可以开始在系统范围内使用它了。

基本用法:

jhove -m pdf-hul someFile.pdf
Run Code Online (Sandbox Code Playgroud)

您将获得有关 pdf 的大量信息 - 超出大多数人可能需要的信息。

Bash One-Liner:
简单地返回validinvalid

if [[ $(jhove -m pdf-hul someFile.pdf | grep -a "Status:") == *"Well-Formed and valid"* ]]; then echo "valid"; else echo "invalid"; fi;
Run Code Online (Sandbox Code Playgroud)

请注意,这是在 Mac OS X 上运行的,但我认为它在任何基于 Unix 的 Bash 环境中都可以正常工作。