Как проверить ссылки в файле PDF
У меня есть файл PDF, который я хочу проверить, правильны ли ссылки в нем. Правильно в этом смысле - все указанные URL-адреса связаны с веб-страницами и ничего не нарушено. Я ищу простую утилиту или скрипт, который может сделать это легко?!
Пример:
$ testlinks my.pdf
There are 2348 links in this pdf.
2322 links are proper.
Remaining broken links and page numbers in which it appears are logged in brokenlinks.txt
Я понятия не имею, существует ли что-то подобное, так что гуглил и искал также в stackru. Но ничего полезного пока не нашел. Так что хотелось бы, чтобы кто-нибудь имел представление об этом!
Обновлено: чтобы прояснить вопрос.
4 ответа
Я предлагаю сначала использовать утилиту командной строки linux 'pdftotext' - вы можете найти страницу руководства:
Утилита является частью коллекции инструментов обработки PDF в Xpdf, доступной в большинстве дистрибутивов Linux. См. http://foolabs.com/xpdf/download.html.
После установки вы можете обработать PDF-файл через pdftotext:
pdftotext file.pdf file.txt
После обработки простой Perl-скрипт выполнил поиск в результирующем текстовом файле по URL-адресам http и получил их с помощью LWP:: Simple. LWP:: Simple-> get ('http: //...') позволит вам проверять URL с помощью фрагмента кода, такого как:
use LWP::Simple;
$content = get("http://www.sn.no/");
die "Couldn't get it!" unless defined $content;
Это сделало бы то, что вы хотите сделать, я думаю. Существует множество ресурсов о том, как писать регулярные выражения для соответствия URL-адресам http, но очень простое будет выглядеть так:
m/http[^\s]+/i
"http следует за одним или несколькими непробельными символами" - при условии, что URL-адреса являются закодированными URL-адресами свойств
Ты можешь использовать pdf-link-checker
pdf-link-checker - это простой инструмент, который анализирует PDF-документ и проверяет наличие битых гиперссылок. Это делается путем отправки простых HTTP-запросов к каждой ссылке, найденной в данном документе.
Чтобы установить его на GNU/Linux:
pip install pdf-link-checker
К сожалению, одна зависимость (pdfminer
) сломано. Починить это:
pip uninstall pdfminer
pip install pdfminer=20110515
Есть два вопроса о вашем вопросе.
Вы ищете подтверждение регулярного выражения, что ссылка содержит ключевую информацию, такую как http://, и действительные коды TLD? Если это так, я уверен, что эксперт по регулярным выражениям заглянет или заглянет на http://regexlib.com/, который содержит множество существующих регулярных выражений для работы с URL.
Или вы хотите проверить, существует ли веб-сайт, тогда я бы порекомендовал Python + Requests, поскольку вы можете составить сценарий проверки, чтобы увидеть, существуют ли веб-сайты и не возвращают ли коды ошибок.
Это задача, которую я сейчас выполняю для почти той же цели на работе. У нас есть около 54 тыс. Ссылок для автоматической обработки.
Собирайте ссылки по:
перечисление ссылок с использованием API или вывод в виде текста и связывание результата или сохранение в формате html PDFMiner.Сделайте запросы, чтобы проверить их:
Есть множество вариантов в зависимости от ваших потребностей.
/questions/523232/kak-proverit-ssyilki-v-fajle-pdf/523243#523243 был вдохновением для написания этого простого инструмента (см. суть):
'''loads pdf file in sys.argv[1], extracts URLs, tries to load each URL'''
import urllib
import sys
import PyPDF2
# credits to stackru.com/questions/27744210
def extract_urls(filename):
'''extracts all urls from filename'''
PDFFile = open(filename,'rb')
PDF = PyPDF2.PdfFileReader(PDFFile)
pages = PDF.getNumPages()
key = '/Annots'
uri = '/URI'
ank = '/A'
for page in range(pages):
pageSliced = PDF.getPage(page)
pageObject = pageSliced.getObject()
if pageObject.has_key(key):
ann = pageObject[key]
for a in ann:
u = a.getObject()
if u[ank].has_key(uri):
yield u[ank][uri]
def check_http_url(url):
urllib.urlopen(url)
if __name__ == "__main__":
for url in extract_urls(sys.argv[1]):
check_http_url(url)
Сохранить filename.py
, беги как python filename.py pdfname.pdf
,