Проблема с системой координат и смещенным текстом в разных PDF-файлах с использованием iTextSharp

Я работаю с iTextSharp и .NET 3.5 SP1 (на C#, как вы можете догадаться) и изменяю некоторые существующие PDF-файлы, используя класс PdfStamper. Теперь у меня две проблемы:

Преобразование системы координат

Насколько я понимаю, iTextSharp использует (постскриптум?) точки в качестве единицы измерения, но я хотел бы преобразовать эти координаты в миллиметры. Теперь, как лучший способ достичь этого?

Взглянув на документацию, я обнаружил следующий подход:

PdfContentByte cb = new PdfContentByte();
System.Drawing.Drawing2D.Matrix scale = new System.Drawing.Drawing2D.Matrix(
    0.352777778, 0, 0.352777778, 0, 0, 0); // 1 point = 0.352777778 mm
cb.Transform(scale);

Надеюсь, я правильно понял матрицу преобразования. Но вот проблема: Нет System.Drawing.Drawing2D сборки! Эта сборка упала или что с ней случилось? Что я могу сделать, чтобы преобразовать координаты iTextSharp в миллиметры. Я на неправильном пути здесь?

Текст в PDF смещается в другом PDF с теми же координатами

Я заметил, что при изменении двух разных PDF-файлов с одним и тем же содержимым одни и те же координаты сместились, и текст не размещается в одних и тех же местах. Что вызывает это и как я могу предотвратить это?

Это первый PDF:

альтернативный текст

Это второй PDF-файл, созданный с использованием тех же координат в iTextSharp:

альтернативный текст

Любая помощь приветствуется.


person Michael Klement    schedule 14.05.2009    source источник


Ответы (2)


Но проблема в том, что нет сборки System.Drawing.Drawing2D! Эта сборка упала или что с ней случилось? Что я могу сделать, чтобы преобразовать координаты iTextSharp в миллиметры. Я на неправильном пути здесь?

http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.matrix.aspx (в System.Drawing.dll)

person Community    schedule 14.05.2009
comment
Как использовать этот класс? Я уже вставил файл using System.Drawing; оператор, но он по-прежнему не распознает System.Drawing.Drawing2D.Matrix. Я не уверен, что означает System.Drawing.dll. Должен ли я включать это как-то по-другому? - person Michael Klement; 14.05.2009
comment
Вы должны ссылаться на System.Drawing.Dll. В своем проекте найдите папку References. Щелкните правой кнопкой мыши «Добавить ссылку», затем через пять минут найдите System.Drawing.Dll на первой вкладке. А теперь верните мне мои 2 балла! - person ; 17.05.2009
comment
После того, как вы сослались на него, вы можете использовать его, как в примере. Они выполняют матричные преобразования, что не так просто изучить или понять. Боюсь, вам придется кое-что прочитать самостоятельно, если вы хотите сделать больше, чем демонстрирует пример кода. - person ; 17.05.2009
comment
С удовольствием, но вы должны отредактировать свой пост, прежде чем я смогу проголосовать за него. Лучше всего поместить свое объяснение из комментария в публикацию, чтобы другие пользователи увидели его напрямую. Спасибо! :) - person Michael Klement; 19.05.2009
comment
1) они это видят 2) это принципиально 3) я ленивый - person ; 19.05.2009
comment
Тогда я боюсь, что не могу проголосовать за вас, поскольку SO не позволяет изменить голос против на голос за старые сообщения. Но все в порядке, я думаю, вы сделали все возможное, чтобы заслужить это. - person Michael Klement; 23.05.2009

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

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

person Michael Klement    schedule 15.05.2009