3

我有一个 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 中搜索和搜索。但是还没有发现任何有用的东西。所以想对任何人有任何想法!

更新:使问题明确。

4

5 回答 5

6

您可以使用pdf-link-checker

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

要使用pip安装它:

pip install pdf-link-checker

不幸的是,一个依赖项 ( pdfminer) 被破坏了。要解决这个问题:

pip uninstall pdfminer
pip install pdfminer==20110515
于 2017-02-11T16:46:44.843 回答
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 编码的。

于 2011-11-19T00:51:06.033 回答
1

您的问题有两条询问线。

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

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

这是我目前在工作中出于几乎相同目的而进行的一项任务。我们有大约 54k 链接可以自动处理。

于 2011-11-12T00:02:51.813 回答
0
  1. 通过以下方式收集链接:
    使用 API 枚举链接,或作为文本转储并链接结果,或保存为 html PDFMiner

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

于 2011-11-12T14:18:58.813 回答
0

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

'''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

于 2018-12-11T06:08:16.547 回答