如何验证 PDF 文件中的链接

问题描述 投票:0回答:6

我有一个 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

我不知道是否存在类似的东西,所以也在 stackoverflow 中进行了谷歌搜索。但目前还没有发现什么有用的东西。所以希望任何人对此有任何想法!

更新:使问题更清楚。

linux pdf hyperlink utility verify
6个回答
6
投票

您可以使用

pdf-link-checker

pdf-link-checker 是一个简单的工具,可以解析 PDF 文档并检查损坏的超链接。它通过向给定文档中找到的每个链接发送简单的 HTTP 请求来实现此目的。

使用 pip 安装它:

pip install pdf-link-checker

不幸的是,一个依赖项 (

pdfminer
) 被破坏了。要修复它:

pip uninstall pdfminer
pip install pdfminer==20110515

5
投票

我建议首先使用 Linux 命令行实用程序“pdftotext” - 您可以找到手册页:

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
投票

您的问题有两行询问。

您是否正在寻找正则表达式验证该链接是否包含关键信息(例如 http:// 和有效的 TLD 代码)?如果是这样,我确信正则表达式专家会过来,或者看看 regexlib.com,其中包含许多用于处理 URL 的现有正则表达式。

或者您想验证网站是否存在,那么我会推荐 Python + Requests,因为您可以编写检查脚本来查看网站是否存在并且不返回错误代码。

这是我目前在工作中出于几乎相同目的而承担的任务。我们有大约 54k 个链接需要自动处理。


0
投票
  1. 收集链接:
    使用 API 枚举链接,或转储为文本并链接结果,或另存为 html PDFMiner

  2. 提出检查请求:
    根据您的需求,有多种选择。


0
投票

https://stackoverflow.com/a/42178474/1587329的建议是编写这个简单工具的灵感(参见gist):

'''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
,以
python filename.py pdfname.pdf
运行。


0
投票

有一个名为

pdf-link-checker
的工具可以做到这一点并且对我来说效果很好。它实际上运行正确,不像运行时得到的
pdf-link-checker
pip install pdf-link-checker

© www.soinside.com 2019 - 2024. All rights reserved.