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

Reply via email to