【问题标题】:how to verify links in a PDF file如何验证 PDF 文件中的链接
【发布时间】:2011-12-27 09:17:07
【问题描述】:

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


    【解决方案1】:

    您的问题有两条询问线。

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

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

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

    【讨论】:

    • 我的问题是验证链接是否没有损坏!谢谢。我已经正确更新了问题。
    • 链接断开时是否定义为不正确的 http 语法或 HTTP 错误?
    • 您能举出此类页面错误的示例吗?我强烈建议您使用请求,看看您可以将什么逻辑应用于来自 HTTP 的响应。
    【解决方案2】:
    1. 通过以下方式收集链接:
      使用 API 枚举链接,或转储为文本并链接结果,或保存为 html PDFMiner

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

    【讨论】:

      【解决方案3】:

      我建议首先使用 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://...') 将允许您使用代码 sn-p 验证 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 编码的。

      【讨论】:

      • 无论如何,谢谢,我会用这些实用程序编写我自己的脚本!
      • @user379997:你会发布那个脚本吗?
      【解决方案4】:

      您可以使用pdf-link-checker

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

      pip安装它:

      pip install pdf-link-checker
      

      不幸的是,一个依赖项 (pdfminer) 已损坏。修复它:

      pip uninstall pdfminer
      pip install pdfminer==20110515
      

      【讨论】:

      • 关于 pdfminer 的注释拯救了我的一天
      • 不幸的是,目前在 Python 3.7 下不起作用。产生语法错误。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多