Потребовалось оперативно перевести множество статей из 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
}