#puppeteer #google-chrome-headless #pyppeteer #printtopdf
#кукольник #google-chrome-без головы #pyppeteer #printtopdf
Вопрос:
(Обратите внимание, что, хотя в этом упоминается Pyppeteer, версия Puppeteer для Python, код точно такой же и работает как с Puppeteer, так и с Pyppeeteer).
Привет,
Я конвертирую страницу http://getemoji.com / в PDF, используя следующий код :
import asyncio
from pyppeteer import launch
from pyppeteer.launcher import connect
async def main():
browser = await launch()
context = await browser.createIncognitoBrowserContext()
page = await context.newPage()
page.on('dialog', lambda dialog: dialog.dismiss())
# await page.emulateMedia('print')
await page.goto('http://getemoji.com/')
await page.screenshot({'path': 'example.png'})
await context.close()
await browser.disconnect()
asyncio.get_event_loop().run_until_complete(main())
И он правильно генерирует следующее изображение:
Но если я попытаюсь преобразовать страницу в PDF, например, так:
await page.pdf({
'path': 'example.pdf',
'format': 'A4'
})
Все смайлики выделены серым цветом в результирующем PDF-файле, вот так:
Проблема не в шрифте эмодзи, поскольку они отлично работают на скриншоте. Это связано с тем, как создается PDF, но я не могу понять, почему.
Я надеюсь, что вы найдете это 🙂
Комментарии:
1. Интересно, может быть, в CSS нет правила, в котором говорится «сохранять стиль при печати» специально для эмодзи?
Ответ №1:
Я столкнулся с той же проблемой и провел некоторый поиск. Проблема, похоже, двоякая.
- Как вы уже догадались, это связано с правилами CSS для печати на носителях. Сайт использует загрузочный css-файл, который имеет следующие правила:
@media print {
* {
color: #000!important;
text-shadow: none!important;
background: 0 0!important;
box-shadow: none!important
}
...
}
что дает общее правило для того, чтобы цвет переднего плана всего содержимого был черным при его печати.
К счастью, Pyppeteer предоставляет API для определения типа носителя, который будет использоваться для печати содержимого: page.emulateMedia, который, если указан 'screen'
аргумент, будет игнорировать правила печати носителей. Если вы используете это, вы увидите, что часть содержимого теперь имеет цвета, ссылки тоже выглядят лучше.
- Вторая проблема, похоже, заключается в том, как Chrome печатает pdf. Pyppeteer фактически использует функцию «Печать в PDF», предоставляемую Chrome. Итак, проблема на самом деле не в Pyppeteer.
Чтобы подтвердить это, я создал простую веб-страницу, на которой было несколько эмодзи и не было css для печати мультимедиа. Когда я вручную открываю страницу в Chrome и сохраняю ее в формате PDF, эмодзи отображаются черным цветом.
Комментарии:
1. FWIW, я также обнаружил аналогичную проблему, о которой сообщалось в Puppeteer , которая предполагает, что проблема связана с Chrome / Chromium.
2. Я не уверен, что понял вашу часть о «второй проблеме», второй проблемы нет?
3. Я согласен; «вторая проблема» на самом деле не является частью проблемы, которую вы опубликовали. Предполагая, что кто-то наткнется на этот пост, пытаясь преобразовать страницу с эмодзи в PDF, я подумал добавить, что, хотя они могут обойти правила печати CSS (если это применимо к их веб-странице), они, скорее всего, столкнутся со «второй проблемой».