Как изменить размер существующего PDF с Coldfusion / iText - PullRequest
0 голосов
/ 03 ноября 2010

Я видел множество способов изменить размер страницы нового пустого документа, но я не могу заставить его работать с PDF, к которому я обращался через pdfReader

Помощь

Ответы [ 2 ]

2 голосов
/ 03 ноября 2010

Предупреждение: я очень мало знаю о CF, но немного о iText.

Ответ Генри сработает, но он может быть немного более эффективным.

Вы хотите PdfStamper.Изменение размера страницы не поддерживается напрямую на более высоком уровне, поэтому вам придется использовать низкоуровневые вызовы объектов pdf.Например:

final static float POINTS_PER_INCH = 72f;
final static float INCHES_TO_ADD = 3f;

PdfReader reader = new PdfReader(pdfPath); // throws
PdfStamer stamper = new PdfStamper(reader, outputStream); // throws

for (int curPageNum = 1; curPageNum <= reader.getNumberOfPages(); ++curPageNum) {
  PdfDictionary pageDict = reader.getPageN(curPageNum);
  // pdf rects are stored as [llx, lly, urx, ury].
  // X increases to the right, Y increases upward.  
  // Note that the origin doesn't have to be 0,0.
  PdfArray mediaBox = pageDict.getAsArray(PdfName.MEDIABOX);
  float curBottom = mediaBox.getAsNumber(1).floatValue();
  curBottom -= INCHES_TO_ADD * POINTS_PER_INCH;
  mediaBox.set(1, new PdfNumber(curBottom));
}

stamper.close(); // throws

В дополнение к мультимедийному блоку вам также может понадобиться изменить CROPBOX, используя ту же технику «получить прямоугольник, отрегулировать дно».Обратите внимание, что в вашем PDF-файле могут существовать несколько других блоков страниц, которые могут или не должны быть изменены ... "art box", "trim box", "bleed box".Возможно, я тоже забыл одну или две.

Это почти наверняка приведет к отрицательному значению вашей нижней координаты Y [s].Если ваш PDF обрабатывается программным обеспечением «Меньше, чем хорошо», это может быть проблемой.Это было бы ошибкой в ​​их программном обеспечении, а не в этом процессе.Однако, если вам нужно обойти проблему, подобную этой, код Генри сделает свое дело, создав страницы с 0,0 в левом нижнем углу.Adobe не бросит глаз, как и сам iText, хотя программное обеспечение, написанное с использованием iText, может быть не слишком умным.

1 голос
/ 03 ноября 2010

не уверен, что это работает, но вот что я нашел

Вы можете использовать чистый PDF с нужным размером страницы в качестве отправной точки, а затем наложить сегменты PDF в правильном положении в качестве водяных знаковиспользуя DDX.Вам, вероятно, нужно сгладить файл PDF после добавления каждого водяного знака.

http://www.houseoffusion.com/groups/cf-talk/thread.cfm/threadid:62109

Не проверяли код, но может быть что-то подобное?

<cfpdf name="resizedPdf" action="addwatermark" source="blank.pdf" copyfrom="image.pdf">
<cfpdf name="resizedPdfWithFooter" action="addfooter" source="resizedPdf" text="xyz">

см. <cfpdf> документ: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7995.html

...