5

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

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

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

>我在屏幕上看到的<

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

>我在打印机上看到的!<

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

到底是怎么回事?这是打印机的别名问题吗?如果我将网格转换为位图(或其他格式)会对我有帮助吗?我该如何解决这个问题(我唯一的选择是使用 Python 和 ReportLab)?ReportLab 手册没有帮助,“Google”没有帮助,以前的 StackExchange 问题似乎也没有涵盖这个特定主题。如果我将笔画宽度设置为“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

更新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 实际上并没有画线,它只是添加了一条后记线,告诉渲染器画线。

我最初调试的一部分包括更改我使用的颜色以查看这是否是一个问题 - 好吧 - 我将颜色从粉红色更改为红色(我知道变化不大,但我再次假设我将其更改为排除颜色问题)。

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

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

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

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

脚本

或者

PDF格式

4

3 回答 3

5

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

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

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

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

有几件事可以尝试/玩。

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

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

于 2012-11-27T22:25:07.200 回答
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
...

如果您的所有线条相对于设备像素放置一致,那么它们也应该一致地绘制。

于 2012-11-29T05:12:34.867 回答
1

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

于 2012-11-28T18:21:11.373 回答