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