【问题标题】:Printing with delphi用delphi打印
【发布时间】:2011-11-10 14:30:56
【问题描述】:

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

谁能帮帮我。

【问题讨论】:

  • 欢迎来到 StackOverflow。任何人几乎不可能帮助您解决问题,因为您没有发布任何代码。如果我们看不到您尝试打印的方式,我们就看不到您做错了什么。请记住,我们无法从此处看到您的屏幕,因此我们拥有的 100% 信息是您在问题中提供的信息。请编辑您的帖子并提供相关代码(您也可以尝试在问题中添加一些分段符,以使其在您处理问题时更具可读性)。为了让我们帮助您解决您的问题,您必须帮助我们理解它。谢谢。 :)

标签: delphi delphi-2007


【解决方案1】:

一些值得强调的点:

  • 在 Windows(和 Delphi 的 TPrinter.Canvas)POV 中,在绘图过程中没有诸如 margins 之类的概念:整个纸张大小都可用于画布 - 对于例如,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 进行一般打印(一些信息是旧的,但大多数信息仍然准确),或正确设置您的报告引擎。

【讨论】:

  • 非常感谢这么好的解释。我认为你建议在页面周围有一些“逻辑”边距会很好。
  • 在 Delphi XE2 中(至少)Printer.PageWidth 等于 GetDeviceCaps(DC, HorzRes),这是页面 可打印 区域的宽度,即小于论文。
【解决方案2】:

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

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

正如 Ken 所说,如果您不显示代码,我们将无法了解更多信息...太多的可能性..

【讨论】:

  • 如果你在正确的问题之前保留你的答案,那会更好(并且可能会让你投票)。试图回答一个非问题只是鼓励人们不要编辑和改进它。 (不反对你的答案,但也不反对。)提问者可以遵循调试器中的计算这一事实猜测用户实际上可能正在根据特定输出进行某种计算,这看来他们不是。等待代码和信息意味着您在回答时有一些事情要做。 :)
  • 感谢您的回复。我会尝试发布一些示例代码
  • @Ken:我不同意你的观点。是的,更多信息和更好的源代码会更好地工作,但他确实说他试图将使用 textout 绘制的文本居中。所以我没有猜测。如果您仔细阅读该问题,您会发现它包含更多您显然首先注意到的信息。
  • 没问题。试图帮助你和原始海报,但显然你冒犯了。我很抱歉。 (但你在猜测(大喊你的,不是我的),因为 OP 从未说过正在进行计算或正在使用什么数据/算法;Dinesh 只是说事情在一个表面上起作用,而不是在使用 TextOut 时在另一个表面上起作用。 “当我骑自行车时,有时它会很快停下来,有时它需要一段时间。”自行车的速度有多快?当它停下来时,是因为你更用力地踩刹车还是因为你撞到了树?细节使不同。不过,猜得不错。
  • @Ken:点了。我也很抱歉反应过度,谢谢你以如此友好的方式做出反应。现在进入主题:如果他调用 textout,他自己使用画布,textout 只有 x,y 而没有 rect,所以如果他需要将文本居中,他需要根据尺寸计算正确的坐标。因此,我们调用了 textout,我们有他自己进行的计算,而众所周知的刹车树是在猜测;计算是否出错,是否基于错误的维度进行计算,坐标是否不同等,猜测是否正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 2022-12-28
  • 1970-01-01
相关资源
最近更新 更多