In the lines of the iText ExtractImages example, you can extract the following code:
PdfReader reader = new PdfReader(resourceStream); PdfReaderContentParser parser = new PdfReaderContentParser(reader); ImageRenderListener listener = new ImageRenderListener("testpdf"); for (int i = 1; i <= reader.getNumberOfPages(); i++) { parser.processContent(i, listener); }
ImageRenderListener defined as follows:
class ImageRenderListener implements RenderListener { final String name; int counter = 100000; public ImageRenderListener(String name) { this.name = name; } public void beginTextBlock() { } public void renderText(TextRenderInfo renderInfo) { } public void endTextBlock() { } public void renderImage(ImageRenderInfo renderInfo) { try { PdfImageObject image = renderInfo.getImage(); if (image == null) return; int number = renderInfo.getRef() != null ? renderInfo.getRef().getNumber() : counter++; String filename = String.format("%s-%s.%s", name, number, image.getFileType()); FileOutputStream os = new FileOutputStream(filename); os.write(image.getImageAsBytes()); os.flush(); os.close(); PdfDictionary imageDictionary = image.getDictionary(); PRStream maskStream = (PRStream) imageDictionary.getAsStream(PdfName.SMASK); if (maskStream != null) { PdfImageObject maskImage = new PdfImageObject(maskStream); filename = String.format("%s-%s-mask.%s", name, number, maskImage.getFileType()); os = new FileOutputStream(filename); os.write(maskImage.getImageAsBytes()); os.flush(); os.close(); } } catch (IOException e) { e.printStackTrace(); } } }
As you can see, the ImageRenderListener renderImage method ImageRenderListener renderImage argument. These arguments have methods.
getStartPoint gives you a vector in user space representing the starting point of xobject andgetImageCTM gives you the coordinate transformation matrix that is active when rendering this image. Coordinates are in user space.
The latter gives you information that precise manipulation of the squared 1x1 user space unit is used to actually draw the image. As you know, the image can rotate, stretch, skew and move (the first method actually extracts its result from the matrix from the "moved" information).
source share