Tilman, I see what you mean for the Sample.pdf case (#9770), with my code calling graphics.setPaint() with the TexturePaint extracted object, I get a big circle. Commenting out that setPaint() call restores proper operation. Doesn't matter if I call setPaint() with the original TiledPaint object after doing the fill, I get the same result.
Do you have any suggestions? Rich At 09:41 AM 1/20/2023, Tilman Hausherr wrote: >Hi, > >It doesn't work (not just because the "else" is missing), but because it isn't >that simple. Please try the files from >https://github.com/mozilla/pdf.js/issues/9770 >https://github.com/mozilla/pdf.js/issues/7731 >https://bugs.ghostscript.com/show_bug.cgi?id=693653 > >Tilman > > >On 20.01.2023 15:17, Rich Stafford wrote: >>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 >s >>>>>>>>>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 >u >>>>>>>>>>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 >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); >te/(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 > > > >--------------------------------------------------------------------- >To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org >For additional commands, e-mail: users-h...@pdfbox.apache.org