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

时间:2012-11-27 19:49:07

标签: python pdf printing postscript reportlab

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

我使用ReportLab / Python(opensource)来制作这些报告。下面是我的代码片段。

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

>What I see on the screen<

但是,当我将它发送到打印机时(是的,我也打印机设置),它会打印一些线条,而不是其他线条(有时它会有条不紊地打印出图案式格子图案,有时它是更粗/更细的线;请记住,打印机的输出是一致的,取决于我设置的笔画宽度。

>What I see at the printer!<

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

发生了什么事?这是打印机上的别名问题吗?如果我将网格转换为位图(或其他格式),它会对我有帮助吗?我该如何解决这个问题(我唯一的选择是使用Python和ReportLab)? ReportLab手册没有帮助,&#34; Google&#34;没有帮助,之前的StackExchange问​​题似乎没有涵盖这个特定主题。如果我将笔画宽度设置为&#34; 1&#34;,我可以让网格打印所有行,但是后面的网格线太粗了。

最终结果是我正在处理的折线图,我知道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

我尝试将笔画宽度设置为&#34; 0&#34;根据以下几个海报(以及ReportLab社区/邮件列表)的建议:

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

这确实会产生一条像素宽的线条,在PC上看起来很棒,但仍然以PDF格式打印出时髦的图案。

UPDATE2 + SOLUTION

经过大量的发脾气和与ReportLab和我的电脑的争论后发现它不是我的PC或ReportLab。这是打印机(我使用两种完全不同的打印机佳能和惠普 - 虽然模型) - 我觉得我有足够的覆盖率来排除打印机,但这个问题还有更多!继续阅读...

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

我初步调试的部分内容包括更改我正在使用的颜色以查看是否存在问题 - 好吧 - 我将颜色从粉红色更改为红色(不是很多变化,我知道,但是,我假设我改变了它以排除颜色作为一个问题。)

从我最近所获得的,并且痛苦地了解到,打印机使用公式将颜色转换为灰度,并且该公式具有产生抗锯齿副作用的倾向(就像我所看到的那样)。

解决方案:是改变网格的颜色。某些颜色比其他颜色表现更好。所以,为了测试这个,我写了一个简单的脚本,你可以download here使用存储在reportlabs颜色字典中的所有颜色生成PDF文档 - 打印导致我出现问题并提供RGB的样本网格值。事实证明,alllllllll的各种颜色不能在几台打印机上打印得很好(各种不同) - 它不仅仅是红色/粉红色......还有一些&#34;红色的&#34;颜色打印很好,有些打印机比其他打印机更好地处理灰度转换。

现在,我们的任务是使用我创建的PDF文档来查找打印(彩色和灰度)和屏幕上看起来很好的颜色。

如果您不想下载脚本,我担心我是邪恶的 - 至少检查PDF并打印自己的样本,看看是否可以重现我遇到的问题(我正在打印)在600dpi - 标准 - 没有什么花哨的...记得,如果我打开DPI /质量设置,它打印很好,但标准设置让我感到悲伤!)。

Script

PDF

3 个答案:

答案 0 :(得分:5)

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

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

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

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

要尝试/玩的几件事。

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

2)让你的线条更宽 - 可能是获得一致结果的唯一方法。如果较小的线看起来太粗,请考虑打印虚线而不是实线(设置短划线图案)。

答案 1 :(得分:2)

不完全确定如何将此应用于您正在做的事情,但传统的Postscript方法是将设备坐标舍入为整数。

/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
...

如果所有线条都相对于设备像素保持一致,那么它们也应该一致地绘制。

答案 2 :(得分:1)

我认为设置笔划宽度为0是你想要的。这会产生一种特殊类型的线,通常被称为发际线。它基本上告诉打印机打印尽可能最细的线条(喷墨打印机的液滴宽度或激光打印机中激光的宽度)。我不确定所有PDF查看器是否会按预期显示它,但无论如何都应该尝试打印它。