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