测量打印文本和导出为PDF的建议

时间:2015-03-31 19:00:54

标签: c# pdf printing

我正在开发一个多平台印象生成器。我的目标是在“打印”中的“预览”和“导出到PDF”中以完全相同的方式显示报告。

在这种情况下,我无法将“导出为PDF”看起来与“打印”完全相同。我已经测试了一些免费的库,尽管产生了漂亮的文档,但它们总是与“打印”版本有一些区别。这是由于测量文本大小的不同方法。

要解决这个问题,我必须:
*隔离测量大小和文本位置的方法。无论期望的输出如何,都使用相同的方法。 (“预览”,“打印”或“导出为PDF”)
*根据上一步确定的位置,分别打印每个字符。

现在问我的问题:
*这个问题是否有更简单的方法?
*衡量展示中每个角色大小的最佳方法是什么? (没有任何边距或边界)。下面是我目前正在使用的方法,它非常适用于Graphics来自PrintPreview,但如果我使用Graphics.FromImage(For Pdf),这些函数返回的值会发生巨大变化!

/// <summary>
/// Return the measured size of the text. (Winouth margins)
/// </summary>
public static SizeF MeasureText(Graphics graphic, string text, IFont font)
{
    GraphicFont f = (GraphicFont)font;

    SizeF rect = GraphicDevice.MeasureSystemText(graphic, '.' + text + '.', f.font);
    SizeF rect2 = GraphicDevice.MeasureSystemText(graphic, "..", f.font);

    return new SizeF(rect.Width - rect2.Width,
        rect2.Height * rect.Height / rect2.Height);
}

/// <summary>
/// Return the measured size of the text. (With margins)
/// </summary>
private static SizeF MeasureSystemText(Graphics graphic, string text, Font f, System.Drawing.RectangleF rect)
{
    System.Drawing.StringFormat format = new System.Drawing.StringFormat();
    System.Drawing.CharacterRange[] ranges = { new System.Drawing.CharacterRange(0, text.Length) };
    System.Drawing.Region[] regions = new System.Drawing.Region[1];

    format.SetMeasurableCharacterRanges(ranges);

    regions = graphic.MeasureCharacterRanges(text, f, rect, format);
    rect = regions[0].GetBounds(graphic);
    return rect.Size;
}

1 个答案:

答案 0 :(得分:0)

您看到的差异可能是分辨率的差异。 PDF总是使用72 DPI(每英寸点数)分辨率,而Windows可能有96,120 DPI(因此浏览器也使用此分辨率)。移动设备可能有另一个DPI(如Retina上的264 PPI等)。

因此,虽然像素的大小将相同,但物理大小(以英寸为单位)将根据输出设备的DPI而有所不同。

例如,屏幕上的100像素宽度文本对象(96 DPI)与物理尺寸相同,为72/96 * 100 = 75像素宽度(PDF为72 DPI)。

TL; DR:检查您使用的pdf组件如何处理并重新计算DPI差异,并在测量文本大小时对代码进行调整,以考虑屏幕和PDF之间的DPI差异。