Tilman,
I ended up handling this case by copying and overriding the SVGGraphics2D
drawImage() method as follows:
/**
* method to replace the SVGGraphics2D implementation and handle image
transparency by
* adding an "opacity" to the DOM element.
*
* called with:
* oImage Image object
* nX int width of image in pels
* nY int height of image in pels
* ImageObserver ImageObserver object
*/
public boolean drawImage( Image oImage,
int nX,
int nY,
ImageObserver oObserver)
{
// setup the DOM element to add to doc
Element oImageElement =
getGenericImageHandler().createElement(getGeneratorContext());
// set the transform and image handler
AffineTransform oTransForm = getGenericImageHandler().handleImage(
oImage,
oImageElement,
nX,
nY,
oImage.getWidth(null),
oImage.getHeight(null),
getGeneratorContext());
// determine it we need to add opacity to element
if ( oImage instanceof BufferedImage )
{ // is a buffered image, get it's transparency flag
int nTransparentType = ((BufferedImage)
oImage).getTransparency();
if ( nTransparentType == ColorModel.TRANSLUCENT )
{ // yes, add attribute to element, using ImageSite
default opacity value
String sOpacity =
DbSystemDefaults.DEF_SVG_IMAGE_OPACITY;
oImageElement.setAttribute(CSS_OPACITY_PROPERTY,
sOpacity);
}
}
// then add the element to the DOM
if (oTransForm == null)
{ // no transform, just add to DOM
domGroupManager.addElement(oImageElement);
}
else
{ // have a transform, calc the inverse
AffineTransform oInverseTransform = null;
try
{
oInverseTransform = oTransForm.createInverse();
}
catch(NoninvertibleTransformException e)
{
// This should never happen since handleImage
// always returns invertible transform
throw new SVGGraphics2DRuntimeException(ERR_UNEXPECTED);
}
// add transform, then the element, then invert the transform
gc.transform(oTransForm);
domGroupManager.addElement(oImageElement);
gc.transform(oInverseTransform);
}
return true;
}
Rich Stafford
Chief Scientist
eQuorum Corporation
***
At 11:44 PM 1/15/2025, Tilman Hausherr wrote:
>Hi,
>
>The PDF didn't get through. Please upload it to a sharehoster. Normally we
>would also need some code, but I have some that I can use.
>
>However I think I've seen this complaint before. The drawing is done in
>PageDrawer.drawBufferedImage(). The opacity is done in
>graphics.setComposite(....);
>
>Tilman
>
>On 15.01.2025 20:24, Rich Stafford wrote:
>>PDFBox:
>>
>>We are using PDFBox (3.0.3) and Batik (1.18) to render PDF files to SVG, with
>>great success. However, we have found that a text 'highlight' is rendered
>>as stroked text, and an image overlay. Which is fine, except the <img>
>>element for the highlight is defined without a transparency attribute, and
>>thus obscures the underlying text.
>>
>>I've attached a simple PDF test case, along with the rendered SVG result.Â
>>If I add opacity="0.40" to the <img> element, it will display properly.
>>
>>If we render this same PDF to JPG, the result is correct, with the text
>>showing on top of the highlight, so it would appear that the render code does
>>know that the image should be non-opaque?
>>
>>Any suggestions as to how to handle this? What PDFBox call is handling the
>>image rendering? I've already derived a sub-class from the SVGGraphics2d
>>object to handle other issues?
>>
>>Rich Stafford
>>Chief Scientist
>>eQuorum Corporation
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail:[email protected]
>>For additional commands, e-mail:[email protected]
>