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
>

Reply via email to