如何自动下载生成的 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
尝试阅读下载文件的文档。
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.
场景:
我们需要每天将数据输入欧洲国家的政府数据库。我们突然需要检索其中的一些数据。但他们唯一允许的格式是从数据生成的 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
尝试阅读下载文件的文档。
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.