Search in sources :

Example 11 with PdfImageXObject

use of com.itextpdf.kernel.pdf.xobject.PdfImageXObject in project i7j-pdfsweep by itext.

the class CleanUpCsCompareUtilTest method createMockedPdfImageXObject.

private PdfImageXObject createMockedPdfImageXObject(PdfName colorSpace, int bitsPerComponent) {
    PdfStream stream1 = new PdfStream();
    stream1.put(PdfName.BitsPerComponent, new PdfNumber(bitsPerComponent));
    stream1.put(PdfName.ColorSpace, colorSpace);
    stream1.put(PdfName.Width, new PdfNumber(1));
    stream1.put(PdfName.Height, new PdfNumber(1));
    return new PdfImageXObject(stream1);
}
Also used : PdfImageXObject(com.itextpdf.kernel.pdf.xobject.PdfImageXObject) PdfNumber(com.itextpdf.kernel.pdf.PdfNumber) PdfStream(com.itextpdf.kernel.pdf.PdfStream)

Example 12 with PdfImageXObject

use of com.itextpdf.kernel.pdf.xobject.PdfImageXObject in project i7j-pdfsweep by itext.

the class CleanUpImageUtilTest method cleanUpImageEmptyAreasToCleanTest.

@Test
public void cleanUpImageEmptyAreasToCleanTest() throws Exception {
    ImageData data = ImageDataFactory.create(SOURCE_PATH + "cleanUpImageEmptyAreasToClean.png");
    PdfImageXObject imageXObject = new PdfImageXObject(data);
    byte[] sourceImageBytes = imageXObject.getImageBytes();
    byte[] resultImageBytes = CleanUpImageUtil.cleanUpImage(new PdfImageXObject(data).getImageBytes(), new ArrayList<Rectangle>());
    Assert.assertArrayEquals(sourceImageBytes, resultImageBytes);
}
Also used : PdfImageXObject(com.itextpdf.kernel.pdf.xobject.PdfImageXObject) ImageData(com.itextpdf.io.image.ImageData) Rectangle(com.itextpdf.kernel.geom.Rectangle) IntegrationTest(com.itextpdf.test.annotations.type.IntegrationTest) ExtendedITextTest(com.itextpdf.test.ExtendedITextTest) Test(org.junit.Test)

Example 13 with PdfImageXObject

use of com.itextpdf.kernel.pdf.xobject.PdfImageXObject in project i7j-pdfsweep by itext.

the class PdfCleanUpFilter method filterImage.

private static FilterResult<ImageData> filterImage(PdfImageXObject image, List<Rectangle> imageAreasToBeCleaned) {
    if (imageAreasToBeCleaned == null) {
        return new FilterResult<>(true, null);
    } else if (imageAreasToBeCleaned.isEmpty()) {
        return new FilterResult<>(false, null);
    }
    byte[] filteredImageBytes;
    if (imageSupportsDirectCleanup(image)) {
        byte[] imageStreamBytes = processImageDirectly(image, imageAreasToBeCleaned);
        // Creating imageXObject clone in order to avoid modification of the original XObject in the document.
        // We require to set filtered image bytes to the image XObject only for the sake of simplifying code:
        // in this method we return ImageData, so in order to convert PDF image to the common image format we
        // reuse PdfImageXObject#getImageBytes method.
        // I think this is acceptable here, because monochrome and grayscale images are not very common,
        // so the overhead would be not that big. But anyway, this should be refactored in future if this
        // direct image bytes cleaning approach would be found useful and will be preserved in future.
        PdfImageXObject tempImageClone = new PdfImageXObject((PdfStream) image.getPdfObject().clone());
        tempImageClone.getPdfObject().setData(imageStreamBytes);
        filteredImageBytes = tempImageClone.getImageBytes();
    } else {
        byte[] originalImageBytes = image.getImageBytes();
        filteredImageBytes = CleanUpImageUtil.cleanUpImage(originalImageBytes, imageAreasToBeCleaned);
    }
    return new FilterResult<>(true, ImageDataFactory.create(filteredImageBytes));
}
Also used : PdfImageXObject(com.itextpdf.kernel.pdf.xobject.PdfImageXObject)

Example 14 with PdfImageXObject

use of com.itextpdf.kernel.pdf.xobject.PdfImageXObject in project i7j-pdfsweep by itext.

the class PdfCleanUpProcessor method getFilteredImage.

private PdfImageXObject getFilteredImage(FilteredImagesCache.FilteredImageKey filteredImageKey, Matrix ctmForMasksFiltering) {
    PdfImageXObject originalImage = filteredImageKey.getImageXObject();
    PdfImageXObject imageToWrite = getFilteredImagesCache().get(filteredImageKey);
    if (imageToWrite == null) {
        PdfCleanUpFilter.FilterResult<ImageData> imageFilterResult = filter.filterImage(filteredImageKey);
        if (imageFilterResult.isModified()) {
            ImageData filteredImageData = imageFilterResult.getFilterResult();
            if (Boolean.TRUE.equals(originalImage.getPdfObject().getAsBool(PdfName.ImageMask))) {
                if (!PdfCleanUpFilter.imageSupportsDirectCleanup(originalImage)) {
                    Logger logger = LoggerFactory.getLogger(PdfCleanUpProcessor.class);
                    logger.error(CleanUpLogMessageConstant.IMAGE_MASK_CLEAN_UP_NOT_SUPPORTED);
                } else {
                    filteredImageData.makeMask();
                }
            }
            if (filteredImageData != null) {
                imageToWrite = new PdfImageXObject(filteredImageData);
                getFilteredImagesCache().put(filteredImageKey, imageToWrite);
                // then the old colorspace may produce an error with the new image data.
                if (areColorSpacesDifferent(originalImage, imageToWrite) && CleanUpCsCompareUtil.isOriginalCsCompatible(originalImage, imageToWrite)) {
                    PdfObject originalCS = originalImage.getPdfObject().get(PdfName.ColorSpace);
                    if (originalCS != null) {
                        imageToWrite.put(PdfName.ColorSpace, originalCS);
                    }
                }
                if (ctmForMasksFiltering != null && !filteredImageData.isMask()) {
                    filterImageMask(originalImage, PdfName.SMask, ctmForMasksFiltering, imageToWrite);
                    filterImageMask(originalImage, PdfName.Mask, ctmForMasksFiltering, imageToWrite);
                    PdfArray colourKeyMaskingArr = originalImage.getPdfObject().getAsArray(PdfName.Mask);
                    if (colourKeyMaskingArr != null) {
                        // In general we should be careful about images that might have changed their color space
                        // or have been converted to lossy format during filtering.
                        // However we have been copying Mask entry non-conditionally before and also I'm not sure
                        // that cases described above indeed take place.
                        imageToWrite.put(PdfName.Mask, colourKeyMaskingArr);
                    }
                    if (originalImage.getPdfObject().containsKey(PdfName.SMaskInData)) {
                        // This entry will likely lose meaning after image conversion to bitmap and back again, but let's leave as is for now.
                        imageToWrite.put(PdfName.SMaskInData, originalImage.getPdfObject().get(PdfName.SMaskInData));
                    }
                }
            }
        } else {
            imageToWrite = originalImage;
        }
    }
    return imageToWrite;
}
Also used : PdfImageXObject(com.itextpdf.kernel.pdf.xobject.PdfImageXObject) PdfArray(com.itextpdf.kernel.pdf.PdfArray) ImageData(com.itextpdf.io.image.ImageData) PdfObject(com.itextpdf.kernel.pdf.PdfObject) Logger(org.slf4j.Logger)

Example 15 with PdfImageXObject

use of com.itextpdf.kernel.pdf.xobject.PdfImageXObject in project i7j-pdfsweep by itext.

the class PdfCleanUpProcessor method checkIfImageAndClean.

private void checkIfImageAndClean(List<PdfObject> operands) {
    PdfStream imageStream = getXObjectStream((PdfName) operands.get(0));
    if (PdfName.Image.equals(imageStream.getAsName(PdfName.Subtype))) {
        ImageRenderInfo encounteredImage = ((PdfCleanUpEventListener) getEventListener()).getEncounteredImage();
        FilteredImagesCache.FilteredImageKey key = filter.createFilteredImageKey(encounteredImage.getImage(), encounteredImage.getImageCtm(), document);
        PdfImageXObject imageToWrite = getFilteredImage(key, encounteredImage.getImageCtm());
        if (imageToWrite != null) {
            float[] ctm = pollNotAppliedCtm();
            writeNotAppliedGsParams(false, false);
            openNotWrittenTags();
            getCanvas().addXObjectWithTransformationMatrix(imageToWrite, ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
        }
    }
}
Also used : PdfImageXObject(com.itextpdf.kernel.pdf.xobject.PdfImageXObject) PdfStream(com.itextpdf.kernel.pdf.PdfStream) ImageRenderInfo(com.itextpdf.kernel.pdf.canvas.parser.data.ImageRenderInfo)

Aggregations

PdfImageXObject (com.itextpdf.kernel.pdf.xobject.PdfImageXObject)16 ExtendedITextTest (com.itextpdf.test.ExtendedITextTest)8 IntegrationTest (com.itextpdf.test.annotations.type.IntegrationTest)8 Test (org.junit.Test)8 PdfStream (com.itextpdf.kernel.pdf.PdfStream)5 Rectangle (com.itextpdf.kernel.geom.Rectangle)3 PdfDocument (com.itextpdf.kernel.pdf.PdfDocument)3 PdfName (com.itextpdf.kernel.pdf.PdfName)3 PdfReader (com.itextpdf.kernel.pdf.PdfReader)3 ImageData (com.itextpdf.io.image.ImageData)2 PdfNumber (com.itextpdf.kernel.pdf.PdfNumber)2 PdfWriter (com.itextpdf.kernel.pdf.PdfWriter)2 Logger (org.slf4j.Logger)2 Point (com.itextpdf.kernel.geom.Point)1 PdfArray (com.itextpdf.kernel.pdf.PdfArray)1 PdfDictionary (com.itextpdf.kernel.pdf.PdfDictionary)1 PdfObject (com.itextpdf.kernel.pdf.PdfObject)1 PdfPage (com.itextpdf.kernel.pdf.PdfPage)1 PdfResources (com.itextpdf.kernel.pdf.PdfResources)1 PdfCanvasProcessor (com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor)1