2009-07-24 202 views
1

我正尝试使用XSL(XML-FO)生成PDF以从数据库转换生成的XML。在C#中计算格式化字符串的宽度和高度

由于本文档的分页方面存在复杂的规则,因此在生成将由XSL使用的XML时确定分页符时会进行计算。我注意到,这些计算结果一直不一致。例如,所需的打印区域的高度为9英寸,然后将其乘以72(每英寸72点)= 648点,转换为点。

因此,对于每一行,我使用MeasureString来获取该行的高度,然后从648中减去该行的高度,以查看是否仍有可用空间来打印该行。但是每当确定一个分页符时,底部会留下一个大的空白。这就好像648pt转换是错误的。现在我也担心MeasureString方法返回的高度也可能是错误的。

我为长篇文章道歉,但我很感激任何关于我可能会做错什么的意见/建议。

非常感谢!

回答

2

我认为最大的问题是您使用GDI方法来测量将显示在PDF中的字符串。这只是不够准确。 (即使你的字体是相同的,他们会使用我记忆中不同的渲染技术。)

所以,你应该尝试其他形式的计算。一个简单的第一步就是估计每行的字符数,然后估计每行的高度,因为它会出现在PDF中。然后,只使用这些数字。一旦接近,可以通过关注特定字符来改进评估技术。 (你可能不想达到计算字距的水平。)

另一种技术可能是做一些我在过去的项目中工作的东西。使用iTextSharp,我们不得不在页面上对角地添加空心文本(作为一种水印)。由于文本未知,我们猜测原始字体大小。然后代码进入一个循环,在那里它将测量渲染文本的大小,并向上或向下调整它,直到它只是正确的大小来填充页面而不剪切任何文本。 (所有这些猜测和测量都是用iTextSharp完成的。)

+0

对不起,花了很长时间才能回到你们身边。我不得不做估计技术。我相信我正在接近。谢谢! – Jaime 2009-08-04 15:51:30

0

我假定您在System.Drawing.Graphics类中使用方法MeasureString方法。您必须将PageUnit属性设置为GraphicsUnit.Point以获得测量结果。

XSL-FO很可能不会以与GDI +相同的方式呈现。特别是用于包装文本的算法将会不同。

但是,假设PageUnit是正确的,并且您有一个简单的布局,不涉及已包装的文本,则可能忽视了某些显而易见的内容,同时估计由XSL-FO生成的PDF大小。也许,你可以尝试将页面大小从1英寸改变为9英寸。然后,您可以使用标尺来衡量多余的空白,并尝试确定页面大小和多余的空白之间的关系。然后,您应该重新访问您的代码,以确定您对文本的大小有错误的假设。

+0

感谢您的回复Martin!我很欣赏这些意见。 – Jaime 2009-08-04 15:52:09

0

几年前,我有一个非常类似的问题。

我在自己的项目中发现,我通过P/Invoke使用旧版Win32 gdi函数获得了文本指标(http://msdn.microsoft.com/en-us/library/dd144821(VS.85).aspx)的更好结果。它返回不同于GDI + MeasureString的结果。它们与PDF中看到的更一致。

相关问题