我有一个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
我不知道是否存在类似的东西,所以googled&也在stackoverflow中搜索。但是没有找到任何有用的东西。所以任何人都有任何想法!
更新:明确问题。
答案 0 :(得分:4)
我建议首先使用linux命令行实用程序'pdftotext' - 你可以找到手册页:
该实用程序是PDF处理工具的Xpdf集合的一部分,可在大多数Linux发行版上使用。请参阅http://foolabs.com/xpdf/download.html。
安装完成后,您可以通过pdftotext处理PDF文件:
pdftotext file.pdf file.txt
处理完毕后,这是一个简单的perl脚本,它在生成的文本文件中搜索http URL,并使用LWP::Simple检索它们。 LWP :: Simple-> get('http:// ...')将允许您使用代码段验证URL,例如:
use LWP::Simple;
$content = get("http://www.sn.no/");
die "Couldn't get it!" unless defined $content;
我想,那会完成你想做的事。关于如何编写正则表达式以匹配http URL有很多资源,但是非常简单的一个看起来像这样:
m/http[^\s]+/i
“http后跟一个或多个非空格字符” - 假设URL是属性URL编码。
答案 1 :(得分:2)
您可以使用pdf-link-checker
pdf-link-checker 是一个简单的工具,可以解析PDF文档并检查损坏的超链接。它通过向给定文档中的每个链接发送简单的HTTP请求来实现此目的。
要在GNU / Linux上安装它:
pip install pdf-link-checker
不幸的是,一个依赖项(pdfminer
)被破坏了。解决它:
pip uninstall pdfminer
pip install pdfminer=20110515
答案 2 :(得分:1)
您的问题有两行询问。
您是否在寻找正则表达式验证链接包含http://和有效TLD代码等关键信息?如果是这样,我确信正则表达式专家会过去,或者查看regexlib.com,其中包含许多用于处理URL的现有正则表达式。
或者您想验证网站是否存在然后我会推荐Python + Requests,因为您可以编写检查脚本以查看网站是否存在且不返回错误代码。
这是我目前正在开展的一项任务,其目的几乎与工作相同。我们有大约54k个链接可以自动处理。
答案 3 :(得分:0)
通过以下方式收集链接:
使用API枚举链接,或转储为文本并链接结果,或另存为html PDFMiner。
请求检查它们:
根据您的需求,有很多选择。
答案 4 :(得分:0)
https://stackoverflow.com/a/42178474/1587329的建议是编写此简单工具的灵感(请参阅gist):
Right click > Run as Administrator
保存到'''loads pdf file in sys.argv[1], extracts URLs, tries to load each URL'''
import urllib
import sys
import PyPDF2
# credits to stackoverflow.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
运行。