如何验证PDF文件中的链接

时间:2011-11-11 22:11:36

标签: linux pdf hyperlink utility verify

我有一个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中搜索。但是没有找到任何有用的东西。所以任何人都有任何想法!

更新:明确问题。

5 个答案:

答案 0 :(得分:4)

我建议首先使用linux命令行实用程序'pdftotext' - 你可以找到手册页:

pdftotext man page

该实用程序是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)

  1. 通过以下方式收集链接:
    使用API​​枚举链接,或转储为文本并链接结果,或另存为html PDFMiner

  2. 请求检查它们:
    根据您的需求,有很多选择。

答案 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运行。