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

使用ReportLab创建Python/PDF-自制网格打印有图案,但在屏幕上看起来很好,python,pdf,printing,postscript,reportlab,Python,Pdf,Printing,Postscript,Reportlab,我正在尝试制作我自己的网格(看起来非常像这样:-ECG纸,单位为毫米) 我正在使用ReportLab/Python(开源)制作这些报告。下面是我的代码片段 在屏幕上,它看起来很棒 我在屏幕上看到的 我尝试过各种笔划宽度组合,以及各种打印机设置组合。。。我无法正确打印!我尝试了另一种打印机并获得了更好的结果,但我必须将打印机设置设置为1200 dpi以上(CAD级打印)。另一台打印机设置为600dpi。在同一台打印机(600dpi)上,我打印了一位前同事制作的文档,打印效果很好(请注意,他没有使用

我正在尝试制作我自己的网格(看起来非常像这样:-ECG纸,单位为毫米)

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

在屏幕上,它看起来很棒

我在屏幕上看到的

我尝试过各种笔划宽度组合,以及各种打印机设置组合。。。我无法正确打印!我尝试了另一种打印机并获得了更好的结果,但我必须将打印机设置设置为1200 dpi以上(CAD级打印)。另一台打印机设置为600dpi。在同一台打印机(600dpi)上,我打印了一位前同事制作的文档,打印效果很好(请注意,他没有使用ReportLab,因此我无法使用他的代码/解决方案)

发生了什么事?这是打印机的别名问题吗?如果我将网格转换为位图(或其他格式),会有帮助吗?如何解决这个问题(我唯一的选择是使用Python和ReportLab)?ReportLab手册没有帮助,“谷歌”没有帮助,以前的StackExchange问题似乎没有涵盖这个特定主题。如果我将strokewidth设置为“1”,我可以让网格打印所有的线,但是小网格线太粗了

最终的结果是我正在制作一个折线图,我知道ReportLab有图表功能,但reportlabs图表/网格功能无法满足我的项目需要,因此我不得不使用主/辅线条制作自己的网格(也许我错过了一些东西,并对其他技术持开放态度,但目前它在PDF格式中看起来不错,只是在打印机上没有)

任何建议都将不胜感激

蒂亚

-J

更新1

我已尝试按照几张海报(以及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中仍然以时髦的图案打印

更新2+解决方案

在与ReportLab和我的电脑发生了很多争吵和争吵之后,结果证明这不是我的PC或ReportLab。这是打印机(我使用的是两种完全不同的打印机佳能和惠普-尽管型号不同)-我觉得我有足够的覆盖范围来排除打印机,但这个问题还有更多!继续阅读

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

我最初调试的一部分包括更改我使用的颜色,看看这是否是一个问题——好吧,我将颜色从粉红色更改为红色(我知道,更改不多,但我再次认为我更改的颜色足以排除颜色问题)

我最近痛苦地了解到,打印机使用公式将颜色转换为灰度,并且公式有产生抗锯齿副作用的趋势(就像我看到的那样)

解决方案:更改网格的颜色。某些颜色的性能比其他颜色更好。因此,为了测试这一点,我编写了一个简单的脚本,您可以使用reportlabs颜色字典中存储的所有颜色生成PDF文档-打印一个导致问题的示例网格并提供RGB值现在,所有种类的颜色都不能在多台打印机上很好地打印(所有的打印机都不一样)-不仅仅是红色/粉红色…有些“红色”颜色打印得很好,有些打印机处理灰度转换的效果更好

现在,我们的任务是使用我创建的这个PDF文档来找到一种在打印(颜色和灰度)和屏幕上看起来都很好的颜色

如果你因为害怕我是邪恶的而不想下载脚本-至少检查PDF并打印你自己的示例,看看你是否可以重现我遇到的问题(我以600dpi打印-标准-没什么特别的…记住,如果我打开DPI/质量设置,它打印得很好,但标准设置让我很伤心!)


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

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

您的打印机可能会尝试通过消除混叠来优化输出,这将使最终结果更加不确定

打印机像素网格的对齐效果可能是您看到某些线条而看不到其他线条的原因

有几样东西可以尝试/玩

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


2) 让你的线条更宽——这可能是获得一致结果的唯一途径。如果较小的线条看起来太厚,考虑打印虚线而不是实线(设置破折号模式)。

< P>我认为设置一个笔划宽度为0是你想要的。这会产生一种特殊类型的线,通常称为发际线。它基本上告诉打印机打印尽可能薄的行(喷墨打印机的液滴宽度或激光打印机中的激光宽度)。我不确定是否所有的PDF查看器都会显示它
grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x,
                            (_temp_y + _height_of_box),
                            strokeWidth=0,
                            strokeColor=colors.pink))
/roundpoint { % x y -> x' y'
    transform %convert user-space coords to device-space coords
    round
    itransform %convert device-space back to user-space
} def

...
x y roundpoint moveto
x y roundpoint lineto
...