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: dev-unsubscr...@pdfbox.apache.org For additional commands, e-mail: dev-h...@pdfbox.apache.org