Search in sources :

Example 16 with PdfArray

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

the class PdfCleanUpProcessorUnitTest method areColorSpacesDifferentForEqualPdfArraysValuesTest.

@Test
public void areColorSpacesDifferentForEqualPdfArraysValuesTest() {
    PdfArray pdfFirstArray = createPdfArray(PdfName.Separation, new PdfNumber(1), new PdfBoolean(true));
    PdfArray pdfSecondArray = createPdfArray(PdfName.Separation, new PdfNumber(1), new PdfBoolean(true));
    Assert.assertFalse(createAndCompareImages(pdfFirstArray, pdfSecondArray));
}
Also used : PdfArray(com.itextpdf.kernel.pdf.PdfArray) PdfNumber(com.itextpdf.kernel.pdf.PdfNumber) PdfBoolean(com.itextpdf.kernel.pdf.PdfBoolean) ExtendedITextTest(com.itextpdf.test.ExtendedITextTest) Test(org.junit.Test) UnitTest(com.itextpdf.test.annotations.type.UnitTest)

Example 17 with PdfArray

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

the class PdfCleanUpProcessorUnitTest method areColorSpacesDifferentForEqualPdfArraysWithNullsValuesTest.

@Test
public void areColorSpacesDifferentForEqualPdfArraysWithNullsValuesTest() {
    PdfArray pdfFirstArray = createPdfArray(PdfName.Separation, new PdfNull());
    PdfArray pdfSecondArray = createPdfArray(PdfName.Separation, new PdfNull());
    Assert.assertFalse(createAndCompareImages(pdfFirstArray, pdfSecondArray));
}
Also used : PdfNull(com.itextpdf.kernel.pdf.PdfNull) PdfArray(com.itextpdf.kernel.pdf.PdfArray) ExtendedITextTest(com.itextpdf.test.ExtendedITextTest) Test(org.junit.Test) UnitTest(com.itextpdf.test.annotations.type.UnitTest)

Example 18 with PdfArray

use of com.itextpdf.kernel.pdf.PdfArray 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 19 with PdfArray

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

the class PdfCleanUpProcessor method cleanText.

private void cleanText(String operator, List<PdfObject> operands) {
    List<TextRenderInfo> textChunks = null;
    PdfArray cleanedText = null;
    if ("TJ".equals(operator)) {
        PdfArray originalTJ = (PdfArray) operands.get(0);
        if (originalTJ.isEmpty()) {
            // we can safely ignore it
            return;
        }
        // text chunk index in original TJ
        int i = 0;
        PdfTextArray newTJ = new PdfTextArray();
        for (PdfObject e : originalTJ) {
            if (e.isString()) {
                if (null == textChunks) {
                    textChunks = ((PdfCleanUpEventListener) getEventListener()).getEncounteredText();
                }
                PdfArray filteredText = filter.filterText(textChunks.get(i++)).getFilterResult();
                newTJ.addAll(filteredText);
            } else {
                newTJ.add(e);
            }
        }
        cleanedText = newTJ;
    } else {
        // if operator is Tj or ' or "
        textChunks = ((PdfCleanUpEventListener) getEventListener()).getEncounteredText();
        PdfCleanUpFilter.FilterResult<PdfArray> filterResult = filter.filterText(textChunks.get(0));
        if (filterResult.isModified()) {
            cleanedText = filterResult.getFilterResult();
        }
    }
    // if text wasn't modified cleanedText is null
    if (cleanedText == null || cleanedText.size() != 1 || !cleanedText.get(0).isNumber()) {
        if (null == textChunks) {
            textChunks = ((PdfCleanUpEventListener) getEventListener()).getEncounteredText();
        }
        // all text chunks even in case of TJ have the same graphics state
        TextRenderInfo text = textChunks.get(0);
        writeNotAppliedGsParamsForText(text);
        beginTextObjectAndOpenNotWrittenTags();
        writeNotAppliedTextStateParams(text);
        textPositioning.writePositionedText(operator, operands, cleanedText, getCanvas());
    } else {
        // cleaned text is tj array with single number - it means that the whole text chunk was removed
        CanvasGraphicsState gs = getCanvas().getGraphicsState();
        // process new lines if necessary
        if ("'".equals(operator) || "\"".equals(operator)) {
            List<PdfObject> newLineList = new ArrayList<>();
            newLineList.add(new PdfLiteral("T*"));
            textPositioning.appendPositioningOperator("T*", newLineList);
        }
        textPositioning.appendTjArrayWithSingleNumber(cleanedText, gs.getFontSize(), gs.getHorizontalScaling());
    }
}
Also used : CanvasGraphicsState(com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState) PdfLiteral(com.itextpdf.kernel.pdf.PdfLiteral) PdfArray(com.itextpdf.kernel.pdf.PdfArray) PdfTextArray(com.itextpdf.kernel.pdf.PdfTextArray) TextRenderInfo(com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo) PdfObject(com.itextpdf.kernel.pdf.PdfObject) ArrayList(java.util.ArrayList) Point(com.itextpdf.kernel.geom.Point)

Aggregations

PdfArray (com.itextpdf.kernel.pdf.PdfArray)19 ExtendedITextTest (com.itextpdf.test.ExtendedITextTest)12 UnitTest (com.itextpdf.test.annotations.type.UnitTest)12 Test (org.junit.Test)12 PdfNumber (com.itextpdf.kernel.pdf.PdfNumber)6 PdfStream (com.itextpdf.kernel.pdf.PdfStream)4 PdfNull (com.itextpdf.kernel.pdf.PdfNull)3 PdfObject (com.itextpdf.kernel.pdf.PdfObject)3 Rectangle (com.itextpdf.kernel.geom.Rectangle)2 PdfBoolean (com.itextpdf.kernel.pdf.PdfBoolean)2 PdfCanvas (com.itextpdf.kernel.pdf.canvas.PdfCanvas)2 Logger (org.slf4j.Logger)2 ImageData (com.itextpdf.io.image.ImageData)1 Color (com.itextpdf.kernel.colors.Color)1 PdfException (com.itextpdf.kernel.exceptions.PdfException)1 Point (com.itextpdf.kernel.geom.Point)1 PdfDictionary (com.itextpdf.kernel.pdf.PdfDictionary)1 PdfLiteral (com.itextpdf.kernel.pdf.PdfLiteral)1 PdfName (com.itextpdf.kernel.pdf.PdfName)1 PdfString (com.itextpdf.kernel.pdf.PdfString)1