Печать HTML и страниц в PDF через Chrome и PowerShell

Потребовалось оперативно перевести множество статей из SharePoint блога в PDF. Первоначальная идея состояла в выгрузке всех статей в файлы в виде html. Для правильной нумерации вначале файла использовался префикс ID с добавлением нулей. В статьях использовались картинки, поэтому ссылки из относительных были преобразованы в полные, чтобы они правильно вывелись на печать.

Следующий шаг был перевод html в pdf. Через PDF Creator и PDF24 не удалось добиться конвертирования, поэтому следующим найденным вариантом было использовать Chrome, в котором имеется возможность сохранения URL адресов и локальных файлов в pdf.

Начиная с Chrome 59 появился режим headless chrome, который позволяется в режиме CLI (без графического интерфейса) запускать браузер. Удобство использования Chrome состоит в том, что картинки остаются на портале и браузер их самостоятельно отрисует в конечном PDF и нет необходимости их предварительного скачивания. Для рендеринга страниц используется движок wkhtmltopdf . На сайте разработчика можно скачать собранные бинарные файлы для использования без браузера https://wkhtmltopdf.org/downloads.html .

Рядом со скриптом создаем папку src, куда складываем заранее скаченные html файлы из портала на стороне сервера. Необходимость скачивания страниц блога в виде html обусловлена еще тем фактом, что на серверах не рекомендуется установка нештатного ПО, а написание CSOM Powershell скрипта для выполнения на рабочей станции еще то удовольствие, которое так же требует дополнительных библиотек SharePoint.


mkdir "$PSScriptRoot\out" -ErrorAction SilentlyContinue

(Get-Item "$PSScriptRoot\src\*.html") | % {

    Write-Host "[convert]" $_.Name

	$srcPath = $_.FullName
    $dstPath = "$PSScriptRoot\out\" + $_.Name.Substring(0, $_.Name.length-4) + "pdf"

    $args = @(
        '--headless',
        '--disable-gpu',
        '--no-margins',
        '--enable-logging',
        ('--print-to-pdf=' + '"' + $dstPath + '"'),
        ('"' + $srcPath + '"')
    )
    
    Start-Process -FilePath 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' `
        -ArgumentList ($args -join " ") `
        -Wait

}

Достаточно просто можно модифицировать данный скрипт для сохранения ссылок в PDF.

Для этого сохраняем ссылки в файл url.txt рядом с немного измененным скриптом.


mkdir "$PSScriptRoot\out" -ErrorAction SilentlyContinue

(Get-Content "$PSScriptRoot\url.txt") | % {

    Write-Host "[convert]" $_

	$srcPath = $_
    $dstPath = "$PSScriptRoot\out\" + ($_ -replace "[^a-z0-9\-]+","_") + ".pdf"

    $args = @(
        '--headless',
        '--disable-gpu',
        '--no-margins',
        '--enable-logging',
        ('--print-to-pdf=' + '"' + $dstPath + '"'),
        ('"' + $srcPath + '"')
    )
    
    Start-Process -FilePath 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' `
        -ArgumentList ($args -join " ") `
        -Wait
}

Оставьте комментарий

Ваш адрес email не будет опубликован.