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);
}
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;
}
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;
}
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;
}
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;
}
Aggregations