Эмодзи стали серыми в выводе PDF из Chrome Headless

#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:

Я столкнулся с той же проблемой и провел некоторый поиск. Проблема, похоже, двоякая.

  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' аргумент, будет игнорировать правила печати носителей. Если вы используете это, вы увидите, что часть содержимого теперь имеет цвета, ссылки тоже выглядят лучше.

  1. Вторая проблема, похоже, заключается в том, как Chrome печатает pdf. Pyppeteer фактически использует функцию «Печать в PDF», предоставляемую Chrome. Итак, проблема на самом деле не в Pyppeteer.

Чтобы подтвердить это, я создал простую веб-страницу, на которой было несколько эмодзи и не было css для печати мультимедиа. Когда я вручную открываю страницу в Chrome и сохраняю ее в формате PDF, эмодзи отображаются черным цветом.

Комментарии:

1. FWIW, я также обнаружил аналогичную проблему, о которой сообщалось в Puppeteer , которая предполагает, что проблема связана с Chrome / Chromium.

2. Я не уверен, что понял вашу часть о «второй проблеме», второй проблемы нет?

3. Я согласен; «вторая проблема» на самом деле не является частью проблемы, которую вы опубликовали. Предполагая, что кто-то наткнется на этот пост, пытаясь преобразовать страницу с эмодзи в PDF, я подумал добавить, что, хотя они могут обойти правила печати CSS (если это применимо к их веб-странице), они, скорее всего, столкнутся со «второй проблемой».