pdfbox-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michael Klink (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (PDFBOX-4615) AppearanceGeneratorHelper.setAppearanceValue doesn't set the bounding box on the appearance stream correctly
Date Wed, 31 Jul 2019 18:05:00 GMT

    [ https://issues.apache.org/jira/browse/PDFBOX-4615?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16897380#comment-16897380
] 

Michael Klink edited comment on PDFBOX-4615 at 7/31/19 6:04 PM:
----------------------------------------------------------------

{quote}I suspect that this is a duplicate of PDFBOX-4471{quote}
Indeed! (Or even more exactly of [this SO q&a|https://stackoverflow.com/a/56951160/1729265];
the underlying issue in both cases is, though, that PDFBox always assumes re-using the existing
appearance streams is appropriate while the examples at hand show that in real life this is
not always the case.)

E.g. the text box {{GrowthBOY}} has a *Rect* of {{[ 377.786 188.797 584.631 241.047 ]}}, a
206.845×52.25 area, but the existing appearance has a *BBox* of {{[ 0.0 0.0 118.68 52.25
]}}.

Thus, under the assumption that reusing the appearance stream is appropriate, the bug is not
that there are so few characters per line but instead that during flattening the appearance
was not stretched horizontally to fill the whole 206.845×52.25 area.


was (Author: mkl):
{quote}I suspect that this is a duplicate of PDFBOX-4471{quote}
Indeed!

E.g. the text box {{GrowthBOY}} has a *Rect* of {{[ 377.786 188.797 584.631 241.047 ]}}, a
206.845×52.25 area, but the existing appearance has a *BBox* of {{[ 0.0 0.0 118.68 52.25
]}}.

Thus, under the assumption that reusing the appearance stream is appropriate, the bug is not
that there are so few characters per line but instead that during flattening the appearance
was not stretched horizontally to fill the whole 206.845×52.25 area.

> AppearanceGeneratorHelper.setAppearanceValue doesn't set the bounding box on the appearance
stream correctly
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: PDFBOX-4615
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-4615
>             Project: PDFBox
>          Issue Type: Bug
>          Components: AcroForm
>    Affects Versions: 2.0.16
>            Reporter: Rosalind Douglas
>            Priority: Major
>         Attachments: flattenedboundingbox.pdf, resetboundingbox.pdf
>
>
> Hello, thanks for all your effort with PDFBox. We use it heavily for parsing and flattening
PDFs.
> BUG: In the attached PDF "resetboundingbox.pdf", we programmatically set the value of
the text fields, then call pdAcroForm.flattten(), which produces the flattened PDF "flattenedboundingbox.pdf."
I would expect that the text would entirely fill the text box (see textbox with {color:#8eb021}green
border{color} in "flattenedboundingbox.pdf") but the text does not. Instead, the filled text
area obeys another box instead (see text area with {color:#d04437}red border{color} in "flattenedboundingbox.pdf").
> POTENTIAL FIX: We've traced the problem to AppearanceGeneratorHelper.setAppearanceValue,
lines 200-210. As long as we always set the bounding box (line 243) like in AppearanceGeneratorHelper.prepareNormalAppearanceStream,
regardless of the if/else at line 200, then the flattening works correctly:
> {code:java}
> /** * replace AppearanceGeneratorHelper lines 199-210 with: */ 
> PDAppearanceStream appearanceStream = appearance != null && appearance.isStream()
? appearance.getAppearanceStream() : new PDAppearanceStream(field.getAcroForm().getDocument());
>  
> // copied from lines 237-243 
> int rotation = resolveRotation(widget);
> PDRectangle rect = widget.getRectangle(); 
> Matrix matrix = Matrix.getRotateInstance(Math.toRadians(rotation), 0, 0); 
> Point2D.Float point2D = matrix.transformPoint(rect.getWidth(), rect.getHeight()); 
> PDRectangle bbox = new PDRectangle(Math.abs((float) point2D.getX()), Math.abs((float)
point2D.getY())); 
> appearanceStream.setBBox(bbox); 
> appearanceDict.setNormalAppearance(appearanceStream);
> {code}
> Something I'm not sure about: in method prepareNormalAppearanceStream, there is additional
code for setting the matrix (lines 245-251), which we don't seem to need. Since it doesn't
break anything, we just keep it too.
> Thanks again for your help!



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org


Mime
View raw message