pdfbox-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tilman Hausherr <THaush...@t-online.de>
Subject Re: Replacing images in PDFs.
Date Wed, 02 Sep 2015 15:23:05 GMT
Am 02.09.2015 um 10:28 schrieb Lachezar Dobrev:
>    In-line
>
> 2015-09-01 19:31 GMT+03:00 Tilman Hausherr <THausherr@t-online.de>:
>
>> Am 01.09.2015 um 11:26 schrieb Lachezar Dobrev:
>>
>>>     Hello all.
>>>     I'm tasked with providing a service to generate PDFs from template PDFs
>>> by replacing text place holders and image place holders with data from a
>>> database.
>>> ​  For replacing text we decided to use Form Field​s to keep minimal
>>> effect
>>> on the page layout, and to avoid problems with texts being split into
>>> parts
>>> by the editor.
>>>     Replacing images is also achievable using
>>> COSStream.replaceWithStream(COSStream).
>>>
>>>     Q1: The replaceWithStream method is being deprecated. What can I use to
>>> do the same thing in PDFBox 2? I tried stream-copying, but I get a
>>> "WARNING: DCTFilter#encode is not implemented yet, skipping this stream."
>>> and the image disappears from the output file.
>>>
>> If you want to copy a JPEG, you should use createRawInputStream().
>>
>> The JPEG should be of the same size and same colorspace than the original
>> image.
>>
>> Alternatively - just put nothing in the templare, and simply put an image
>> of whatever size you want with traditional methods (see image handling in
>> PDPageContentStream)
>>
> ​  The image in the template PDF is needed to tell what to put where with
> what size.
>    Some time after I asked the question I found out I can create a COSStream
> using LosslessFactory.createFromImage(doc, img).getCOSStream()​
> ​. Afterwards I called createOutputStream(COSBase filter) with the filter
> of the new stream, and copied from one to the other. The replacing image is
> already the same size, but the colour profile may differ (Templates
> commonly contain a blank black-and-white all-white image as a place holder).
>
>     Q2: Is there any way to identify which image is what? Form fields have
>>> Mapping Name that I can use to detect which field needs to contain what,
>>> but I can not find a way to get some user-controllable identifier for an
>>> image. Any thoughts?
>>>
>> Images do have a name in the resources. So it should work if you do the
>> template yourself.
>>
> ​  I could not find how to obtain that. I don't see a getName() in
> PDImageXObject. Can you point me to where I should look for that?​


To get the XObject names, do this:

page.getResources().getXObjectNames()

to get an image with a specific name:

PDImageXObject img = (PDImageXObject) 
res.getXObject(COSName.getPDFName("TheImageName"));

The images do not know their own names.

To replace an image in the resource table, do

res.put(COSName.getPDFName("TheImageName"), img);


Note that you're bypassing the cache (if I've understood the source 
correctly), so you won't be able to get that updated image with the 
getXObject() method.


Tilman



>
> Tilman
> ​  Thank you for the patience.​
>
> ​  Lachezar​
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


Mime
View raw message