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 >