使用 Powershell 打印具有 printSelectedDiv javascript 的网页的脚本 pdf 打印
Script pdf printing of webpage that has printSelectedDiv javascript using Powershell
在几个脚本中,我在 Powershell 中使用 wkhtmltopdf 来无头打印网页内容的 pdf。这很好用,除了在忙于小部件和 javascript 复杂性的网站上,在这些网站上 pdf 打印输出是一团糟。
一个这样的网页提供了一个打印按钮并使用 javascript printSelectedDiv
。这将打开 Windows 打印对话框,并将从复杂页面中准确打印所需的 div。
我可以使用 Powershell 自动点击并提交打印作业。但是,我想以无头的方式像其他几个脚本一样在计划任务中执行此操作。
我可以使用 Sendkeys 自动打印如下:
$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:\temp\temp.pdf")
$wshell.sendkeys("{ENTER}")
是否有更好的脚本控制此过程而不是发送击键?我不知道发送击键是否会在计划任务中可靠地无头地工作。
如果您想继续使用 wkhtmltopdf,可以使用这种方法。
您的代码完全完成了工作,您需要做的就是调用 $printButton.click()
方法,然后返回检查 $ie.Document
,Body.InnerHTML
对象将包含完整的 HTML 您请求的页面,因此您可以将其发送到 wkhtmltopdf。
$ie.Document.body.innerHTML > c:\temp\Page.html
& 'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' c:\temp\page.html c:\temp\page.pdf
唯一的问题是解析图像 URL,您必须替换标签中的 urls,将它们从相对链接更改为绝对链接,将 \ 替换为完整的 url 您正在加载的页面。
在几个脚本中,我在 Powershell 中使用 wkhtmltopdf 来无头打印网页内容的 pdf。这很好用,除了在忙于小部件和 javascript 复杂性的网站上,在这些网站上 pdf 打印输出是一团糟。
一个这样的网页提供了一个打印按钮并使用 javascript printSelectedDiv
。这将打开 Windows 打印对话框,并将从复杂页面中准确打印所需的 div。
我可以使用 Powershell 自动点击并提交打印作业。但是,我想以无头的方式像其他几个脚本一样在计划任务中执行此操作。
我可以使用 Sendkeys 自动打印如下:
$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:\temp\temp.pdf")
$wshell.sendkeys("{ENTER}")
是否有更好的脚本控制此过程而不是发送击键?我不知道发送击键是否会在计划任务中可靠地无头地工作。
如果您想继续使用 wkhtmltopdf,可以使用这种方法。
您的代码完全完成了工作,您需要做的就是调用 $printButton.click()
方法,然后返回检查 $ie.Document
,Body.InnerHTML
对象将包含完整的 HTML 您请求的页面,因此您可以将其发送到 wkhtmltopdf。
$ie.Document.body.innerHTML > c:\temp\Page.html
& 'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' c:\temp\page.html c:\temp\page.pdf
唯一的问题是解析图像 URL,您必须替换标签中的 urls,将它们从相对链接更改为绝对链接,将 \ 替换为完整的 url 您正在加载的页面。