计算PDF页面的高度和宽度
Calculate PDF page height and width
我已经检查过 SO 并查看了这个问题的潜在解决方案,而且我已经有了一个潜在的解决方案,我将在问题中进行解释,但我将尝试从另一个角度进行探讨。我正在使用 PDF4NET 将计算机输出的激光光盘 (COLD) 文档转换为 PDF。这些 COLD 文档只是纯文本,但似乎不是标准页面大小(即信函、小报、法律等...),我无法从文档本身提取任何页面大小信息。这导致了一个问题,当我试图将它们转换为纵向 (8.5 x 11) 页面时,单行可能最终换行到下一行。我希望能够避免这种情况。
以下是我尝试转换文档时使用的知识:
- COLD 文档 - 我知道最长字符行的长度,我知道页面上的行数。
- 字体 - 生成的 PDF 文档将为 Courier 大小 10
- 边距 - 每个文件的边距可能不同,但我们有可用的
- DPI - 这将始终为 72(PDF 的默认 DPI)
有了这些知识,我确定了最长的字符行:
Size textSize = TextRenderer.MeasureText(longestLine, new Font("Courier", 10, FontStyle.Regular, GraphicsUnit.Point));
我使用 textSize.Width
设置 PDF 页面的高度和宽度,实际上是创建一个方形页面。这个"appears"是为了防止文字换行,但是页面右侧和底部有很多白色space。
问题:
有没有更好的方法来计算 PDF 页面的高度和宽度,在给定已知信息的情况下,文本可以适合而没有那么多白色 space?如果需要更多有助于更好计算的信息,还需要哪些其他信息?目标是创建这样大小的文档,其中没有换行且边距看起来完全相同。
我认为 TextRenderer 提供的宽度(以像素为单位)假定定义为 96 dpi。
int pagewidth = textsize * 72 / 96 + 2*Margin ;
查看图形 (GDI+) returns 宽度是否与 TextRenderer (GDI) 不同。
Graphics graphics = Graphics.FromImage(new Bitmap(1, 1));
SizeF size = graphics.MeasureString(text,myfont) ;
事实证明 PDF4NET 在 PDFFont
class 中有自己的 MeasureString()
更准确。
有了已知的边距、字体大小、最长行的长度和行数,我们就可以计算页面的高度和宽度:
PDFFont font = new PDFFont(PDFFontFace.Courier, 10);
double leftMargin = (double)LeftMargin.Value * 72;
double topMargin = (double).TopMargin.Value * 72;
double width = font.MeasureString(longestLine) + (leftMargin * 2);
double height = (LinesOfText.Count * font.Size) + (topMargin * 2);
我已经检查过 SO 并查看了这个问题的潜在解决方案,而且我已经有了一个潜在的解决方案,我将在问题中进行解释,但我将尝试从另一个角度进行探讨。我正在使用 PDF4NET 将计算机输出的激光光盘 (COLD) 文档转换为 PDF。这些 COLD 文档只是纯文本,但似乎不是标准页面大小(即信函、小报、法律等...),我无法从文档本身提取任何页面大小信息。这导致了一个问题,当我试图将它们转换为纵向 (8.5 x 11) 页面时,单行可能最终换行到下一行。我希望能够避免这种情况。
以下是我尝试转换文档时使用的知识:
- COLD 文档 - 我知道最长字符行的长度,我知道页面上的行数。
- 字体 - 生成的 PDF 文档将为 Courier 大小 10
- 边距 - 每个文件的边距可能不同,但我们有可用的
- DPI - 这将始终为 72(PDF 的默认 DPI)
有了这些知识,我确定了最长的字符行:
Size textSize = TextRenderer.MeasureText(longestLine, new Font("Courier", 10, FontStyle.Regular, GraphicsUnit.Point));
我使用 textSize.Width
设置 PDF 页面的高度和宽度,实际上是创建一个方形页面。这个"appears"是为了防止文字换行,但是页面右侧和底部有很多白色space。
问题:
有没有更好的方法来计算 PDF 页面的高度和宽度,在给定已知信息的情况下,文本可以适合而没有那么多白色 space?如果需要更多有助于更好计算的信息,还需要哪些其他信息?目标是创建这样大小的文档,其中没有换行且边距看起来完全相同。
我认为 TextRenderer 提供的宽度(以像素为单位)假定定义为 96 dpi。
int pagewidth = textsize * 72 / 96 + 2*Margin ;
查看图形 (GDI+) returns 宽度是否与 TextRenderer (GDI) 不同。
Graphics graphics = Graphics.FromImage(new Bitmap(1, 1));
SizeF size = graphics.MeasureString(text,myfont) ;
事实证明 PDF4NET 在 PDFFont
class 中有自己的 MeasureString()
更准确。
有了已知的边距、字体大小、最长行的长度和行数,我们就可以计算页面的高度和宽度:
PDFFont font = new PDFFont(PDFFontFace.Courier, 10);
double leftMargin = (double)LeftMargin.Value * 72;
double topMargin = (double).TopMargin.Value * 72;
double width = font.MeasureString(longestLine) + (leftMargin * 2);
double height = (LinesOfText.Count * font.Size) + (topMargin * 2);