Утверждение содержимого PDF, созданного wkhtmltopdf (недетерминированное поведение с несколькими шрифтами) - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть некоторый код PHP, который генерирует HTML и преобразует его в PDF с помощью wkhtmltopdf (версия 0.12.5).
У меня также есть тестовый пример PHP, который подтверждает, что PDF создан, но я также хочу подтвердить содержание PDF.

Я уже удаляю поле CreationDate из PDF, прежде чем сравнивать их, как предложено в . Wkhtmltopdf генерирует различную контрольную сумму при каждом запуске . Но wkhtmltopdf по-прежнему дает разные результаты для одного и того же ввода, если у него несколько шрифтов.

Вот небольшой пример HTML-файла, который воспроизводит проблему:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <div>
            <strong>Hello</strong>
            <span style="text-decoration: underline;">World</span>
        </div>
    </body>
</html>

И несколько команд оболочки для иллюстрации проблемы:

wkhtmltopdf minimal_example.html t1.pdf
sleep 2
wkhtmltopdf minimal_example.html t2.pdf
sed 's#/CreationDate (D:[^)]*)##' t1.pdf > t1_stripped.pdf
sed 's#/CreationDate (D:[^)]*)##' t2.pdf > t2_stripped.pdf
sha256sum t1_stripped.pdf
sha256sum t2_stripped.pdf 

В большинстве случаев он выводит две разные контрольные суммы, хотя файлы PDF выглядят одинаково. Я открыл PDF-файлы в UTF-8, и мне кажется, что порядок, в котором определены различные шрифты (в данном примере жирный и подчеркнутый), является случайным.

Итак, теперь возникает вопрос: как проще всего утверждать, что два PDF-файла равны? Я бы предпочел утверждать как можно большую часть PDF, желательно без новых зависимостей.

  1. Есть ли способ удалить случайность из wkhtmltopdf, чтобы я мог утверждать весь PDF?
  2. Если нет, то как лучше всего утверждать содержание PDF? Сравнение их в виде изображений, как описано здесь , было бы возможно, хотя я хотел бы избежать введения двух новых зависимостей (Imagick и GhostScript) только для этого.
  3. Есть ли другие возможности? Преобразование PDF в текст будет недостаточным, так как я хочу также утверждать различные шрифты.
...