我正在开发一个发送账单的应用程序。客户端必须能够以丰富的格式添加内容。使用Debenu,我扫描然后通过char打印char以检索字体样式。这非常好,接受印刷。
左边的图片是我的richedit,右边是我的PDF。正如你所看到的,字符间距是一个小的出价
这是一小段代码,用于复制和字符间距。
' 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宽度的非常具体的数字。
这让我相信我是对的,因为char宽度确实是浮点数,我需要开始实现mjn将传输具有相同属性的完整字符串传递给我的PDF。
答案 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;
请注意,这仍在进行中。但重要的是在这里。