如何自动下载生成的 PDF

How to automate download of generated PDFs

场景:
我们需要每天将数据输入欧洲国家的政府数据库。我们突然需要检索其中的一些数据。但他们唯一允许的格式是从数据生成的 PDF——其中有数百个。我们希望避免坐在网络浏览器前点击 link 之后的 link。

生成的 link 看起来像

<a href='javascript:viajeros("174814255")'>
  <img src="img/pdf.png">
</a>

我对Javascript几乎没有经验,不知道能不能安装一个例程作为书签循环遍历DOM,找到所有link s,并调用该函数。也不是,如果可以的话,怎么写。

身份证号码无法预测,所以我不能再写一个页面或curl/wget脚本来做。 (如果我可以,它仍然会失败,如下所述。)

'viajeros'函数很简单:

function viajeros(id){
  var idm = document.forms[0].idioma.value;
  window.open("parteViajeros.do?lang="+idm+"&id_fichero=" + id);
}

但是将该 URI 提供给 curl 或 wget 失败。显然他们检查 cookie 或 REFERER 并生成错误。

此外,每次 link 将 PDF 放在浏览器选项卡而不是下载目录中,我们仍然需要进行数百次两次点击(选项卡和保存)。

我应该怎么做?

物有所值,这是在 MacOS 10.13.4 上。我通常使用 Safari,但我也可以使用 Opera 和 Firefox。我可以安装 Chrome,但这是最后的手段。不,倒数第二个:我们还有一台(不寒而栗)Windows 10 笔记本电脑。这是最后的手段。

(注意:我查看了四个看起来很有希望的建议重复项,但每个重复项要么没有答案,要么指示提问者修改生成 PDF 的代码。)

我遇到过类似的情况,我必须下载一天或过去一周内生成的所有(发票)pdf。

所以经过一些研究,我能够使用 PhantomJS and later I discovered casperjs 进行抓取,这让我的工作变得简单。

phantomJs 和 casperjs 是无头浏览器。

由于您对 JS 的经验较少,并且 如果您是 C# 专家,那么 CefSharp 可能会对您有所帮助。

一些有用的链接:

开始使用 phantom、casper 和 cefSharp

PhantomJs

CasperJs

CefSharp

尝试阅读下载文件的文档。

document.querySelectorAll("img[src=\"img/pdf.png\"]")
    .forEach((el, i) => {
      let id = el.parentElement.href.split("\"")[1];
      let url =
          "parteViajeros.do?lang=" + document.forms[0].idioma.value +
          "&id_fichero=" + id;
      setTimeout(() => {
        downloadURI(url, id);
      }, 1500 * i)
    });

这会获取 PDF 图标的所有图像,然后查看它们的父对象以获得 link 目标。此 href 已提取其 ID,并传递给一个字符串结构,该结构构成要下载的文件的路径,类似于“viajeros”但没有 window.open。这个 URL 然后被传递给 downloadURI 执行下载。

这使用了 another Stack Overflow answer 中的 downloadURI 函数。您可以通过在 link 上设置下载属性然后单击它来下载 URL,这是这样实现的。这仅在 Chrome.

中测试过
function downloadURI(uri, name) {
  var link = document.createElement("a");
  link.download = name;
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  delete link;
}

打开带有 link 的页面并打开控制台。先粘贴 downloadURI 函数,然后粘贴上面的代码以下载所有 links.