PDFsharp, получить координаты страницы - PullRequest
0 голосов
/ 26 февраля 2019

Я прочитал «media box всегда [0, 0, page width, page height]», но MediaBox на моей PDF-странице равен [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 и mediabox "?


Дополнительный вопрос

1) Точное действие, которое я хочу сделать, - открыть PDF (созданный в другой библиотеке) и добавить прямоугольник в определенную позицию.

как я могу получить определенную позицию на страницах?

2) about "Окно кадрирования определяет область, в которую содержимое страницы должно быть обрезано (обрезано) при отображении или печати"

Насколько я понимаю, я не могу видеть за пределами области обрезки.когда я открывал файл с помощью программы чтения PDF

, но когда я открывал файл с помощью программы чтения PDF (acrobat), на первой странице было полноразмерное изображение, например this :

this

Изображение выглядит так, как будто оно было нарисовано вне области рамки обрезки, возможно ли это?


Я узнал что-то новое о своей проблеме и думаю, что моя проблема проходит через процесс, описанный ниже

  1. Когда я открываю PDF-файл с PDFSharp и получаю графический контекст, он преобразует систему координат.

  2. Когда я рисую элемент PDF в точке (0,0), он рисуется в точке (0,0) области рамки обрезки (на следующем рисунке элемент - зеленый прямоугольник)

  3. ЕСЛИ площадь поля corp равна [0, 300, 600, 1200], элемент рисуется в (0,300) точке области страницы.Поскольку поле кадрирования (0.0) равно (0,300)

  4. Поэтому, когда я сохраняю страницу, новый элемент будет на 300 пунктов ниже верхней части исходной страницы

Правильно ли я понял?

Если это правильно, могу ли я преобразовать координаты четырех углов поля обрезки, чтобы они соответствовали координатам страницы

Например.если я хочу нарисовать прямоугольник в верхней части страницы, нарисуйте его в (0, -300) вместо (0,0)

1

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Начнем с того, что поле мультимедиа здесь не самое важное, поле кадрирования - ср. этот ответ цитируя описание соответствующих полей из спецификации PDF.Если это явно не определено, то по умолчанию используется медиа-бокс.

И точно так же, как @Vive уже ответил, в общем случае вы не можете предположить, что превышает то, что указано, т.е.

MediaBox rectangle (Обязательный; наследуемый) Прямоугольник (см. 7.9.5, «Прямоугольники»), выраженный в единицах пространства пользователя по умолчанию, который долженопределить границы физического носителя, на котором страница должна отображаться или печататься (см. 14.11.2, «Границы страницы»).

CropBox rectangle (Необязательно; наследуется) Прямоугольник, выраженный в единицах пользовательского пространства по умолчанию, который должен определять видимую область пользовательского пространства по умолчанию.Когда страница отображается или печатается, ее содержимое должно быть обрезано (обрезано) до этого прямоугольника, а затем наложено на выходной носитель некоторым способом, определяемым реализацией (см. 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), а вместо этого где-нибудьelse.


Кстати, в конструкторах класс 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;
    }

Так что, как только вы наткнетесь на забавный мультимедийный блок, многие методы PdfSharp, использующие PdfRectangle, вероятно, потерпят неудачу чудесным образом.;)

0 голосов
/ 26 февраля 2019

Страницы PDF, созданные с помощью PDFsharp, всегда будут начинаться с (0, 0), если только создатель не настроил параметры страницы.

Для страниц, созданных с помощью других библиотек, вы не можете предполагать что-либо и должны принимать все элементы MediaBox вучетная запись при рисовании новых элементов на странице.

...