Am 02.09.2015 um 10:28 schrieb Lachezar Dobrev:
In-line
2015-09-01 19:31 GMT+03:00 Tilman Hausherr <[email protected]>:
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 Fields 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: [email protected]
For additional commands, e-mail: [email protected]