Как я могу добавить изображение в PDF с определенными координатами x-y, используя IText? - PullRequest
1 голос
/ 28 июня 2011

У меня есть существующие PDF-файлы, к которым мне нужно динамически добавлять изображение / изображения. Изображение приходит из файла загрузки. Как только у меня будет загруженный файл, как можно указать, куда поместить изображение в PDF. Один фрагмент кода, который я нашел, не работает правильно. Это должно работать для PDF-файлов с любым количеством страниц. Насколько я понимаю, абсолютное позиционирование задается в нижнем левом углу последней страницы PDF. Если мне нужно, чтобы изображение отображалось в 30 пикселях сверху и в 50 пикселях слева от страницы 1, как мне это сделать? Или, если мне нужно отобразить изображение 50 пикселей сверху / 100 пикселей слева на странице 2?

Я пытался использовать код, найденный на http://rip747.wordpress.com/2009/03/26/add-an-image-dynamically-to-a-pdf-with-cf-and-itext/. Я изменил его для своих нужд ниже:

<cfscript>
    myLeft = 30;
    myTop = 50;
    myPageNum = 1;

    // output buffer to write PDF
    fileIO = createObject("java","java.io.FileOutputStream").init(myOutputPath);

    // reader to read our PDF
    reader = createObject("java","com.lowagie.text.pdf.PdfReader").init(mySourcePath);

    // stamper so we can modify our existing PDF
    stamper = createObject("java","com.lowagie.text.pdf.PdfStamper").init(reader, fileIO);

    // get the content of our existing PDF
    content = stamper.getOverContent(reader.getNumberOfPages());

    // create an image object so we can add our dynamic image to our PDF
    image = createobject("java", "com.lowagie.text.Image");

    // initalize our image
    img = image.getInstance(imgPath);

    x = (reader.getPageSize(1).width() - img.scaledWidth()) - myLeft;
    y = (reader.getPageSize(1).height() - img.scaledHeight()) - myTop;

    // now we assign the position to our image
    img.setAbsolutePosition(javacast("float", x), javacast("float", y));

    // add our image to the existing PDF
    content.addImage(img);

    // flattern our form so our values show
    stamper.setFormFlattening(true);

    // close the stamper and output our new PDF
    stamper.close();

    // close the reader
    reader.close();
</cfscript>

Приведенный выше код помещает мое изображение в верхнем правом углу страницы 2 - 50 пикселей сверху / 30 пикселей слева.

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

Я обновил свой код. Это приводит к тому, что изображение попадает в верхний левый угол страницы 2 - правильное расположение, но я хочу, чтобы оно было на странице 1:

x = myLeft;
y = (reader.getPageSize(1).height()) - img.scaledHeight() - myTop;

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

// I figure I'll need something like this to handle multi-page docs
y = (reader.getPageSize(1).height() * reader.getNumberOfPages()) - img.scaledHeight() - myTop;

y = reader.getPageSize(1).height() + reader.getPageSize(1).height() - img.scaledHeight() - myTop;

Ответы [ 3 ]

6 голосов
/ 28 июня 2011

Вы получаете ваш «OverContent» от stamper.getOverContent(reader.getNumberOfPages());. Параметр для getOverContent() является номером страницы. Таким образом, ваш код получает PdfContentByte за последнюю страницу, а не за первую.

1 голос
/ 28 июня 2011

Я нашел свой ответ:

Номер страницы должен быть установлен в com.lowagie.text.pdf.PdfStamper.getOverContent():

content = stamper.getOverContent(myPageNum);

Знал, что это было легко.

0 голосов
/ 28 июня 2011

вы используете CF8 +? Вы можете использовать

<cfpdf action="addWatermark" source="myPDF.pdf" image="myImage.jpg" 
       position="0,0" rotation="0" showOnPrint="true" opacity="10">
...