Форум русскоязычного сообщества Ubuntu


Автор Тема: Как проверить pdf на целостность  (Прочитано 3183 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Magi

  • Автор темы
  • Участник
  • *
  • Сообщений: 109
    • Просмотр профиля
Как проверить pdf на целостность
« : 03 Февраль 2013, 01:00:44 »
Есть много pdf-файлов, часть из которых битая
pdfinfo для них выдает

pdfinfo 190954616.pdf
Error: PDF file is damaged - attempting to reconstruct xref table...
Error: Couldn't find trailer dictionary
Error: Couldn't read xref table

Подскажите пожалуйста, как их удалить из общей массы скриптом в шелле?

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
Re: Как проверить pdf на целостность
« Ответ #1 : 03 Февраль 2013, 06:29:16 »
Наверное, не лучший скрипт, но, думаю, что-то сделает:
find . -iname "*pdf"  | while read file ; do if pdfinfo $file | grep Adobe ; then mv $file ~/Desktop/WRONG/ ; fi ; done
Поскольку у меня битых файлов нет, то я проверял на произвольное слово в выводе pdfinfo. У меня это Adobe. Скрипт перенес файлы, сделанные в Adobe в ~/Desktop/WRONG/, и оставил остальные (например, сделанные в  LaTeX). Вам нужно Adobe заменить на ERROR, ну и создать предварительно папку ~/Desktop/WRONG.
Конечно, можно сделать лучше, т.к. сама утилита pdfinfo если нет ошибок, возвращает 0, а если есть, то разные коды ошибок. Можно как-то проверять это условие. И еще у меня файлы с пробелами не обрабатываются.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Как проверить pdf на целостность
« Ответ #2 : 03 Февраль 2013, 19:41:46 »
Конечно, можно сделать лучше, т.к. сама утилита pdfinfo если нет ошибок, возвращает 0, а если есть, то разные коды ошибок.
Примерно так, любым из перечисленных способов:
Код: Bash
  1. if ! pdfinfo "$FILE" >/dev/null 2>&1 ; then ... ; fi
  2. pdfinfo "$FILE" >/dev/null 2>&1 || ...

И еще у меня файлы с пробелами не обрабатываются.
Видимо, достаточно будет закавычить переменные.
« Последнее редактирование: 03 Февраль 2013, 19:52:30 от ArcFi »

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
Re: Как проверить pdf на целостность
« Ответ #3 : 04 Февраль 2013, 13:27:11 »
Ну вот, а я ! ставил без пробела и удивлялся, почему отрицание не работает :)
И еще, ошибки выводятся в &1, это что такое?
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Как проверить pdf на целостность
« Ответ #4 : 04 Февраль 2013, 14:50:14 »
И еще, ошибки выводятся в &1, это что такое?
stderr > stdout
http://tldp.org/LDP/abs/html/io-redirection.html#IOREDIRECTIONREF1

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
Re: Как проверить pdf на целостность
« Ответ #5 : 04 Февраль 2013, 17:10:12 »
Странно, создал несколько PDF файлов, в 16-ричном редакторе побил их (потер заголовки и др.). Теперь утилита pdfinfo тоже выводит сообщение Error: PDF file is damaged.
Но ни один из этих способов не работает.
Этот код не удаляет НИЧЕГО
find . -iname "*pdf"  | while read file ; do if pdfinfo $file | grep ERROR ; then mv $file ~/Desktop/WRONG/ ; fi ; done

Этот удаляет ВСЕ, даже хорошие.
(Нажмите, чтобы показать/скрыть)
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Как проверить pdf на целостность
« Ответ #6 : 04 Февраль 2013, 22:02:28 »
Имена переменных регистрозависимы:
Код: Bash
  1. mkdir -p ~/broken_pdf ; find . -type f -iname "*.pdf"  | while read FILE ; do if ! pdfinfo "$FILE" >/dev/null 2>&1 ; then mv "$FILE" ~/broken_pdf/ ; fi ; done

PS
Увы, мне проверить не на чем.

PS2
Кстати, битые pdf'ки вовсе не обязательно сразу удялять:
Цитата: man pdftk
Repair a PDF's corrupted XREF table and stream lengths, if possible
         pdftk broken.pdf output fixed.pdf
« Последнее редактирование: 04 Февраль 2013, 22:04:06 от ArcFi »

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
Re: Как проверить pdf на целостность
« Ответ #7 : 04 Февраль 2013, 22:46:13 »
Но у меня этот скрипт почему-то ничего не перемещает. Все файлы остаются на своих местах.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Как проверить pdf на целостность
« Ответ #8 : 04 Февраль 2013, 22:53:13 »
Но у меня этот скрипт почему-то ничего не перемещает. Все файлы остаются на своих местах.
По идее, надо запускать непосредственно в каталоге с битыми файлами, либо передать имя этого каталога find в качестве параметра. Возможно, делали иначе, а быть может, проблема в чём-то ещё.
Если сможете выложить парочку ломаных pdf'ок, я постараюсь отладить скрипт на них.

Оффлайн Magi

  • Автор темы
  • Участник
  • *
  • Сообщений: 109
    • Просмотр профиля
Re: Как проверить pdf на целостность
« Ответ #9 : 04 Февраль 2013, 23:17:49 »
Выложил тут http://dropcanvas.com/h5kvl пару битых pdf файлов Представленные здесь скрипты у меня не работают - не перемещают файлы.

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
Re: Как проверить pdf на целостность
« Ответ #10 : 04 Февраль 2013, 23:41:11 »
У меня получилось. Просто заменил в скрипте ArcFi ~/broken_pdf на ./broken_pdf в обоих случаях. Вот измененный скрипт:
mkdir -p ./broken_pdf ; find . -type f -iname "*.pdf" | while read FILE ; do if ! pdfinfo "$FILE" >/dev/null 2>&1 ; then mv "$FILE" ./broken_pdf/ ; fi ; done
Запускается внутри каталога с битыми файлами, внутри создается подкаталог broken_pdf, куда битые и перемещаются.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Magi

  • Автор темы
  • Участник
  • *
  • Сообщений: 109
    • Просмотр профиля
Re: Как проверить pdf на целостность
« Ответ #11 : 06 Февраль 2013, 12:45:24 »
Спасибо! Это работает!

 

Страница сгенерирована за 0.168 секунд. Запросов: 24.