Tilman,

Turns out, it's a pretty trivial change to both PDFBox PageDrawer.fillPath(), 
and SVGGraphics2D.fill() to get non-solid fill to work.

For PageDrawer.fillPath(), add some code to check for TilingPaint, extract the 
TexturePaint and send it:

        if (isContentRendered() && !shape.getPathIterator(null).isDone())
        {
            // creating Paint is sometimes a costly operation, so avoid if 
possible
                // check if we are painting with a raster pattern
                Paint oPaint = getNonStrokingPaint();
                if ( oPaint instanceof TilingPaint )
                {   // yes, send the raster data to be used as fill
                    TilingPaint  oTiling = (TilingPaint) oPaint;
                    TexturePaint oTexture = (TexturePaint) oTiling.getPaint();
                    graphics.setPaint(oTexture);
                }

                // then fill it
            graphics.fill(shape);
        }
        
For SVGGraphics2D fill(Shape s), I created an override class to add a check for 
a TexturePaint:

    @Override
    public void fill(Shape s) 
    {
                // see if there is an image associated with the shape
                Paint oPaint = this.gc.getPaint();
                if ( oPaint instanceof TexturePaint )
                {   // yes, coming from PDFBox, or some such pattern handler
                    // get the Image data and draw it
                    TexturePaint oTexture = (TexturePaint) oPaint;
                    BufferedImage oImg = oTexture.getImage();
                    drawImage(oImg, 0, 0, null);
                }

                // draw the shape component
                Element svgShape = shapeConverter.toSVG(s);
                if (svgShape != null) {
                domGroupManager.addElement(svgShape, DOMGroupManager.FILL);
                }
    }

Having an override for SVGGraphics2D will work for my environment, but I don't 
think I can override PageDrawer.  For the moment, I'm just running with a 
modified copy of it.

How do I go about getting this mod into PageDrawer?

Rich Stafford
Chief Scientist
eQuorum Corporation



At 02:25 PM 1/19/2023, Tilman Hausherr wrote:
>That is an ordinary image, so SVGGraphics2D can translate this into "<image" 
>easily bit by bit. SVGGraphics2D should probably handle non Color Paints by 
>generating a temporary bitmap and then output that one.
>
>Tilman
>
>On 19.01.2023 12:51, Rich Stafford wrote:
>>Tilman,
>>
>>Actually, SVGGraphics2D handles raster data well.  Take a look at this PDF 
>>containing an image, and the rendered SVG file:
>>
>>PDF:<https://s3.amazonaws.com/webdl.equorum.com/misc/size2013-image.pdf>https://s3.amazonaws.com/webdl.equorum.com/misc/size2013-image.pdf
>>  
>>SVG:<https://s3.amazonaws.com/webdl.equorum.com/misc/size2013-image-page-0.svg>https://s3.amazonaws.com/webdl.equorum.com/misc/size2013-image-page-0.svg
>>  
>>
>>The image data is passed to SVG in the PageDrawer.drawImage() method, which 
>>calls PageDrawer.drawBufferedImage() to send the raster data to SVG.
>>
>>When drawing the pattern data, PageDrawer just sends a TilingPaint object, 
>>and SVGGraphics2D can't handle that.
>>
>>Rich
>>
>>At 12:38 PM 1/18/2023, Tilman Hausherr wrote:
>>>Hi,
>>>
>>>I can't see the images, they are probably attachments instead of being fully 
>>>inline with "data:", so they are removed by the mailing list software.
>>>
>>>We can't expose TilingPaint, because that's our internal strategy to 
>>>implement this paint, and it might change (e.g. not using the bitmap). The 
>>>bitmap is just the base for a TexturePaint, to which our class delegates to. 
>>>At the end it's not our bitmap that appears, it's many of them. And 
>>>TilingPaint isn't the only class derived from Paint. There's also 
>>>SoftMaskPaint and many ShadingPaint classes so these are likely also a 
>>>problem.
>>>
>>>I suspect that the answer is that it just won't work, SVG isn't meant for 
>>>raster stuff. See also this comment by another PDF project, they're also not 
>>>supporting SVG:
>>>https://github.com/mozilla/pdf.js/issues/12404#issuecomment-697199750
>>>
>>>Tilman
>>>
>>>
>>>
>>>On 18.01.2023 16:44, Rich Stafford wrote:
>>>>Tilman,
>>>>
>>>>I'm still working on the issue where a patterned PDF object doesn't get 
>>>>written to SVG.
>>>>
>>>>I see where PageDrawer.fillPath() is computing a raster containing the 
>>>>pattern and passing that to the SVGGraphics2D fill() method:
>>>>
>>>>Emacs!
>>>>
>>>>The issue is that the default SVGGraphics2D fill(Shape) method only fills 
>>>>with a solid color.
>>>>
>>>>I have overridden the SVGGraphics2D fill() class to be able to handle 
>>>>filling with a bitmap. However, the getNonStrokingPaint() call is returning 
>>>>a TilingPaint object, and that object is not visible from within the 
>>>>SVGGraphics2D class.
>>>>
>>>>Emacs!
>>>>
>>>>How can I get the contained BufferedImage object as that's what I need to 
>>>>use to write to SVG?
>>>>
>>>>Emacs!
>>>>
>>>>
>>>>It would seem like I need to add another SVGGraphics.fill() method that 
>>>>takes the Shape, and the BufferedImage, but to use that I would also need 
>>>>to override or modify the PageDrawer.fillPath() method?
>>>>
>>>>Rich Stafford
>>>>Chief Scientist
>>>>eQuorum Corporation
>>>>***
>>>>Tilman,
>>>>
>>>>I've traced the code, and see where it is stroking the pattern onto a 
>>>>TilingPaint object in response to the PDF 'B' operator. However, I don't 
>>>>see any code that adds the generated bitmap to the DOM. Consequently, it 
>>>>never gets written to the output SVG.
>>>>
>>>>I"m using the default ImageHandlerBase64Encoder which is supposed to store 
>>>>the base64 encoded images directly in the SVG output/
>>>>
>>>>What am I missing?
>>>>
>>>>Rich Stafford
>>>>Chief Scientist
>>>>eQuorum Corporation
>>>>
>>>>At 12:26 PM 1/6/2023, Tilman Hausherr wrote:
>>>>>Hi,
>>>>>
>>>>>This is in TilingPaint.javaÂÂ  and PageDrawer.java . It's one of the 
>>>>>tricky parts in the code. No we can't draw them as vectors.
>>>>>
>>>>>Tilman
>>>>>
>>>>>On 06.01.2023 17:57, Rich Stafford wrote:
>>>>>>Which PDFBox module handles the patterns?  Is there anyway to have 
>>>>>>PDFBox draw the patterns as vectors?
>>>>>>
>>>>>>Rich
>>>>>>
>>>>>>At 11:40 AM 1/6/2023, Tilman Hausherr wrote:
>>>>>>>Hi,
>>>>>>>
>>>>>>>I can confirm the effect with my own conversion code (which may or may 
>>>>>>>not be the same). I looked at the SVG and there's one thing missing: 
>>>>>>>PDFBox converts patterns to bitmaps and then uses TexturePaint. So there 
>>>>>>>should be some binary content in the SVG but there isn't. Could it be 
>>>>>>>that there is some option that should be set?
>>>>>>>
>>>>>>>Btw the PDF has some errors, like 0 255 0 scÂÂ  (or rg), this
>>>>>>> should be 0 1 0 sc (or rg). But this isn't the cause.
>>>>>>>
>>>>>>>Tilman
>>>>>>>
>>>>>>>On 06.01.2023 14:51, Rich Stafford wrote:
>>>>>>>>Tilman:
>>>>>>>>
>>>>>>>>Thanks for your quick response.ÂÂ  I've upgraded to PDFBox 2.0.27,
>>>>>>>> with the same results.
>>>>>>>>
>>>>>>>>The PDF file can be downloaded here:
>>>>>>>>
>>>>>>>>https://s3.amazonaws.com/webdl.equorum.com/misc/size2013.pdf
>>>>>>>>
>>>>>>>><https://s3.amazonaws.com/webdl.equorum.com/misc/size2013.pdf >Thanks 
>>>>>>>>for any assistance.ÂÂ  I'm going to start tracing thru
>>>>>>>> Batik source code for the SVG error.
>>>>>>>>
>>>>>>>>Rich Stafford
>>>>>>>>Chief Scientist
>>>>>>>>eQuorum Corporation
>>>>>>>>***
>>>>>>>>At 01:28 PM 1/5/2023, Tilman Hausherr wrote:
>>>>>>>>>Hi,
>>>>>>>>>
>>>>>>>>>Please try with 2.0.27 and upload the PDF somewhere, it didn't get 
>>>>>>>>>through.
>>>>>>>>>
>>>>>>>>>Tilman
>>>>>>>>>
>>>>>>>>>On 05.01.2023 16:28, Rich Stafford wrote:
>>>>>>>>>>I am having an issue using PDFBox (pdfbox-app-2.0.21.jar) and 
>>>>>>>>>>SVGGraphics2d (batik-1ll-1.16.jar) to generate SVG output from a 
>>>>>>>>>>small PDF file.
>>>>>>>>>>
>>>>>>>>>>This file has about 9 vector lines, and a rectangle filled with 
>>>>>>>>>>horizontal lines.ÂÂÂ  Using the PDFBox PDFRenderer to 
>>>>>>>>>>JPG, I
>I
>>>>>>>>>>get the appropriate fill for the rectangle:
>>>>>>>>>>
>>>>>>>>>>screen capture:
>>>>>>>>>>Emacs!
>>>>>>>>>>
>>>>>>>>>>However, using the PDFBox PDFRenderer with SVGGraphics2d, I get a 
>>>>>>>>>>black filled rectangle.
>>>>>>>>>>
>>>>>>>>>>screen capture:
>>>>>>>>>>Emacs!
>>>>>>>>>>
>>>>>>>>>>The generator code fragment is as follows:
>>>>>>>>>>
>>>>>>>>>>// setup instance of org.w3c.dom.Document
>>>>>>>>>>DOMImplementation oDom= 
>>>>>>>>>>GenericDOMImplementation./getDOMImplementation/();
>>>>>>>>>>String sSvgOrg=" http://www.w3.org/2000/svg";;
>>>>>>>>>>Document oSvgDoc= oDom.createDocument(sSvgOrg, "svg", *null*);
>>>>>>>>>>SVGGeneratorContext oCtx= 
>>>>>>>>>>SVGGeneratorContext./createDefault/(oSvgDoc);
>>>>>>>>>>oCtx.setEmbeddedFontsOn(*true* );
>>>>>>>>>>
>>>>>>>>>>// setup renderer object
>>>>>>>>>>PDFRenderer oRender= *new* PDFRenderer( oDoc);
>>>>>>>>>>
>>>>>>>>>>// loop for all pages in the PDF
>>>>>>>>>>*for* ( *int* nPageNdx= 0; nPageNdx< oDoc.getNumberOfPages(); 
>>>>>>>>>>nPageNdx++ )
>>>>>>>>>>{
>>>>>>>>>>// setup output file
>>>>>>>>>>*if* ( sOutputMode.equalsIgnoreCase("svg") )
>>>>>>>>>>{// svg
>>>>>>>>>>String sSvgPageSpec= GenericUtil./PathMake/(sDestPath, "page-"+ 
>>>>>>>>>>nPageNdx+".svg");
>>>>>>>>>>( *new* File( sSvgPageSpec)).createNewFile();
>>>>>>>>>>// setup instance of SVG Generator
>>>>>>>>>>SVGGraphics2D oSvgGen= *new* SVGGraphics2D( oCtx, *false*);
>>>>>>>>>>// render the page to SVG
>>>>>>>>>>oRender .renderPageToGraphics( nPageNdx, oSvgGen);
>>>>>>>>>>// write to file
>>>>>>>>>>OutputStream oOutStream= *new* FileOutputStream( *new* 
>>>>>>>>>>File(sSvgPageSpec) );
>>>>>>>>>>Writer oOutWriter= *new* OutputStreamWriter( oOutStream, "UTF-8");
>>>>>>>>>>oSvgGen .stream( oOutWriter, *true*);
>>>>>>>>>>*continue* ;
>>>>>>>>>>}
>>>>>>>>>>*if* ( sOutputMode.equalsIgnoreCase("jpg") )
>>>>>>>>>>{// jpg output
>>>>>>>>>>String sJpgPageSpec= GenericUtil./PathMake/(sDestPath, "page-"+ 
>>>>>>>>>>nPageNdx+".jpg");
>>>>>>>>>>File oFileJpg= *new* File(sJpgPageSpec);
>>>>>>>>>>BufferedImage image= oRender.renderImageWithDPI(nPageNdx, 
>>>>>>>>>>GenericUtil./parseInt/(sDpi, 300));
>>>>>>>>>>Â Â Â Â ImageIO./write/(image, 
>>>>>>>>>>"JPEG", oFileJpg);
>Jpg);
>>>Jpg);
>>>>>Jpg);
>>>>>>>>>>continue;
>>>>>>>>>>}
>>>>>>>>>>}
>>>>>>>>>>
>>>>>>>>>>I've attached the input PDF file as well.
>>>>>>>>>>
>>>>>>>>>>Thoughts?
>>>>>>>>>>
>>>>>>>>>>Rich Stafford
>>>>>>>>>>Chief Scientist
>>>>>>>>>>eQuorum Corporation
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>---------------------------------------------------------------------
>>>>>>>>>>To unsubscribe, e-mail:
>>>>>>>>>>users-unsubscr...@pdfbox.apache.org
>>>>>>>>>>For additional commands, e-mail:
>>>>>>>>>>users-h...@pdfbox.apache.org
>>>>>
>>>>>---------------------------------------------------------------------
>>>>>To unsubscribe, e-mail:users-unsubscr...@pdfbox.apache.org
>>>>>For additional commands, e-mail:users-h...@pdfbox.apache.org
>

Reply via email to