C# 测量打印文本和导出到PDF的建议

C# 测量打印文本和导出到PDF的建议,c#,pdf,printing,C#,Pdf,Printing,我正在开发一个多平台印象发生器。我的目标是,报表在打印预览和导出为PDF时的显示方式完全相同 在这种情况下,我无法将其导出为与打印完全相同的PDF格式。我已经测试了一些免费的库,尽管这些库可以生成漂亮的文档,但它们与印刷版总是有一些不同。这是因为测量文本大小的方法不同 要解决此问题,我必须: *隔离测量尺寸和文本位置的方法。使用这些相同的方法,而不考虑所需的输出。预览、打印或导出为PDF *根据上一步确定的位置,分别打印每个字符 现在我的问题来了: *是否有更简单的方法解决这个问题? *测量印象

我正在开发一个多平台印象发生器。我的目标是,报表在打印预览和导出为PDF时的显示方式完全相同

在这种情况下,我无法将其导出为与打印完全相同的PDF格式。我已经测试了一些免费的库,尽管这些库可以生成漂亮的文档,但它们与印刷版总是有一些不同。这是因为测量文本大小的方法不同

要解决此问题,我必须: *隔离测量尺寸和文本位置的方法。使用这些相同的方法,而不考虑所需的输出。预览、打印或导出为PDF *根据上一步确定的位置,分别打印每个字符

现在我的问题来了: *是否有更简单的方法解决这个问题? *测量印象中每个角色大小的最佳方法是什么?没有任何边界或边界。下面是我当前使用的方法,当图形来自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;
}

可能你看到的不同就是分辨率的不同。PDF始终使用每英寸72 DPI点的分辨率,而Windows可能有96120 DPI,因此浏览器也使用此分辨率。移动设备可能有另一个DPI,如视网膜上的264 PPI等

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

例如,屏幕上100像素宽、分辨率为96 DPI的文本对象的物理大小与PDF中72/96*100=75像素宽、分辨率为72 DPI的文本对象的物理大小相同


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

试试itextsharp NuGet软件包好吧,我已经进行了单个字符的测量,如原始帖子中所述。现在我知道这里面有更多的东西,比如GDI/GDI+技术!尝试在PrintDocument预览中测量VA word,在实际打印中,宽度会发生变化!所以,即使是打印也不总是和预览一样!所以,我不能相信S.O.高水平测量。。。。