Вопрос:
Кажется, я не могу заставить один формат координат работать с другим форматом. Я думаю, что просто использую не ту матрицу, но я недостаточно знаю о них, чтобы быть уверенным. Я надеялся получить некоторую помощь, чтобы выяснить, делаю ли я предположение о том, каким должно быть мое преобразование.
iText использует левый нижний угол в качестве исходной точки в соответствии со стандартом ISO, но код pdfbox и программа, которая дает мне координаты для извлечения из pdf, используют в качестве исходной точки верхний левый угол.
Какое преобразование я должен сделать, чтобы адаптировать координаты, чтобы iText мог использовать их так, как это будет работать?
Задний план
У меня есть код, который использует pdfbox для управления pdf и удаления некоторых данных, и теперь мне нужно вставить измененные данные обратно на страницу. Автор PDFBox продолжает портить PDF-файл, поэтому мы решили использовать iText для внедрения.
Хитрость в том, что координаты, которые я использовал с pdfbox (и те, которые мы получаем от системы, генерирующей pdf), похоже, не совпадают с координатами iText.
Что я сделал до сих пор
Я проверил, и страница iText, и рамка обрезки кажутся точными:
PdfReader splitPDFDocumentReader = new PdfReader(splitPDFdocumentName);
com.lowagie.text.Rectangle theCropBox = splitPDFDocumentReader.getCropBox(1);
com.lowagie.text.Rectangle thePageSize = splitPDFDocumentReader.getPageSize(1);
consolePrintln("Cropbox: " + theCropBox.toString());
consolePrintln("\tBottom " + theCropBox.getBottom());
consolePrintln("\tLeft " + theCropBox.getLeft());
consolePrintln("\tTop " + theCropBox.getTop());
consolePrintln("\tRight " + theCropBox.getRight());
consolePrintln("PageSize: " + thePageSize.toString());
consolePrintln("\tBottom " + thePageSize.getBottom());
consolePrintln("\tLeft " + thePageSize.getLeft());
consolePrintln("\tTop " + thePageSize.getTop());
consolePrintln("\tRight " + thePageSize.getRight());
Выходы:
Cropbox: Rectangle: 612.0x792.0 (rot: 0 degrees)
Bottom 0.0
Left 0.0
Top 792.0
Right 612.0
PageSize: Rectangle: 612.0x792.0 (rot: 0 degrees)
Bottom 0.0
Left 0.0
Top 792.0
Right 612.0
Это заставило бы меня поверить, что это всего лишь вопрос переворачивания координаты y, поскольку источник pdfbox находится в левом верхнем углу, а iTexts - в левом нижнем углу.
Где я столкнулся с проблемой
Когда я применяю преобразование:
// matrix data example:
// [m00, m01, m02,
// m10, m11, m12,
// 0 , 0 , 1 ] // this bit is implied as part of affineTransform docs
content.saveState();
int m00 = 1;
int m01 = 0;
int m02 = 0;
int m10 = 0;
int m11 = -1;
int m12 = 0;
content.concatCTM(m00, m10, m01, m11, m02, m12);
content.setColorStroke(Color.RED);
content.setColorFill(Color.white);
content.rectangle(x, y, x + height, y + width);
content.fillStroke();
content.restoreState();
Кажется, это не то, что я ожидал. Кажется, что данные полностью находятся за пределами страницы.
Разные примечания
Честно говоря, я не очень хорошо разбираюсь в матрицах, может быть, мне нужно сделать какую-то работу по переводу, а не просто филировать y, как я пытался сделать?
Функция concatCTM, похоже, имеет тот же формат, что и awt.geom.affinetransform, и я использую этот пример и tutorial по использованию преобразований.