Некоторые журналы генерируют разные PDF для каждой загрузки. APS, например, хранит время и IP-адрес в PDF.
Или есть бумажная версия с гиперссылками и одна с текстовыми ссылками.
Как можно найти повторяющиеся загрузки документов с равным содержанием на 90% в системе Linux с помощью программного обеспечения с открытым исходным кодом?
Я думал о преобразовании файлов PDF в обычный текст во временном каталоге с pdf2txt
. Тогда я мог бы отфильтровать все имена файлов, что diff a b
приводит к более чем х строк. Но это совсем не элегантно и потерпит неудачу с отсканированными публикациями. Журналы часто не предоставляют текст OCR для старых публикаций.
Я также пытался compare
в комплекте ImageMagick, но я не мог обрабатывать многостраничные файлы PDF с этим инструментом.
diffpdf 2.1.1 хорошо работает в графическом интерфейсе для двух файлов, но я не мог понять, как применить его ко многим файлам, и последние версии не доступны ни по одной лицензии с открытым исходным кодом.
источник
blah.pdf[1]
будет вызывать нужную страницу из документа.Ответы:
Поскольку разные издатели используют разные методы «маркировки» PDF-файлов, вам необходимо убедиться, что вы сравниваете их без учета маркировки.
Вам также нужен эффективный метод для сравнения нового PDF со всеми уже загруженными PDF-файлами в случае, если вы повторно загружаете один и тот же PDF-файл, и, например, он помечен IP-адресом и / или отметкой даты и времени, как вы предлагаете. Вы не хотите использовать трудоемкий механизм сравнения, который сравнивает каждый новый PDF со многими уже загруженными PDF
Вам нужна утилита, которая удаляет каждую из возможных меток и генерирует хэш оставшихся данных. Вам нужно будет сохранить карту хэша → имя файла, которая может быть в простом файле, и если вычисленный хэш уже есть в файле, у вас есть дубликат (и удалить его или сделать все необходимое), и если хеш еще не существует там вы добавляете хеш и имя файла. Файл будет выглядеть примерно так:
Этот файл небрежно мал по сравнению с оригинальными PDF-файлами. Если у вас есть миллионы PDF-файлов, вы можете сохранить эти данные в базе данных. Для эффективности вы можете включить размер файла и количество страниц (
pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*'
).Вышесказанное выдвигает проблему удаления меток и создания хэша. Если вы знаете, откуда берется PDF, когда вызываете подпрограмму генерации хеша (то есть, если вы загружаете программно), вы можете точно настроить генерацию хеша, основываясь на этом. Но даже без этого есть несколько возможностей для генерации хеша:
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
чтобы получить хэш. Вы можете включить количество страниц в расчет хэша ('Pages:
' вpdfinfo
выводе).imagemagick
). Вы можете использоватьpdfimages
для извлечения информации изображения во временный файл.pdftext
чтобы извлечь текст, отфильтровать маркировку (если вы отфильтровываете немного, это не проблема), а затем сгенерировать хеш на основе который.Кроме того, вы можете сравнить размер файла старого файла, найденного с помощью хэша, и посмотреть, находится ли он в пределах определенных полей с новым файлом. Сжатие и ifference в строках (IP / date-time-stamp) должны приводить только к разнице менее одного процента.
Если вам известен метод, используемый издателем при определении хэша, вы можете напрямую применить «правильный» метод из вышеприведенного, но даже без этого вы можете проверить метаданные и применить некоторые эвристические методы или определить количество изображений в файле. и сравните это с количеством страниц (если они близко, у вас, вероятно, есть документ, состоящий из сканов).
pdftext
на отсканированных изображениях PDF также имеет узнаваемый вывод.В качестве основы для работы я создал пакет python, который находится на bitbucket и / или может быть установлен с использованием PyPI
pip install ruamel.pdfdouble
. Это предоставляет вамpdfdbl
команду, которая выполняет сканирование, как описано выше, для метаданных, извлеченных изображений или текста. Он не выполняет никакой фильтрации меток (пока) , но в файле readme описано, какие (два) метода для улучшения добавить.Включенный файл readme:
ruamel.pdfdouble
этот пакет предоставляет
pdfdbl
команду:Это позволит перейти к каталогам, указанным в качестве аргумента, и для найденных PDF-файлов создать хеш на основе (по порядку):
Это предполагает, что pdfinfo, pdfimages и pdftotext` из пакета poppler-utils доступны.
Создается «база данных», по
~/.config/pdfdbl/pdf.lst
которой проверяются дальнейшие проверки.Удаление маркировки
В
ruamel/pdfdouble/pdfdouble.py
Есть два способа , которые могут быть усилены , чтобы отфильтровать маркировки в формате PDF , которые делают их менее уникальным и сделать практически одни и те же файлы , чтобы иметь различные хэши.Для текста метод
PdfData.filter_for_marking
должен быть расширен для удаления и разметки строки, являющейся его аргументами, и возврата результата.Для отсканированных изображений этот метод
PdfData.process_image_and_update
необходимо усовершенствовать, например, обрезая нижнюю и верхнюю X-строчки изображений и удаляя любой серый фоновый текст, устанавливая все черные пиксели в белый цвет. Эта функция должна обновить хеш, переданный с использованием.update()
метода, передающего отфильтрованные данные.ограничения
Текущая «база данных» не может обрабатывать пути, содержащие символы новой строки
Эта утилита в настоящее время только на Python 2.7.
Соответствующие IP строки могут быть заменены
re
модулем Python :источник
pdfrw
для извлечения метаданных, но он не может обрабатывать зашифрованные PDF-файлы, где этоpdfinfo
возможно.Я бы дал
pdftotext
еще один шанс, по крайней мере для PDF-файлов в вашей коллекции, которые на самом деле содержат текст (в противном случае вам потребуется запустить OCR), используя лучший инструмент для обработки вывода.Как только у вас есть (грязный) текстовый вывод, запустите его через программу, предназначенную для определения сходства (а не
diff
построчных различий, которые могли бы стать быстрым путем к безумию).Рассмотрим что-то вроде Perl's String :: Similarity или программу simhash (которая доступна в Debian, но не в Fedora / RHEL).
источник
PDF-файлы содержат метаданные, и я только что проверил ряд статей по физике от разных издателей, и все они имеют как минимум атрибут «Заголовок». Для некоторых название является фактическим названием публикации, для некоторых оно содержит DOI или аналогичные идентификаторы. Во всяком случае, каждая статья, которую я проверил, содержит название, и это всегда что-то уникальное для данной публикации.
Вы можете использовать
pdftk
для доступа к метаданным PDF-файлов и сравнить их. Для вашей цели этого должно быть достаточно, и это намного быстрее, чемpdftotext
если бы производительность была проблемой. В случае, если в документе действительно не должно быть метаданных заголовка, вы все равно можете вернуться к немуpdftotext
.Для выгрузки всех метаданных в текстовый файл (или стандартный вывод) для дальнейшей обработки используйте
или обратитесь к руководству для получения дополнительной информации.
Если вы хотите попробовать ImageMagick ,
compare
но проблемы возникают с несколькими страницами, вы также можете использовать ихpdftk
для извлечения отдельных страниц и сравнения их всех по отдельности (хотя, возможно, достаточно просто сравнить одну страницу).Вот фрагмент кода, который использует этот подход для создания
diff
PDF-вывода, похожего на многостраничный PDF: https://gist.github.com/mpg/3894692источник
Вы смотрели в PDF Content Comparer ? Есть параметры командной строки, которые должны позволить вам автоматизировать процесс.
Вы можете запустить некую логику в журнале различий, который он создает, чтобы увидеть, насколько они похожи.
В противном случае вы можете попытаться временно разбить PDF-файлы на несколько файлов и сравнить их таким образом. У вас, вероятно, все еще будут дубликаты таким образом. Один PDF-файл может содержать дополнительную пустую страницу или что-то такое, что может привести к тому, что все последующие страницы будут сравниваться как совершенно разные.
источник
После скромного вклада в обсуждение (частичный ответ):
После преобразования в текст я использовал бы следующее для вычисления (на основе разности слов) улыбки файла:
(1) производит результат как
(2) = 93
источник
У меня есть скрипт, который просматривает PDF и сначала пытается извлечь текст, используя
pdftotext
, но если это не удается (как это будет с отсканированным документом), он использует ghostscript, чтобы превратить многостраничный отсканированный PDF в серию файлов PNG, а затем использует tesseract для преобразования этой серии в один текстовый файл. Если сканирование имеет достаточное качество, оно делает довольно хорошую работу. Было бы просто добавить код, сравнивающий текст между файлами, но у меня не было этого требования.ghostscript и tesseract имеют открытый исходный код и работают из командной строки.
источник
pdfimages
пакет poppler, без дополнительной потери качества, которую вы можете получить при рендеринге через ghostscript (что негативно влияет на любое распознавание текста, которое вы хотите сделать).pdfimages
, просто делает то же самое, что ghostscript (gs
) здесь, то есть извлекает изображения из pdf в jpg / png. Почему это лучше, чемgs
?gs
/tesseract
(промежуточный формат png) работает немного лучше, чемpdfimages
/tesseract
(промежуточный формат pbm).pdfimages
все же быстрее.Я бы предложил Perl в качестве решения. Есть модуль,
CAM::PDF
который позволяет вам извлекать ... содержимое PDF.Это работает примерно так:
Вы можете извлечь текст и сравнить это.
Только для отсканированных документов - это намного сложнее, но при условии , что они используют одни и те же базовые изображения (например, не сканировали их отдельно), вы, вероятно, можете использовать:
Я не проверял это особенно хорошо, потому что у меня нет ваших исходных документов. Я думаю, что этот подход должен сработать - вы не сравниваете фактическое содержание изображения, потому что… ну, это действительно сложно. Но вы должны быть в состоянии распознать похожие изображения из метаданных.
За идентичных PDF-файлов с разными метаданными, что-то простое, например, хэширование текстового содержимого и метаданных изображения, должно помочь.
источник
Существует приложение для Linux, которое называется recoll . Он может выполнить задачу, но только для PDF-файлов с текстовым слоем.
источник
recoll
кажется, это настольная поисковая система. Я не мог видеть, как использовать это, чтобы найти дубликаты.recoll
используетpdftotext
для обработки PDF-файлов, что ОП пытается здесь избежать.