Search in sources :

Example 1 with PdfObject

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

the class FilteredImagesCacheTest method assertNumberXObjects.

private void assertNumberXObjects(String output, int n) throws IOException {
    PdfDocument doc = new PdfDocument(new PdfReader(output));
    int xObjCount = 0;
    for (int i = 0; i < doc.getNumberOfPdfObjects(); ++i) {
        PdfObject pdfObject = doc.getPdfObject(i);
        if (pdfObject != null && pdfObject.isStream()) {
            PdfDictionary dict = (PdfDictionary) pdfObject;
            if (PdfName.Image.equals(dict.getAsName(PdfName.Subtype)) && dict.containsKey(PdfName.Width) && dict.containsKey(PdfName.Height)) {
                ++xObjCount;
            }
        }
    }
    Assert.assertEquals(n, xObjCount);
}
Also used : PdfDictionary(com.itextpdf.kernel.pdf.PdfDictionary) PdfObject(com.itextpdf.kernel.pdf.PdfObject) PdfReader(com.itextpdf.kernel.pdf.PdfReader) PdfDocument(com.itextpdf.kernel.pdf.PdfDocument)

Example 2 with PdfObject

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

the class PdfCleanUpProcessor method areColorSpacesDifferent.

static boolean areColorSpacesDifferent(PdfImageXObject originalImage, PdfImageXObject clearedImage) {
    PdfObject originalImageCS = originalImage.getPdfObject().get(PdfName.ColorSpace);
    PdfObject clearedImageCS = clearedImage.getPdfObject().get(PdfName.ColorSpace);
    if (originalImageCS == clearedImageCS) {
        return false;
    } else if (originalImageCS == null || clearedImageCS == null) {
        return true;
    } else if (originalImageCS.equals(clearedImageCS)) {
        return false;
    } else if (originalImageCS.isArray() && clearedImageCS.isArray()) {
        PdfArray originalCSArray = (PdfArray) originalImageCS;
        PdfArray clearedCSArray = (PdfArray) clearedImageCS;
        if (originalCSArray.size() != clearedCSArray.size()) {
            return true;
        }
        for (int i = 0; i < originalCSArray.size(); ++i) {
            PdfObject objectFromOriginal = originalCSArray.get(i);
            PdfObject objectFromCleared = clearedCSArray.get(i);
            if (!objectFromOriginal.equals(objectFromCleared)) {
                return true;
            }
        }
        return false;
    }
    return true;
}
Also used : PdfArray(com.itextpdf.kernel.pdf.PdfArray) PdfObject(com.itextpdf.kernel.pdf.PdfObject)

Example 3 with PdfObject

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

the class CleanUpCsCompareUtil method isCSApplicable.

private static boolean isCSApplicable(PdfImageXObject originalImage, ImageInfo clearedImageInfo) {
    PdfObject pdfColorSpace = originalImage.getPdfObject().get(PdfName.ColorSpace);
    PdfName name;
    if (pdfColorSpace.isArray()) {
        name = ((PdfArray) pdfColorSpace).getAsName(0);
    } else if (pdfColorSpace.isName()) {
        name = (PdfName) pdfColorSpace;
    } else {
        name = new PdfName("");
    }
    // the result image is 8 bit grayscale image
    if (PdfName.Separation.equals(name) || PdfName.DeviceGray.equals(name)) {
        return clearedImageInfo.getBitsPerPixel() == 8 && clearedImageInfo.getColorType() == ImageInfo.ColorType.GRAYSCALE;
    }
    return false;
}
Also used : PdfName(com.itextpdf.kernel.pdf.PdfName) PdfObject(com.itextpdf.kernel.pdf.PdfObject)

Example 4 with PdfObject

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

the class PdfCleanUpFilter method imageSupportsDirectCleanup.

static boolean imageSupportsDirectCleanup(PdfImageXObject image) {
    PdfObject filter = image.getPdfObject().get(PdfName.Filter);
    boolean supportedFilterForDirectCleanup = isSupportedFilterForDirectImageCleanup(filter);
    boolean deviceGrayOrNoCS = PdfName.DeviceGray.equals(image.getPdfObject().getAsName(PdfName.ColorSpace)) || !image.getPdfObject().containsKey(PdfName.ColorSpace);
    return deviceGrayOrNoCS && supportedFilterForDirectCleanup;
}
Also used : PdfObject(com.itextpdf.kernel.pdf.PdfObject)

Example 5 with PdfObject

use of com.itextpdf.kernel.pdf.PdfObject 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)

Aggregations

PdfObject (com.itextpdf.kernel.pdf.PdfObject)7 PdfArray (com.itextpdf.kernel.pdf.PdfArray)3 PdfDictionary (com.itextpdf.kernel.pdf.PdfDictionary)2 ImageData (com.itextpdf.io.image.ImageData)1 Matrix (com.itextpdf.kernel.geom.Matrix)1 Point (com.itextpdf.kernel.geom.Point)1 PdfDocument (com.itextpdf.kernel.pdf.PdfDocument)1 PdfLiteral (com.itextpdf.kernel.pdf.PdfLiteral)1 PdfName (com.itextpdf.kernel.pdf.PdfName)1 PdfReader (com.itextpdf.kernel.pdf.PdfReader)1 PdfTextArray (com.itextpdf.kernel.pdf.PdfTextArray)1 CanvasGraphicsState (com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState)1 TextRenderInfo (com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo)1 PdfImageXObject (com.itextpdf.kernel.pdf.xobject.PdfImageXObject)1 ArrayList (java.util.ArrayList)1 Logger (org.slf4j.Logger)1