Как извлечь все ссылки из файла PDF?

По стандарту ссылки скрыты в Аннотациях (раздел 12.5.6.5 спецификаций). Отсюда легко извлечь адрес: other-method">Извлечение ссылок на страницы в другом PDF из PDF с помощью Python или другого метода Но очень часто ссылки представлены не как специальные объекты в документе, а как обычный текст, например "http://blah-blah.com". Как извлечь не только ссылки из аннотаций, но и ссылки из самого текста? Я могу искать по всему тексту и находить такие слова, как «http://», но есть ли более оптимальное решение? Редакторы PDF также выделяют текстовые ссылки, как они узнают, что этот фрагмент текста является гиперссылкой?


person m9_psy    schedule 15.07.2015    source источник
comment
Они не знают, они догадываются. Вам придется сделать то же самое (надеюсь, вы сможете сделать это лучше).   -  person Jongware    schedule 15.07.2015
comment
Я предполагаю, что вы отклонили его вопрос по причине, которую вы неправильно указали выше. Они не угадывают, они определяют URL-адреса. Это правильный вопрос. Вот пример механизма, как они могут это сделать: css -tricks.com/snippets/php/find-urls-in-text-make-links   -  person Bryan Dimas    schedule 31.10.2015


Ответы (3)


К сожалению, URL-адреса, не сохраненные в виде аннотаций, а просто встроенные в текст содержимого, не имеют особой видимости в PDF-файлах. Нет другого решения, кроме поиска полного текста PDF и сопоставления URL-адресов с образцом.

person Rob Lyman    schedule 15.07.2015

Я только что сделал pdfx, небольшой инструмент именно для этой задачи: загрузить все PDF-файлы из заданного PDF-файла. Он написан на Python и выпущен как с открытым исходным кодом под лицензией GPLv3: http://www.metachris.com/pdfx

Вы можете использовать инструмент pdfx, чтобы отобразить все URL-адреса PDF, все URL-адреса (с -v), а также загрузить все упомянутые PDF-файлы (с помощью -d):

$ pdfx https://weakdh.org/imperfect-forward-secrecy.pdf -d ./
Reading url 'https://weakdh.org/imperfect-forward-secrecy.pdf'...
Saved pdf as './imperfect-forward-secrecy.pdf'
Document infos:
- CreationDate = D:20150821110623-04'00'
- Creator = LaTeX with hyperref package
- ModDate = D:20150821110805-04'00'
- PTEX.Fullbanner = This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1
- Producer = pdfTeX-1.40.14
- Title = Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice
- Trapped = False
- Pages = 13

Analyzing text...
- URLs: 49
- URLs to PDFs: 17

JSON summary saved as './imperfect-forward-secrecy.pdf.infos.json'

Downloading 17 referenced pdfs...
Created directory './imperfect-forward-secrecy.pdf-referenced-pdfs'
Downloaded 'http://cr.yp.to/factorization/smoothparts-20040510.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/smoothparts-20040510.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35517.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35517.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35514.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35514.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35519.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35519.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35522.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35522.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35509.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35509.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35528.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35528.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35513.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35513.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35533.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35533.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35551.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35551.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35527.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35527.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35520.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35520.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35526.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35526.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35515.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35515.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35529.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35529.pdf'...
Downloaded 'http://cryptome.org/2013/08/spy-budget-fy13.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/spy-budget-fy13.pdf'...
Downloaded 'http://www.spiegel.de/media/media-35671.pdf' to './imperfect-forward-secrecy.pdf-referenced-pdfs/media-35671.pdf'...

Вы можете установить его с помощью $ easy_install -U pdfx.

Под капотом pdfx использует PyPDF2, библиотеку Python для чтения содержимого PDF, а затем регулярное выражение для соответствия всем URL-адресам.

person Chris Hager    schedule 16.10.2015
comment
Только находит PDF-файлы в PDF-файлах. Не URL. - person Bryan Dimas; 27.10.2015
comment
Вы можете запустить pdfx с флагом -v, чтобы увидеть все ссылки, а не только PDF-файлы. - person Chris Hager; 28.10.2015
comment
Хорошо, в таком случае это очень полезно! +1 - person Bryan Dimas; 31.10.2015
comment
pdf.get_references_as_dict() сделал всю работу за меня. Спасибо! - person Ernest; 14.11.2017
comment
Выглядит соблазнительно полезным. Однако: он получает либо ссылки, либо текст ссылок, но не оба вместе. Он даже получает список ссылок. Но не включает текст с каждой ссылкой. Автор, зайдя так далеко, мог бы пройти последние несколько ярдов. Я обнаружил, что pdf.get_references_as_dict() извлекает не словарь ссылок, а словарь, содержащий один список ссылок, проиндексированный строкой «url». (Извините, @ChrisHager: мне нужно найти мой логин на Github, поэтому я не сделал полезный отчет напрямую). ОДНАКО: ***** это единственный инструмент, который я обнаружил, что wd просто получает все ссылки, даже среди множества читателей PDF ***** - person markling; 01.03.2018

строки "somePDFfile.pdf" | грэп http

person ibisum    schedule 05.05.2017
comment
Это работает еще лучше, если вы используете pdftk, чтобы сначала распаковать его: pdftk in.pdf cat output out.pdf uncompress; strings out.pdf | grep -i http - person Ben Stern; 12.09.2018