Создание Python / PDF с помощью ReportLab – самодельные сетки с рисунком, но отлично смотрятся на экране

Я пытаюсь создать свою собственную сетку (это выглядит так: http://tinyurl.com/cdyre6k – документ ЭКГ, который находится в метрических единицах в миллиметрах).

Я использую ReportLab / Python (opensource) для создания этих отчетов. Ниже приведен фрагмент моего кода.

На экране это выглядит БОЛЬШИМ !:

> Что я вижу на экране <

Однако, когда я отправляю это на принтер (и да, я также потрудился с настройками принтера), он печатает некоторые строки, а не другие (иногда это методично и печатает клетчатый плед, в других случаях это более толстые / более тонкие линии , имейте в виду, что вывод на принтере согласован в зависимости от установленных по умолчанию строчек).

> Что я вижу на принтере! <

Я пробовал всевозможные комбинации строк, и всевозможные комбинации настроек принтера … Я не могу заставить его правильно печатать! Я попробовал альтернативный принтер и получил намного лучшие результаты, но мне нужно установить настройки принтера на 1200 dpi (печать уровня САПР). Другой принтер установлен на 600 точек на дюйм. На этом SAME PRINTER (600dpi) я печатаю документ, сделанный бывшим сотрудником, и он отлично отпечатан (обратите внимание, что он не использовал ReportLab, поэтому я не могу использовать его код / ​​решение).

Что происходит? Это проблема с псевдонимом на принтере? Помогло бы мне, если бы я покрыл свои сетки растровыми изображениями (или другим форматом)? Как я могу это исправить (мои единственные варианты – использовать Python и ReportLab)? Руководство ReportLab не помогло, «Google» не помогло, и предыдущие вопросы в StackExchange, похоже, не охватывали эту конкретную тему. Я могу заставить сетку напечатать все строки, если я установил ширину строчки на «1», но тогда малые линии сетки слишком толстые.

Конечный результат заключается в линейной диаграмме, над которой я работаю, и я знаю, что ReportLab имеет функции диаграммы, но reportlabs chart / grid function (s) не дают мне то, что мне нужно для моего проекта, поэтому я был вынужден сделать свой (может быть, я что-то пропустил и открылся для альтернативных методов, но в настоящее время он отлично выглядит в формате PDF, а не на принтере).

ЛЮБЫЕ советы приветствуются!

ТИА,

-J

for i in decimal_range(0, _time, 1): if (i % 5.0 == 0): if (i % 25.0 == 0): grid_pattern.add(shapes.Line(_temp_x, (_temp_y + _height_of_box), _temp_x, (_temp_y + _height_of_box+4), strokeWidth=1, strokeColor=colors.black)) else: pass grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, (_temp_y + _height_of_box), strokeWidth=.12, strokeColor=colors.pink)) else: grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, (_temp_y + _height_of_box), strokeWidth=.12, strokeColor=colors.pink)) _temp_x += 1 * mm _temp_x = xorigin for i in range(0, _mv, 1): if (i % 5.0 == 0): grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x + _width_of_box, _temp_y, strokeWidth=.12, strokeColor=colors.pink)) else: grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x + _width_of_box, _temp_y, strokeWidth=.12, strokeColor=colors.pink)) _temp_y += 1 * mm 

Update1

Я попытался установить ширину штриха на «0», как рекомендовано несколькими плакатами (и сообществом ReportLab / списком рассылки) следующим образом:

 grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, (_temp_y + _height_of_box), strokeWidth=0, strokeColor=colors.pink)) 

Это делает единую пиксельную линию, которая снова отлично смотрится на ПК, но все же печатает с фанки в PDF.

UPDATE2 + РЕШЕНИЕ

После LOTS истерик и аргументов с ReportLab и моим компьютером оказывается, что это не мой компьютер или ReportLab. Это были принтеры (несмотря на то, что я использовал два совершенно разных принтера Canon и HP – модели). Я чувствовал, что у меня достаточно покрытия, чтобы исключить принтер, но есть еще одна проблема! Продолжить чтение…

ReportLab фактически не рисует линию, она просто добавляет строку postscript, которая сообщает рендерингу о том, как рисовать линию.

Часть моей первоначальной отладки включала изменение цветов, которые я использовал, чтобы увидеть, была ли эта проблема – ну, я изменил цвета от розового до красного (не так много изменений, я знаю, но опять же, я предположил, что я изменил его достаточно, чтобы исключить цвета как проблему).

Ну, из того, что я недавно и мучительно узнал, заключается в том, что принтеры преобразуют цвета в оттенки серого с использованием формулы, и эта формула имеет тенденцию создавать побочные эффекты сглаживания (как то, что я видел).

РЕШЕНИЕ: было изменение цвета сетки. Некоторые цвета лучше, чем другие. Итак, чтобы проверить это, я написал простой скрипт, который вы можете скачать здесь, который будет генерировать PDF-документ, используя все цвета, хранящиеся в словаре цветов Reportlabs, – напечатайте образец сетки, который вызывал у меня проблемы и предоставлял значения RGB. Как оказалось, все цвета разных цветов не хорошо печатаются на нескольких принтерах (все разные) – это не просто красные / розовые … некоторые «красноватые» цвета прекрасно печатаются, некоторые принтеры обрабатывают преобразование оттенков серого лучше, чем другое ,

Итак, теперь наша задача – использовать этот документ PDF, который я создал, чтобы найти цвет, который отлично выглядит в печати (как цветной, так и серой) и на экране.

Если вы не хотите загружать сценарий из страха, я злюсь – по крайней мере, просмотрите PDF-файл и распечатайте собственные образцы, чтобы узнать, можете ли вы воссоздать проблему, которую я испытывал (я печатал по 600dpi – стандарт – ничего необычного … помните, если бы я включил настройки DPI / качества, он напечатался отлично, но стандартные настройки вызывали у меня горе!).

скрипт

или

PDF

Если я понимаю, как ReportLab правильно обрабатывает строки, вы просите создать строки с единицами пространства 1 и 0.12. В PDF один «пользовательский космический блок» эффективен на 1/72 дюйма.

Это означает, что линии, которые вы рисуете, будут соответственно 0,014 и 0,0017 дюйма в ширину. Это действительно не так много. В зависимости от разрешения вашего устройства вывода и того, где на странице появляется строка (поэтому, в зависимости от того, будет ли она совмещена с сеткой пикселей вашего экрана или принтера или нет), вы, вероятно, получите разные результаты.

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

Эффект выравнивания с сеткой пикселей вашего принтера, вероятно, является причиной того, что вы видите некоторые строки и не видите других.

Несколько вещей, чтобы попробовать / играть.

1) Выведите свои линии с шириной линии 0. Это особый случай в PDF, и это означает «выводить строку шириной всего в один пиксель». Имейте в виду, что такая строка должна быть видимой на вашем экране (всего 72 или 96 точек на дюйм), но может быть не на вашем принтере (который теперь будет печатать точками размером 1/1200 дюймов). Но если ваш принтер подчиняется правилам, он должен всегда печатать одну точку.

2) Сделайте ваши линии шире – возможно, единственный способ добиться последовательных результатов. Если меньшие строки выглядят слишком толстыми, попробуйте напечатать пунктирную линию вместо сплошной (установите тире).

Не совсем точно, как применить это к тому, что вы делаете, но традиционный способ Postscript – объединить координаты устройства с целыми числами.

 /roundpoint { % xy -> x' y' transform %convert user-space coords to device-space coords round itransform %convert device-space back to user-space } def ... xy roundpoint moveto xy roundpoint lineto ... 

Если все ваши линии расположены последовательно относительно пикселов устройства, они также должны быть нарисованы последовательно.

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