Emmeran Seehuber created PDFBOX-5250:
----------------------------------------
Summary: Colors in PDF Tile Patterns are off
Key: PDFBOX-5250
URL: https://issues.apache.org/jira/browse/PDFBOX-5250
Project: PDFBox
Issue Type: Bug
Components: Rendering
Affects Versions: 2.0.24
Reporter: Emmeran Seehuber
Attachments: kachel4.pdf, pattern_colors_broken.pdf
I've implementing for my customer some "text with pattern" features. In the
attached PDF you see that in action.
There is a color mapping problem in the patterned text in the left bottom
corner in the PDFBox debugger. The colors are way to bright. Acrobat and MacOS
Preview render this fine. FoxIt Reader also has some rendering issues with this
(image seems distorted...).
I've also attached the "base" PDF used for the pattern.
It think the way I embed this should be fine:
{code:java}
return new OurPDColorCarrier((PDPageContentStream contentStream) -> {
PDImageResult pdImage = throwing(() ->
textureImage.getPDImageXObject(document, colorSpaceRegistry));
Objects.requireNonNull(pdImage);
PDTilingPattern pattern = new PDTilingPattern();
pattern.setPaintType(PDTilingPattern.PAINT_COLORED);
pattern.setTilingType(PDTilingPattern.TILING_NO_DISTORTION);
var anchorInfo = TextRenderer.getTextureTileAnchor(textureImage);
float textureImageWidth = (float) anchorInfo.originalWidth;
float textureImageHeight = (float) anchorInfo.originalHeight;
pattern.setBBox(
new PDRectangle(0f, 0f, (float) dpi2mm(textureImageWidth), (float)
dpi2mm(textureImageHeight)));
pattern.setXStep((float) anchorInfo.anchor.getWidth());
pattern.setYStep((float) anchorInfo.anchor.getHeight());
double scaleFactor = pageWidth / renderTarget.width;
/* Die Matrix ist lt. Spec für die Phasenverschiebung des Patterns da. */
double countPhasen = (renderTarget.pageSize.getHeight() /
anchorInfo.anchor.getHeight());
double rest = renderTarget.pageSize.getHeight()
- DoubleMath.roundToInt(countPhasen, RoundingMode.DOWN) *
anchorInfo.anchor.getHeight();
pattern.setMatrix(AffineTransform.getTranslateInstance(scaleFactor *
currentTransform.getTranslateX(),
renderTarget.pageSize.getHeight() - (scaleFactor *
currentTransform.getTranslateY()) + rest));
PDAppearanceStream appearance = new PDAppearanceStream(document);
appearance.setResources(pattern.getResources());
appearance.setBBox(pattern.getBBox());
PDPageContentStream imageContentStream = new PDPageContentStream(document,
appearance,
((COSStream) pattern.getCOSObject()).createOutputStream());
if (pdImage.image instanceof PDFormXObject) {
imageContentStream.transform(Matrix.getScaleInstance((float)
(anchorInfo.originalWidth),
(float) (anchorInfo.originalHeight)));
pattern.setBBox(new PDRectangle(0f, 0f, (float)
(anchorInfo.originalWidth),
(float) (anchorInfo.originalHeight)));
imageContentStream.drawForm((PDFormXObject) pdImage.image);
} else {
pattern.setMatrix(AffineTransform.getTranslateInstance(
scaleFactor * currentTransform.getTranslateX(),
renderTarget.pageSize.getHeight()
- (scaleFactor * currentTransform.getTranslateY()) + rest /
scaleFactor));
imageContentStream.transform(
Matrix.getScaleInstance((float) (anchorInfo.anchor.getWidth() /
textureImageWidth),
(float) (anchorInfo.anchor.getHeight() /
textureImageHeight)));
imageContentStream.drawImage((PDImageXObject) pdImage.image, 0, 0);
}
imageContentStream.close();
PDResources resources = ModelUtils.getPrivateField(contentStream,
"resources");
COSName tilingPatternName = resources.add(pattern);
return new PDColor(tilingPatternName, new PDPattern(null));
});
{code}
Yes, in the third bottom line the
{code:java}
PDResources resources = ModelUtils.getPrivateField(contentStream, "resources");
{code}
is an ugly reflection hack - any reason why the ContentStream does not expose
its resources with a public API?
This is with Java 11 on MacOS BigSur.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]