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