将char从RichEdit复制到PDF设置错误的字符间距

时间:2014-09-25 08:32:54

标签: delphi pdf rtf delphi-xe5

我正在开发一个发送账单的应用程序。客户端必须能够以丰富的格式添加内容。使用Debenu,我扫描然后通过char打印char以检索字体样式。这非常好,接受印刷。

左边的图片是我的richedit,右边是我的PDF。正如你所看到的,字符间距是一个小的出价

enter image description here PDF Text

这是一小段代码,用于复制和字符间距。

' XPOS'是该线的左侧位置。在每个打印的字符之后,我将所选字符的宽度添加到XPos

XPos := 42;
for I := 0 to length(RichEdit.Text) - 1 do
begin
  RichEdit.SelStart := I;
  RichEdit.SelLength := 1;
  PDF.DrawText(XPos, YPos, RichEdit.SelText);
  XPos := XPos + Canvas.TextWidth(RichEdit.SelText);
end;

PDF的X和YPos是浮点数,而Canvas.TextWidth是整数。是否有可能画布上的实际位置更准确一些?如果是这种情况,我如何在浮动中获得这些职位?

我使用Delphi XE-5和Debenu Quick PDF Library 9.1来创建PDF格式。

编辑:

正如LU RD所指出的那样。在FireMonkey中,Canvas.Textwidth是浮点数。我使用EditBox,Button和Label进行了快速检查:

Label1.Text := floattostr(Canvas.TextWidth(edit1.seltext));

在此测试中,Label显示了char宽度的非常具体的数字。

enter image description here

这让我相信我是对的,因为char宽度确实是浮点数,我需要开始实现mjn将传输具有相同属性的完整字符串传递给我的PDF。

1 个答案:

答案 0 :(得分:1)

Debenu有这个功能:

function TDebenuPDFLibrary0915.CharWidth(CharCode: Integer): Integer;

如果您将返回值除以1000并将其乘以文本大小,您将获得正确的char宽度。 这是我自己的问题的解决方案:

XPos := 42;
for I := 0 to length(RichEdit.Text) do
begin
  RichEdit.SelStart := I;
  RichEdit.SelLength := 1;   
  PDF.DrawText(XPos, YPos, RichEdit.SelText);

  str := RichEdit.SelText;
  if length(str) > 0 then
    chr := char(str[1]);
  XPos := XPos + (PDF.CharWidth(Ord(chr)) / 1000 * 12);
end;

请注意,这仍在进行中。但重要的是在这里。