使用 Powershell 编写具有 printSelectedDiv javascript 的网页的脚本 pdf 打印



在几个脚本中,我在Powershell中使用wkhtmltopdf来无头打印网页内容的pdf。 这很有效,除了在忙于小部件和JavaScript复杂性的网站上,pdf打印输出是一团糟。

一个这样的网页提供了一个打印按钮,并使用javascript printSelectedDiv。 这将打开 Windows 打印对话框,并将从复杂页面中准确打印所需的div。

我能够使用Powershell自动单击和提交打印作业。 但是,我希望以无头方式在计划任务中像其他几个脚本一样执行此操作。

我能够使用发送密钥自动打印,如下所示:

$ie = new-object -ComObject "InternetExplorer.Application"
$requestUri = "https://www.complexpagefullofwidgets.com"
$ie.silent = $true
$ie.navigate($requestUri)
while($ie.Busy) { Start-Sleep -Milliseconds 100 }
$doc = $ie.Document
$pdfPrinter = Get-WmiObject -Class Win32_Printer | Where{$_.Name -eq "Microsoft Print to PDF"}
$pdfPrinter.SetDefaultPrinter() | Out-Null
$printButton = $doc.getElementsByTagName("a") | Where-Object {$_.id -eq "btnPrintList"}
$printButton.click()
Start-Sleep -Second 2
$wshell = New-Object -com WScript.Shell
$wshell.sendkeys("{ENTER}")
Start-Sleep -Milliseconds 500
$wshell.sendkeys("%n")
Start-Sleep -Milliseconds 500
$wshell.sendkeys("c:temptemp.pdf")
$wshell.sendkeys("{ENTER}")

是否有更好的脚本控制而不是发送击键? 我不知道发送击键是否会在计划任务中可靠地无头工作(如果有的话)。

如果你想继续使用wkhtmltopdf,你可以使用这种方法。

你的代码完全完成了工作,你需要做的就是调用$printButton.click()方法,然后回来检查$ie.DocumentBody.InnerHTML对象将包含你请求的页面的完整 HTML,所以你可以把它发送到 wkhtmltopdf。

$ie.Document.body.innerHTML > c:tempPage.html
& 'C:Program Fileswkhtmltopdfbinwkhtmltopdf.exe' c:temppage.html c:temppage.pdf

唯一的问题是解决图像 URL,您必须替换标签中的 URL,将它们从相对链接更改为绝对链接,将 \ 替换为您正在加载的页面的完整 URL。

最新更新