[英]Java HtmlUnit download pdf file
我想使用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);
}
有什么好办法吗?
没有更多的详细信息和要测试的真实页面,我只能为解决问题提供一些提示。
将您的问题一分为二:
开始之前:
确保您没有JavaScript错误; 错误可能会停止或中断处理。 使用webclient的简单(默认)设置。 仅更改配置以解决问题,并确保您知道自己在做什么。 并确保使用可用的最新(快照)版本。
第1步:
HtmlUnit的工作方式类似于由您(您的程序)驱动的浏览器,而不是用户四处浏览的浏览器。 通常,无需像示例中那样注入javascript。 找到用户通常单击的控件,然后简单地调用click。 由于ajax的原因,您可能需要等待一段时间才能完成所有异步操作。 使用类似于Charles的Web代理(或启用HttpClient有线日志记录)来查看网络流量。 单击正确的控件应导致在Charles中看到pdf下载。
第2步
从您的信息中,我想您正在使用的不是基于HTML的pdf下载页面。 如今,有许多“聪明”的javascript框架围绕着做奇怪的事情来使下载更加用户友好。 这意味着下载是异步完成的,对于您来说,单击操作的结果通常是htmlpage而不是pdf结果。 如果第1步成功,则必须从Web客户端获取新打开的窗口,并从该窗口中获取(pdf)内容。
希望对您有所帮助,如果您需要更多帮助,则必须提供更多详细信息(或者也许可以尝试使用诸如wetator之类的高级工具,该工具可以处理所有这些奇怪的页面,并且具有很多魔力)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.