打印和图形技术

7

我想绘制一个矩形(或多个),在打印时以厘米为单位显示在纸张上。

Graphics[{Rectangle[{0, 0}, {19, 28}], Orange, Rectangle[{0, 0}, {1, 1}]}]

将打印出两个矩形,可以测量为恰好1cm x 1cm(橙色的那个),黑色的那个为19x28 cm。

似乎有些变量很重要: ImageSize 和当然是 AspectRatio

我使用了AspectRatio->19/28和对于ImageSize 的各种设置,例如ImageSize->{19*27,28*27},但仍然不太准确。

我将图形导出为TIFF格式,然后使用Windows照片库打印到全页照片。是否有人对此有经验?必须有一个公式而不是试错。

更新: 我尝试了@Szabolcs的建议,使用了以下代码:

   g = Graphics[{White, EdgeForm[Directive[Thick, Black]], 
   Rectangle[{0, 0}, {18, 28}], Orange, Rectangle[{0, 0}, {10, 10}]}]

   final = Show[g, AspectRatio -> Automatic, 
   PlotRange -> {{-0.5, 18.5}, {-0.5, 28.5}}]

   cm = 72/2.54

   Export["final.pdf", Show[final, ImageSize -> {19 cm, 29 cm}]]

这个很好用。10x10cm的橙色矩形被精确测量后就是10x10cm。

我原本以为Windows使用96dpi,Mac使用72dpi(从网上了解到),所以72/2.54不是我预期的值。然而,72是可行的值。 我也尝试过调整框架,但效果很丑陋。尽管我已经尝试了所有可能的设置,但仍然无法得到正确的结果。应该可以通过在选定的边界内自己创建框架/标记等方式来实现,但这不是我想要追求的路径。


我认为将其转换为TIFF格式并作为位图打印效果不太好。尝试将其导出为PDF,这样可以更好地保留尺寸。 - Norbert P.
按照下面的答案(以及 MMA 的文档)所述的每英寸 72 点缩放比例,实际上从未对我起作用。我发现我需要一个额外的缩放因子,在几次迭代中确定(打印、用尺子测量、调整比例、打印等)。如果我记得正确,打印环境还会将大小缩小到工作环境的 80%。 - Sjoerd C. de Vries
@Sjoerd,你试过我的方法了吗?使用光栅导出? - Mr.Wizard
@Mr.wizard 我对在基于矢量的激光打印机上进行栅格转储有负面感受;这不是正确的做法。但我过去尝试了几种格式,它们都需要调整。 - Sjoerd C. de Vries
@Sjoerd,我很感激您希望保持矢量格式的愿望,但我之所以问是因为从我的观察中,这种方法的大小是正确的,而我想得到确认。 - Mr.Wizard
如何使用Magnification->1打印并导出为PDF,并保持屏幕上的原始外观:请参见我的答案“General PDF/EMF export problems and solutons”(https://dev59.com/nuo6XIcBkEYKwwoYTS1D#6124065),以及这个问题:“Font sizes print smaller than indicated”(https://dev59.com/J1fUa4cB1Zd3GeqPIHbX)。 - Alexey Popkov
2个回答

9
g = Graphics[{Rectangle[{0, 0}, {19, 28}], Orange, Rectangle[{0, 0}, {1, 1}]}]

好的,首先你需要做的是将 xy 方向设置为使用相同的单位,这意味着

Show[g, AspectRatio -> Automatic]

但这已经是默认设置了。

第二件事是选择您的绘图区域的大小和范围。 让我们将其设置为21乘30,并使您的矩形居中:

plotArea = {{0, 21}, {0, 30}} - {1, 1}
Show[g, AspectRatio -> Automatic, PlotRange -> plotArea]

第三件你需要做的事情是关闭添加任何填充/边距,使得你的图形实际大小大于绘图范围:

final = Show[g, AspectRatio -> Automatic, PlotRange -> plotArea, PlotRangePadding -> 0, ImagePadding -> 0]

我相信 ImageMargins 没有影响,但如果有的话,也将其设置为0。
最后一件需要做的事情是将其导出为保留图像尺寸的可打印格式,并设置图像大小,以便在您的绘图中,1厘米将是1个单位。Mathematica接受打印机点数的图像大小,因此让我们定义:
cm = 72/2.54
Export["final.pdf", Show[final, ImageSize -> 21 cm]]

我们希望绘图宽度为21厘米,因为它是21个单位宽。使用PDF作为导出格式,而不是TIFF。需要在Show内使用ImageSize来解决Export的一些问题...
现在在Adobe Reader中打开您的PDF,打开打印对话框,并确保页面缩放设置为无!我不知道如何在其他阅读器中执行此操作... 还要确保您的图形适合纸张(21 x 30厘米对于A4来说太大了...)
我不会进行测试打印,所以请告诉我这是否适用于您 :-) 以这种方式生成的PDF大小恰好为21 x 30厘米,因此如果出现问题,则必须发生在打印阶段。

1
信不信由你,我在更新时并没有抄袭你的留言,而是在你发帖之前就已经在处理它了。 - Mr.Wizard
似乎PlotRangePadding在示例图形上留下了白边,因此是必需的。我会考虑框架问题。 - Mr.Wizard
如果有一种直接指定图形对象单位比例的方法就好了。我想知道LevelScheme是否提供了这个功能。 - Mr.Wizard
@Lou 你可以检查PDF的大小(例如使用Adobe Reader将鼠标移动到左下角)。然后只需按实际大小打印PDF即可。 - Szabolcs
1
@Mr.Wizard:LevelScheme使用打印机点(pt)。几乎所有严肃的排版工作都是用pt完成的。 - user616736
显示剩余4条评论

4

我相信您需要添加 PlotRangePadding -> None 并适当设置图像尺寸。

在这种情况下,“边界框”大小与您的较大矩形相同:{19, 28}

做到这一点的稳健方法是将 ImageSize 设置为实际所需的尺寸,并利用 ImageResolution,将该值嵌入TIFF文件以进行正确的打印:

cm = 72 / 2.54;

g = Graphics[{Rectangle[{0, 0}, {19, 28}], Orange, 
      Rectangle[{0, 0}, {1, 1}]}, PlotRangePadding -> None, 
      ImageSize -> {19, 28}*cm];

Export["print.tif", g, ImageResolution -> 300]

这里假设您想从光栅格式(TIFF)打印,但您也可以使用相同的方法导出到其他格式,例如PDF。

我在发布时正在处理它!我也会尝试你的建议! - Lou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接