Как точно расположить изображение внутри существующей страницы PDF с помощью PDFBox? - PullRequest
8 голосов
/ 17 февраля 2012

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

  1. Изображение размещено внизу страницы
  2. Страница становится белойс добавленным текстом.

Я использую следующий код.

List<PDPage> pages = pdDoc.getDocumentCatalog().getAllPages();

if(pages.size() > 0){
    PDJpeg img = new PDJpeg(pdDoc, in);
    PDPageContentStream stream = new PDPageContentStream(pdDoc,pages.get(0));
    stream.drawImage(img, 60, 60);
    stream.close();
}

Я хочу изображение на первой странице.

Ответы [ 4 ]

9 голосов
/ 23 февраля 2012

PDFBox - это низкоуровневая библиотека для работы с PDF-файлами.Вы несете ответственность за более высокоуровневые функции.Таким образом, в этом примере вы размещаете свое изображение на (60, 60), начиная с левого нижнего угла документа.Это то, что делает stream.drawImage(img, 60, 60);.

Если вы хотите переместить изображение в другое место, вам нужно рассчитать и указать требуемое местоположение (возможно, из измерений, полученных с помощью page.findCropBox(), или вручную ввести ваше местоположение).

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

Наконец, когда ваша страница станет белой - вы создаете новый поток контента ипоэтому перезаписываю оригинал для своей страницы.Вы должны добавить к уже доступному потоку.

Соответствующая строка:

PDPageContentStream stream = new PDPageContentStream( pdDoc, pages.get(0));

Что вы должны сделать, это назвать так:

PDPageContentStream stream = new PDPageContentStream( pdDoc, pages.get(0), true, true);

Первый true - это ли добавить содержимое , и окончательный true (здесь не критично): сжимать поток.

Взгляните на AddImageToPDF образец, доступный из Исходники PDFBox .

1 голос
/ 19 января 2013

Попробуйте это

doc = PDDocument.load( inputFileName );
PDXObjectImage ximage = null;
ximage = new PDJpeg(doc, new FileInputStream( image )
PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get(0);
PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true);
contentStream.drawImage( ximage, 425, 675 );
contentStream.close();

Это напечатает изображение на первой странице.Если вы хотите печатать на всех страницах, просто включите цикл for с условием количества страниц в качестве ограничения.Это хорошо сработало для меня!

0 голосов
/ 05 июня 2018

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

, где out - ссылочная переменная BufferedImage

    PDPage page = new PDPage();
    outputdocument.addPage(page);
    PDPageContentStream contentStream = new PDPageContentStream(outputdocument, page, AppendMode.APPEND, true);
    PDImageXObject pdImageXObject = JPEGFactory.createFromImage(outputdocument, out);
    contentStream.drawImage(pdImageXObject, 5, 2, 600, 750);
    contentStream.close();
0 голосов
/ 13 февраля 2013

Эта ссылка содержит подробности о Классе PrintImageLocations . Это PrintImageLocations даст вам координаты x и y изображений.

Использование: java org.apache.pdfbox.examples.util.PrintImageLocations input-pdf

...