使用ReportLab创建Python/PDF-带有图案的自制网格打印,但在屏幕上看起来不错

标签 python pdf printing postscript reportlab

我正在尝试制作自己的网格(看起来非常像:http://tinyurl.com/cdyre6k-以毫米为公制单位的ECG纸)。

我正在使用ReportLab/Python(开源)制作这些报告。以下是我的代码片段。

在屏幕上,看起来很棒!:

但是,当我将其发送到打印机时(是的,我也对打印机设置进行了修改),它会打印一些行,而不是其他行(有时是有条理的,并打印出类似图案的格子,有时它是较粗/较细的行) ;请记住,打印机上的输出是一致的,具体取决于我设置的笔划宽度。



我尝试了各种笔触宽度组合和各种打印机设置组合...我无法正确打印它!我已经尝试使用另一台打印机并获得了更好的结果,但是我必须将打印机设置设置为超过1200 dpi(CAD级别的打印)。另一台打印机设置为600dpi。在那个相同的打印机(600dpi)上,我打印由前同事制作的文档,并且打印的很好(请注意,他没有使用ReportLab,所以我不能使用他的代码/解决方案)。

到底是怎么回事?这是打印机的别名问题吗?如果我将网格覆盖到位图(或其他某种格式),对我有帮助吗?我该如何解决(我唯一的选择是使用Python和ReportLab)? ReportLab手册无济于事,“Google”无济于事,以前的StackExchange问​​题似乎也没有涵盖此特定主题。如果将strokewidth设置为“1”,则可以使网格打印所有行,但是次网格线太粗。

最终结果是我正在处理的折线图,并且我知道ReportLab具有图表功能,但是reportlabs图表/网格功能无法满足我的项目需求,因此我不得不制作我的项目。拥有主要/次要线条的网格(也许我错过了一些东西并接受了替代技术,但目前在PDF格式下看起来不错,只是在打印机上不行)。

任何建议表示赞赏!

TIA,

-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

我尝试按照一些海报(和ReportLab社区/邮件列表)的建议将笔划宽度设置为“0”,如下所示:
grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x,
                            (_temp_y + _height_of_box),
                            strokeWidth=0,
                            strokeColor=colors.pink))

这的确形成了一个单像素宽的行,在PC上看起来还不错,但在PDF中仍以时髦的图案打印。

UPDATE2 +解决方案

在与ReportLab和我的计算机打交道之后,事实证明那不是我的PC或ReportLab。是打印机(尽管我使用的是佳能和惠普两台完全不同的打印机-尽管有型号)-我觉得我有足够的覆盖范围来排除打印机,但是这个问题还有很多!继续阅读...

ReportLab实际上并没有画线,它只是添加了一条脚本线,告诉渲染器画线。

我最初调试的一部分包括更改我用来查看是否存在问题的颜色-很好-我将颜色从粉红色更改为红色(我知道并没有多大改变,但是我再次假设我已将其更改为排除颜色问题)。

从我最近并痛苦地中学到的是,打印机使用一种公式将颜色转换为灰度,并且该公式倾向于产生抗锯齿的副作用(就像我所看到的那样)。

解决方案:是要更改网格的颜色。某些颜色比其他颜色表现更好。因此,为了测试这一点,我编写了一个简单的脚本,可以将其download here生成,该报告将使用reportlabs颜色字典中存储的所有颜色生成PDF文档-打印导致我出现问题的示例网格并提供RGB值。事实证明,allllllllll的颜色在几台打印机上(所有不同)不能很好地打印-不仅是红色/粉红色...一些“红色”颜色可以很好地打印,有些打印机比另一种更好地处理灰度转换。

因此,现在,我们的任务是使用我创建的PDF文档查找一种在打印时和在屏幕上看起来都不错的颜色(彩色和灰度级)。

如果您不希望下载脚本而担心我很邪恶-至少检查一下PDF并打印自己的样本,看看是否可以重现我遇到的问题(我以600dpi的速度打印-标准-没什么特别的...请记住,如果我打开了DPI/质量设置,它可以正常打印,但是标准设置使我感到悲伤!)。

Script

或者

PDF

最佳答案

如果我了解ReportLab如何正确处理线,则要求它创建分别具有1和0.12用户空间单位的线。在PDF中,一个“用户空间单位”实际上是1/72英寸。

这意味着您要绘制的线将分别为0.014和0.0017英寸宽。真的不多。根据输出设备的分辨率以及该行在页面上的位置而定(因此,取决于它是否恰好与屏幕或打印机的像素网格对齐),您可能会得到不同的结果。

您的打印机可能会尝试通过抗锯齿优化输出,这将使最终结果更加不确定。

与打印机的像素网格对齐的效果可能是为什么您看到一些线条而看不到其他线条的原因。

可以尝试/玩的几件事。

1)输出0行宽的行。这是PDF中的一种特殊情况,它的意思是“输出恰好一个像素宽的线”。请记住,这样的行应该在您的屏幕上可见(只有72或96 dpi),但可能在您的打印机上不可见(现在它将打印一个1/1200英寸的点)。但是,如果您的打印机遵守规则,则应始终打印该一个点。

2)使您的产品线更宽-这可能是获得一致结果的唯一方法。如果较小的线条看起来太粗,请考虑打印虚线而不是实线(设置破折号)。

关于使用ReportLab创建Python/PDF-带有图案的自制网格打印,但在屏幕上看起来不错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13591887/

相关文章:

python - django session 以防止用户多次投票

android - 在 Android 中的串行蓝牙打印机上打印位图

python - 替换字符串中多次出现的模式一次

pdf - 使用带有打印边距的 ImageMagick 在页面上平铺图像?

ios - 2 个 View Controller 合二为一( Collection View ?)

iOS:创建PDF时独立修改字体高度、宽度和间距

java - 打印格式化数组

python - 使用格式和变量将字符串居中

python - 声明的列表引发 NoneType 异常

python - 将 MySQL 结果插入现有的 pandas 数据帧