我想使用HtmlUnit从网站下载pdf文件,但我无法做到。点击此按钮即可触发下载:
<form name="form" action="ADIR_24046/civil/documentos/docuN.php" method="post" target="w1">
<input type="hidden" name="dtaDoc" value="7F547EA1167820365C20BA632B62A44E0B8F37564FCB3369284927C9763DE47F23DF398C061062F1">
<i class="fa fa-file-pdf-o fa-lg" aria-hidden="true" style="color:#ab5659; cursor:pointer;" onclick="$(this).closest("form").submit();"></i>
</form>
到目前为止,每当我尝试这样做时,当我打开文件时,它说它们已经损坏了。我下载文件的代码是:
public void getFile(HtmlTableRow row, String folio) throws IOException {
HtmlPage pdfPage = (HtmlPage) frame.executeJavaScript("document.getElementById('historiaCiv').children[0].children[0].children[" +
row.getIndex() + "].children[1].children[0].children[1].children[0].closest('form').submit()").getNewPage();
ReadableByteChannel rbc = Channels.newChannel(pdfPage.getWebResponse().getContentAsStream());
FileOutputStream fos = new FileOutputStream(/* download path */, false);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
}
有没有好办法呢?
答案 0 :(得分:0)
没有任何更多的细节和真实的测试页面我只能提供解决问题的一些提示。
将问题分成两部分:
开始之前:
确保您没有javascript错误;也许错误会停止或中断处理。使用webclient的simples(默认)设置。仅更改配置以解决问题并确保您知道自己在做什么。并确保使用最新的(快照)版本。
第1步:
HtmlUnit的工作方式类似于由您(您的程序)驱动的浏览器,而不是用户点击。通常不需要像你在样本中那样注入javascript。找到用户通常点击的控件,只需点击此处即可。由于ajax,你可能会在点击一段时间后等待完成所有异步操作。 使用像Charles这样的Web代理(或启用HttpClient线路日志记录)来查看网络流量。单击右侧控件将导致查看器中显示pdf donwload。
第2步
从你的信息我猜你正在使用一个不在Html基础上进行普通pdf下载的页面。今天有很多聪明的人。 javascript框架周围做了一些奇怪的事情,使下载更加用户友好。这意味着下载是异步完成的,对于您而言,单击操作的结果通常是htmlpage而不是pdf结果。如果步骤1成功,您必须从webclient获取新打开的窗口并从中获取(pdf)内容。
希望有所帮助,如果您需要更多帮助,您必须提供更多详细信息(或者您可以尝试使用更高级别的工具,比如使用具有很多魔力的更高级别的工具来处理所有这些奇怪的页面)。