用delphi打印

时间:2011-11-09 09:07:47

标签: delphi delphi-2007

我在打印时遇到一些困难,当我将报表打印到物理打印机时,文本完全居中但是当我将相同的报表打印到PDF打印机(例如cutePDF)或XPS文档编写器时,左边距变为0。我正在尝试调整它在PDF和XPS中正常工作的边距,但物理打印会打印带有一些额外左边距的页面。我无法找到这种差异,我也试图仅为非物理打印设置边距,但无法做到这一点。 如果可以根据打印机选择设置例如,那将是很好的。如果我选择PDF打印机或XPS刻录机,则保证金会发生变化。我正在使用Printer.canvas.textout(),过程来打印文本。

任何人都可以帮助我。

2 个答案:

答案 0 :(得分:3)

值得高度重视的一些观点:

  • 从Windows(和Delphi的TPrinter.Canvas)POV中,在绘图过程中没有这样的概念为 margin :画布可以使用整个纸张大小 - 例如,X = 0将指向纸张的绝对最左边部分;
  • 根据打印机功能,有所谓的“硬件边距”或“物理边距”:这是纸张周围的不可打印区域;也就是说,如果你在这个区域绘制一些东西,它就不会被绘制 - 这些边距取决于所用打印机的技术和型号,在某些情况下,可以通过打印机驱动程序从打印机驱动程序中检索这些“边距”值。 GetDeviceCaps API calls;
  • 但是,从我的实验中,不要相信打印机驱动程序检索到的那些“物理边距” - 使用某些软件定义的边距更好(更美观),并让用户在必要时更改它(如MS Word的“页面布局”选项;
  • PDF打印机通常是虚拟打印机,因此它们没有任何“物理边际”;
  • 当您打印PDF文档时,Acrobat Reader能够将页面内容“适合”到物理打印机的“物理边距”。

所以这里有一些可能的解决方案:

  • 在Acrobat Reader中,如果您的PDF没有边距,请单击“打印”,然后在“页面处理/页面缩放”选项中选择“适合可打印区域” - 我猜您在此处设置了“无”,因此结果被打印机截断;
  • 在您的Delphi应用程序中,在绘制报告时设置一些“逻辑”边距(例如,在纸张周围1厘米) - 也就是说,不要从X = 0和Y = 0开始,但是有一些偏移,并让绘图区域的宽度和高度较小(例如,参见我们的开源Report engine如何实现);
  • 从Delphi应用程序中,如果使用Report组件,则应该有一些属性来设置边距。

请参阅this article关于使用Delphi进行常规打印的信息(有些信息很旧,但大多数仍然准确),或者正确设置报告引擎。

答案 1 :(得分:0)

如果您使用TextOut(而不是DrawText),您将拥有x和y坐标,您将在其中放置需要打印的字符串。您可以在调试器中跟踪计算(如果应用程序在没有调试器的情况下运行,则记录它们)。确定坐标时可能出现问题(例如TextExtend无法在居中之前测量文本,例如分辨率与您的预期不同,您将获得带有变换的Printer Canvas,因此坐标不是1:1像素。

如果您不确定坐标/字体问题:尝试在预期坐标处绘制一些框,这样您就可以将所有与字体无关的错误排除在等式之外。如果它们表现出相同的问题,那就是一个坐标问题,如果不是它的字体问题。

正如肯所说,如果你没有展示代码,我们就什么都不知道......有这么多的可能性......