PdfSharp:为什么我需要将位置和大小乘以1.25才能得到正确的结果?

时间:2016-04-29 07:44:38

标签: pdfsharp

我正在评估PdfSharp来创建PDF文档。在与MigraDoc进行比较时,我认为我必须将每个位置(x,y)或大小乘以1.25以获得预期结果。例如,如果我将页边距设置为2厘米而没有修正,我的边距约为1.6厘米。

page.TrimMargins = new TrimMargins
{
    All = XUnit.FromCentimeter(2)
};

当我将2乘以1.25时,我得到了预期的2厘米边距:

page.TrimMargins = new TrimMargins
{
    All = XUnit.FromCentimeter(2 * 1.25)
};

与字体大小相同。我必须将大小乘以1.25以获得与MigraDoc相同的大小,甚至Word都会打印出来。

顺便说一下,我的系统没有自定义缩放或100%以外的文字大小(我猜这可能是原因)。

有人能解释一下这里发生了什么吗?

修改 在TomasH的帮助下,我发现在没有自动缩放的情况下进行打印时,尺寸确定是完美的。 PdfSharp显然会创建太大的PDF文档。当我使用MigraDoc做同样的事情时,PDF也有点像我发现的那样大,但只是规模要小得多。剩下的问题是文档太大以及MigraDoc用来纠正PDF大小的原因。

这是我的完整测试代码,只提供正确的定位和尺寸修正因子:

using (PdfDocument document = new PdfDocument())
{
    // Create an empty page size A4 with defined margins
    PdfPage page = CreatePage(document);
    using (XGraphics graphics = XGraphics.FromPdfPage(page))
    {
        const double sizeCorrectionFactor = 1.25;
        // Define the page margins. They must be multiplied by 1.25 to be correct!?
        page.TrimMargins = new TrimMargins
        {
            All = XUnit.FromCentimeter(2 * sizeCorrectionFactor)
        };

        // Draw a string. The font size needs to be multiplied by 1.25 to be correct!?
        double x = 0;
        double y = 0;
        graphics.DrawRectangle(XPens.Black, XBrushes.White, 0, 0, page.Width, page.Height);
        graphics.DrawString("PdfSharp Measure Demo", new XFont("Verdana", 20 * sizeCorrectionFactor), XBrushes.Navy, x, y, XStringFormats.TopLeft);

        // Draw a rectangle. Position and size must be multiplied by 1.25 to be correct!?
        x = XUnit.FromCentimeter(2 * sizeCorrectionFactor);
        y = XUnit.FromCentimeter(2 * sizeCorrectionFactor);
        double width = XUnit.FromCentimeter(5 * sizeCorrectionFactor);
        double height = XUnit.FromCentimeter(5 * sizeCorrectionFactor);
        graphics.DrawRectangle(XPens.Red, XBrushes.Silver, x, y, width, height);
    }

    string pdfFilePath = Path.GetTempFileName() + ".pdf";
    document.Save(pdfFilePath);

    Process.Start(pdfFilePath);
}

1 个答案:

答案 0 :(得分:1)

我找到了答案:我得到了(没有详细记录的)TrimMargins属性的含义错误。设置修剪边距显然会将边距的大小添加到页面的宽度或高度。这意味着如果设置了修剪边距,则页面尺寸太大,并且在显示或打印时通常会缩小。我为修剪边距设置了2厘米,使得页面显然是1.25倍太大。解决方案是让所有修剪边距为0,并在打印代码中考虑任何所需的页边距。