2009-07-24 201 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中看到的更一致。

相關問題