pdfbox-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dave Smith (JIRA)" <j...@apache.org>
Subject [jira] [Created] (PDFBOX-1445) /ImageMask true does not work. Patch included.
Date Tue, 13 Nov 2012 13:50:11 GMT
Dave Smith created PDFBOX-1445:
----------------------------------

             Summary: /ImageMask true does not work. Patch included.
                 Key: PDFBOX-1445
                 URL: https://issues.apache.org/jira/browse/PDFBOX-1445
             Project: PDFBox
          Issue Type: Bug
            Reporter: Dave Smith


I have the following pdf...

10 0 obj
<< 
/Type /Page 
/MediaBox [ 0 0 612.0 792.0 ] 
/Parent 3 0 R 
/Resources << /XObject << /Obj4 4 0 R /Obj5 5 0 R /Obj6 6 0 R /Obj7 7 0 R >>
/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> 
/Contents [ 8 0 R 9 0 R ] 
>> 
endobj

Which then draws 4 images. The first one is a "base" and then rest are image masks

9 0 obj
<< /Filter /FlateDecode /Length 121 >> 
stream
q
612.00 0 0 792.00 0.00 0.00 cm
/Obj4 Do
Q
q
0.129 g
524.16 0 0 556.80 48.00 127.68 cm
/Obj5 Do
Q
q
0.302 g
220.80 0 0 398.40 48.00 286.08 cm
/Obj6 Do
Q
q
0.204 g
524.16 0 0 469.44 48.00 185.28 cm
/Obj7 Do
Q
endstream
endobj


4 0 obj
<< /Type /XObject /Subtype /Image /Width 1275 /Height 1650 /BitsPerComponent 8 
/ColorSpace /DeviceGray /Filter [ /FlateDecode /DCTDecode ] /Length 50485 >> 
stream
endstream
endobj


5 0 obj
<< /Type /XObject /Subtype /Image /Width 2184 /Height 2320 /BitsPerComponent 1 
/ImageMask true /Filter /CCITTFaxDecode /DecodeParms << /K -1 /Columns 2184 >>

/Length 15580 >> 
stream


etc ...


The current code simply treats the imagemask as an image. Since this is just a 1 bit image
it has no Alpha channel it overwrites the existing image and we simply get the last image
drawn.

In

org.apache.pdfbox.util.operator.pagedrawer.Invoke.java

method

public void process(PDFOperator operator, List<COSBase> arguments) throws IOException

after 

if (awtImage == null) 
                {
                    LOG.warn("getRGBImage returned NULL");
                    return;//TODO PKOCH
                }

If you add the following code it fixes the problem. I can not provide the sample doc due to
privacy reasons. 

/**
                 * Spec 8.9.6.2
                 * If ImageMask is true then the image is one bit. Black means draw the current
colour and white means use the colour on the current image (ie Mask). 
                 * Convert the map to an image with an Alpha channel so we can lay it on top
                 */
                if(image.getImageMask())
                {
                	Color currentColour = drawer.getGraphicsState().getStrokingColor().getJavaColor();
                	final int onColour = 0xff000000 | currentColour.getRGB();
                	BufferedImage bia = new BufferedImage(awtImage.getWidth(),awtImage.getHeight(),BufferedImage.TYPE_INT_ARGB);
                	for(int y=0;y<awtImage.getHeight();y++)
                	{
                		for(int x=0;x<awtImage.getWidth();x++)
                		{
                			bia.setRGB(x, y, (awtImage.getRGB(x, y) & 0x00ffffff) == 0xffffff ?
0x00ffffff : onColour);
                		}
                	}
                	awtImage = bia;
                }







--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message