PDFsharp,获取Page的坐标

问题描述 投票:0回答:2

我读过“媒体盒总是[0, 0, page width, page height]”但我的PDF页面的MediaBox是[0 383 599 1224]

因此,当我画“gfx.drawLine(XPens.gold, 0,0, 100, 50);”这样的线条时,它会在页面中间呈现。

当我画“gfx.drawLine(XPens.gold, 0, -200, 100, 50);”这样的线条时,它会在页面顶部呈现。

我想在所有PDF页面上的相同位置画一条线。 如果我使用以下代码,这是正确的方法吗?

gfx.drawline(Xpens.gold, (X - pdfpage.mediabox.x1),
    (Y - pdfpage.mediabox.y1 ), width, height);

我可以参考一下“PDF页面大小和媒体盒”吗?


附加问题

1)我想要做的确切操作是打开PDF(创建其他库)并将矩形添加到特定位置。

我怎样才能在页面中获得具体位置?

2)关于“裁剪框定义了显示或打印时页面内容应被裁剪(裁剪)的区域”

据我所知,我看不到裁剪框区域外。当我用PDF阅读器打开文件时

但是当我使用PDF阅读器(acrobat)打开文件时,第一页有一个完整大小的图像,如this

图像看起来像是在裁剪框区域外绘制的,是否可能?


我学到了一些关于我的问题的新知识,我认为我的问题贯穿于下面的过程

  1. 当我用PDFSharp打开PDF文件并获取图形上下文时,它会转换坐标系。
  2. 当我在(0,0)处绘制一些PDF元素时,它会在裁剪框区域的(0,0)点处绘制(在下图中,元素是绿色矩形)
  3. 如果公司框的区域是[0,300,600,1200],则在页面区域的(0,300)点处绘制元素。因为裁剪框的(0.0)等于页面'(0,300)
  4. 因此,当我保存页面时,新元素将比原始页面顶部低300点

我做对了吗?

如果它是正确的,我可以转换裁剪框的四个角的坐标以匹配页面坐标

例如。如果我想在页面顶部绘制矩形,请在(0,-300)而不是(0,0)绘制它

.net pdf pdfsharp
2个回答
0
投票

除非创作者调整页面设置,否则使用PDFsharp创建的PDF页面始终从(0,0)开始。

对于使用其他库创建的页面,您不能假设任何内容,并且在将新元素绘制到页面上时必须考虑MediaBox的所有元素。


0
投票

首先,媒体盒不是这里最重要的盒子,裁剪盒是,参见this answer引用PDF规范中相关框的描述。但是,如果未明确定义,则默认为媒体框。

就像@Vive已经回答的那样,一般来说你不能假设任何超出规定的东西,即

MediaBox矩形(必需;可继承)一个矩形(见7.9.5,“矩形”),以默认用户空间单位表示,它应定义要在其上显示或打印页面的物理介质的边界(见14.11.2) ,“页面边界”)。

CropBox矩形(可选;可继承)以默认用户空间单位表示的矩形,用于定义默认用户空间的可见区域。当显示或打印页面时,其内容应被剪裁(裁剪)到该矩形,然后以某种实现定义的方式强加到输出介质上(见14.11.2,“页面边界”)。默认值:MediaBox的值。

(ISO 32000-1,表30 - 页面对象中的条目)

与...结合

矩形用于描述页面上的位置和各种对象的边界框。矩形应写为四个数字的数组,给出一对对角线的坐标。

(ISO 32000-1,第7.9.5节矩形)

在野外,你会发现各种媒体盒,特别是你甚至找到不包含[lower-left-x lower-left-y upper-right-x upper-right-y]的媒体盒,而是使用左上角和右下角或从右上角坐标开始的媒体盒之后是左下坐标!但是,它们很少,所以你可能很幸运,也不必处理这样的盒子。

另一方面,不是从原点(0,0)开始而是在其他地方开始并不罕见。


顺便说一句,在构造函数中,PdfSharp的PdfRectangle类非常清楚两个给定点只是对角线对角但不一定是左下角,然后是右上角,并且不对坐标进行排序,参见那里的评论,例如:

    /// <summary>
    /// Initializes a new instance of the PdfRectangle class with two points specifying
    /// two diagonally opposite corners.
    /// </summary>
    public PdfRectangle(XPoint pt1, XPoint pt2)
    {
        _x1 = pt1.X;
        _y1 = pt1.Y;
        _x2 = pt2.X;
        _y2 = pt2.Y;
    }

但是后来,例如在Contains方法中,代码突然假设第一个点是左下角,第二个点是右上角,例如

    /// <summary>
    /// Determines if the specified point is contained within this PdfRectangle.
    /// </summary>
    public bool Contains(double x, double y)
    {
        // Treat rectangle inclusive/inclusive.
        return _x1 <= x && x <= _x2 && _y1 <= y && y <= _y2;
    }

因此,只要您偶然发现一个有趣的媒体框,许多使用PdfRectangle的PdfSharp方法很可能会以奇妙的方式失败。 ;)

© www.soinside.com 2019 - 2024. All rights reserved.