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


16

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

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

Answers:


20

也许运行pdfinfo(在poppler-utils软件包中的Fedora上)提供了一个线索?

PDF文件中的大多数信息都位于字典的末尾,因此,如果找到它,应该可以。我会做类似的事情:

for f in *.pdf; do
  if pdfinfo "$f" > /dev/null; then
    : Nothing
  else
    echo "$f" is broken
  fi
done

6
我建议将pdfinfo替换为pdftotext。这样,将检查每个页面上的所有文本。并且> gt字符应为&>,这样所有错误消息都不会出现。
schoetbi 2014年

我所有的PDF都标记为已损坏。其中有数百GB。包括我刚刚创建的那些。无论使用pdfinfo还是pdftotext...
PatrickT

13

这是我的剧本

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

需要说明的是:该脚本通过将.broken附加到.pdf扩展名来重命名被诊断为“损坏”的pdf文件。
PatrickT

5

我选择检查PDF的工具是qpdfqpdf有一个--check论点非常适合发现PDF中的问题。

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

qpdf --check test_file.pdf

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

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

命令说明:

  • 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 \; \) 如果发现错误,将执行此命令:打印文件名,后跟“:FAILED”


去哪里qpdf

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

apt install qpdf

但是,qpdf --check不会检测到多重定义的元数据,这是不正确的,因为它们由不同的工具以不同的方式处理。我报告了一个错误。其他工具(例如pdfinfo和)pdftk都不支持,但它们并不声称要检查PDF结构。
vinc17


2

所有使用pdfinfopdftotext不适合我的方法。实际上,他们不断给我带来误报,有时还会创建我不需要的文件。

做的是JHOVE

安装:

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

echo "export PATH=\$PATH:/REPLACE_WITH/YOUR/PATH_TO/jhove/" >> ~/.bash_profile

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

基本用法:

jhove -m pdf-hul someFile.pdf

您将获得许多有关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;

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.