use of com.itextpdf.kernel.pdf.PdfNumber in project i7j-pdfsweep by itext.
the class PdfCleanUpTool method parseDAParam.
private Map<String, List> parseDAParam(PdfString DA) throws IOException {
Map<String, List> commandArguments = new HashMap<String, List>();
PdfTokenizer tokeniser = new PdfTokenizer(new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(DA.toUnicodeString().getBytes(StandardCharsets.UTF_8))));
List currentArguments = new ArrayList();
while (tokeniser.nextToken()) {
if (tokeniser.getTokenType() == PdfTokenizer.TokenType.Other) {
String key = tokeniser.getStringValue();
if ("RG".equals(key) || "G".equals(key) || "K".equals(key)) {
key = "StrokeColor";
} else if ("rg".equals(key) || "g".equals(key) || "k".equals(key)) {
key = "FillColor";
}
commandArguments.put(key, currentArguments);
currentArguments = new ArrayList();
} else {
switch(tokeniser.getTokenType()) {
case Number:
currentArguments.add(new PdfNumber(new Float(tokeniser.getStringValue())));
break;
case Name:
currentArguments.add(new PdfName(tokeniser.getStringValue()));
break;
default:
currentArguments.add(tokeniser.getStringValue());
}
}
}
return commandArguments;
}
use of com.itextpdf.kernel.pdf.PdfNumber in project i7j-pdfsweep by itext.
the class CleanUpCsCompareUtilTest method imageReadExceptionTest.
@Test
@LogMessages(messages = @LogMessage(messageTemplate = CleanUpLogMessageConstant.CANNOT_OBTAIN_IMAGE_INFO_AFTER_FILTERING))
public void imageReadExceptionTest() {
PdfStream stream1 = new PdfStream();
stream1.put(PdfName.BitsPerComponent, new PdfNumber(8));
stream1.put(PdfName.ColorSpace, PdfName.DeviceCMYK);
PdfImageXObject image1 = new PdfImageXObject(stream1);
stream1 = new PdfStream();
stream1.put(PdfName.BitsPerComponent, new PdfNumber(8));
stream1.put(PdfName.ColorSpace, PdfName.DeviceCMYK);
PdfImageXObject image2 = new PdfImageXObject(stream1);
Assert.assertFalse(CleanUpCsCompareUtil.isOriginalCsCompatible(image1, image2));
}
use of com.itextpdf.kernel.pdf.PdfNumber in project i7j-pdfsweep by itext.
the class PdfCleanUpFilter method processImageDirectly.
/**
* Filters image content using direct manipulation over PDF image samples stream. Implemented according to ISO 32000-2,
* "8.9.3 Sample representation".
*
* @param image image XObject which will be filtered
* @param imageAreasToBeCleaned list of rectangle areas for clean up with coordinates in (0,1)x(0,1) space
* @return raw bytes of the PDF image samples stream which is already cleaned.
*/
private static byte[] processImageDirectly(PdfImageXObject image, List<Rectangle> imageAreasToBeCleaned) {
int X = 0;
int Y = 1;
int W = 2;
int H = 3;
byte[] originalImageBytes = image.getPdfObject().getBytes();
PdfNumber bpcVal = image.getPdfObject().getAsNumber(PdfName.BitsPerComponent);
if (bpcVal == null) {
throw new IllegalArgumentException("/BitsPerComponent entry is required for image dictionaries.");
}
int bpc = bpcVal.intValue();
if (bpc != 1 && bpc != 2 && bpc != 4 && bpc != 8 && bpc != 16) {
throw new IllegalArgumentException("/BitsPerComponent only allowed values are: 1, 2, 4, 8 and 16.");
}
double bytesInComponent = (double) bpc / 8;
int firstComponentInByte = 0;
if (bpc < 16) {
for (int i = 0; i < bpc; ++i) {
firstComponentInByte += (int) Math.pow(2, 7 - i);
}
}
double width = image.getWidth();
double height = image.getHeight();
int rowPadding = 0;
if ((width * bpc) % 8 > 0) {
rowPadding = (int) (8 - (width * bpc) % 8);
}
for (Rectangle rect : imageAreasToBeCleaned) {
int[] cleanImgRect = CleanUpHelperUtil.getImageRectToClean(rect, (int) width, (int) height);
for (int j = cleanImgRect[Y]; j < cleanImgRect[Y] + cleanImgRect[H]; ++j) {
for (int i = cleanImgRect[X]; i < cleanImgRect[X] + cleanImgRect[W]; ++i) {
// based on assumption that numOfComponents always equals 1, because this method is only for monochrome and grayscale images
double pixelPos = j * ((width * bpc + rowPadding) / 8) + i * bytesInComponent;
int pixelByteInd = (int) pixelPos;
byte byteWithSample = originalImageBytes[pixelByteInd];
if (bpc == 16) {
originalImageBytes[pixelByteInd] = 0;
originalImageBytes[pixelByteInd + 1] = 0;
} else {
int reset = ~(firstComponentInByte >> (int) ((pixelPos - pixelByteInd) * 8)) & 0xFF;
originalImageBytes[pixelByteInd] = (byte) (byteWithSample & reset);
}
}
}
}
return originalImageBytes;
}
use of com.itextpdf.kernel.pdf.PdfNumber in project i7j-pdfsweep by itext.
the class PdfCleanUpProcessorUnitTest method areColorSpacesDifferentForPdfArraysWithDifferentSizeValuesTest.
@Test
public void areColorSpacesDifferentForPdfArraysWithDifferentSizeValuesTest() {
PdfArray pdfFirstArray = createPdfArray(PdfName.Separation, new PdfNumber(1), new PdfBoolean(true));
PdfArray pdfSecondArray = createPdfArray(PdfName.Separation, new PdfNumber(1));
Assert.assertTrue(createAndCompareImages(pdfFirstArray, pdfSecondArray));
}
use of com.itextpdf.kernel.pdf.PdfNumber in project i7j-pdfsweep by itext.
the class PdfCleanUpProcessorUnitTest method areColorSpacesDifferentForTheSamePdfArraysValuesTest.
@Test
public void areColorSpacesDifferentForTheSamePdfArraysValuesTest() {
PdfArray pdfFirstArray = createPdfArray(PdfName.Separation, new PdfNumber(1), new PdfStream());
Assert.assertFalse(createAndCompareImages(pdfFirstArray, pdfFirstArray));
}
Aggregations