On 20.01.2023 16:30, Rich Stafford wrote:
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?
No, I doubt it would work at all with SVG. And now consider this example
https://asymptote.sourceforge.io/gallery/PDFs/strokeshade.pdf taken from
https://asymptote.sourceforge.io/gallery/PDFs/index.html
Tilman
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
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org
For additional commands, e-mail: users-h...@pdfbox.apache.org