Эквивалент рендеринга формы =»crispEdges» в PDF

#pdf #svg

#PDF #svg

Вопрос:

Рассмотрим следующий SVG:

 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 40 20">
  <g shape-rendering="crispEdges">
    <rect x="0" y="0" width="20" height="20" fill="#b4b4b4"/>
    <rect x="20" y="0" width="20" height="20" fill="#b4c4b4"/>
  </g>
</svg>
  

Предполагаемый эффект shape-rendering="crispEdges" аннотации заключается в том, чтобы предотвратить появление видимого шва между двумя прямоугольниками, независимо от того, как масштабируется рендеринг. Это работает так, как задумано, при просмотре SVG-файла как в Firefox, так и в Chromium. Однако, когда я конвертирую SVG в PDF с помощью inkscape -A и просматриваю PDF, я все еще вижу видимый шов при некоторых уровнях масштабирования, например, как на этом снимке экрана:

снимок экрана PDF, преобразованный из примера SVG, просматриваемый в Evince при увеличении, где между двумя прямоугольниками виден шов

Более того, поток страниц PDF, создаваемый inkscape, идентичен с и без shape-rendering="crispEdges"

 1 0 0 -1 0 15 cm
q
0.705882 0.705882 0.705882 rg /a0 gs
0 0 15 15 re f
0.705882 0.768627 0.705882 rg 15 0 15 15 re f
Q
  

и /ExtGState словарь, на который ссылаются как /a0 , также идентичен:

 /ExtGState <<
  /a0 <<
    /CA 1
    /ca 1
  >>
>>
  

Это может означать, что в PDF нет эквивалента этой функции SVG, или это может означать, что PDF-экспортер Inkscape не реализует эквивалент. Мне не повезло найти что-либо, похожее на эту функцию SVG в спецификации PDF, что является аргументом в пользу «отсутствия эквивалента», но спецификация PDF огромна, и я мог легко что-то пропустить.

Итак, вопрос таков: есть или нет эквивалент в PDF этой функции SVG, и если есть, то как мне его использовать? Я готов отредактировать свой экспортированный PDF вручную, если потребуется.

Примечание 1: Пример минимален; Изначально я заметил проблему с гораздо более сложным рисунком из академической статьи, в котором много таких прямоугольников, выровненных по сетке, но некоторые позиции сетки пусты. Я попытался увеличить прямоугольники на исходном рисунке, чтобы они перекрывались, и мне не удалось найти величину увеличения, которая устранила бы все видимые швы, не вызывая также видимого перетекания прямоугольников в пустые пространства.

Примечание 2: С исходным рисунком проблема видна с Evince, pdf.js и два принтера, изготовленные разными компаниями.

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

1. В PDF такой функции нет. Хотя я бы предположил, что, судя по фрагменту PDF, механизм рендеринга не должен отображать пробел.

2. @KenS Ну, возможно, да, но это так , и на гораздо более сложной графике, из которой это вырезано (также с точно выровненными прямоугольными краями), показаны швы с помощью двух разных программ просмотра PDF и одного принтера. Я также попытался сделать так, чтобы прямоугольники слегка перекрывались, и не смог найти количество перекрытий, которое устранило бы швы без других видимых побочных эффектов.

3. Все программы просмотра PDF? Или собственные, такие как Adobe?

4. Ну, очевидно, я не могу подробно прокомментировать только короткий раздел здесь. Я не говорю, что механизмы рендеринга PDF не имеют пробелов, просто они не должны. Из того, что представлено, перекрытие также не должно быть видно, и если это так, то опять же, я бы сказал, что это ошибка в механизме рендеринга. Я полагаю, вы используете pdf.js чтобы просмотреть PDF-файлы в веб-браузере? Это заведомо плохой рендеринг, хотя обычно из-за прозрачности он не получается правильным. Простые вещи обычно в порядке. И факт остается фактом, нет способа определить два объекта в PDF как точно выровненные.

5. Оба прямоугольника однотонные. Итак, вы рассматривали возможность устранения проблемы, просто расширив серый прямоугольник вправо, чтобы зеленый прямоугольник перекрывал его? jsfiddle.net/x0hftnr5

Ответ №1:

Ближе всего в PDF было бы использовать затеняющие сетки (например, тензорные и решетчатые сетки свободной формы). Это удалит фрагменты в большинстве программ просмотра.

Некоторые программы просмотра PDF (например, Acrobat, Xodo / PDFTron) имеют опции, которые минимизируют вид этих фрагментов, но, как правило, это не очень хорошо реализовано во многих реализациях.