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 > >>>>>>>>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); >>>>>>>>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 >