List of usage examples for com.itextpdf.text.pdf PdfDictionary getAsStream
public PdfStream getAsStream(final PdfName key)
PdfObject
as a PdfStream
, resolving indirect references. From source file:io.konik.carriage.itext.ITextInvoiceExtractor.java
License:Open Source License
private static byte[] getFStream(PdfDictionary ef) { if (ef.contains(F)) { PdfStream xmlStream = ef.getAsStream(F); try {//from ww w . j a v a 2 s. co m return getStreamBytes((PRStream) xmlStream); } catch (IOException e) { throw new InvoiceExtractionError("Could not extrac xml content form pdf.", e); } } throw new InvoiceExtractionError("Pdf catalog does not contain Valid F Entry"); }
From source file:mkl.testarea.itext5.pdfcleanup.PdfCleanUpContentOperator.java
License:Open Source License
public void invoke(PdfContentStreamProcessor pdfContentStreamProcessor, PdfLiteral operator, ArrayList<PdfObject> operands) throws Exception { String operatorStr = operator.toString(); PdfContentByte canvas = cleanUpStrategy.getContext().getCanvas(); PRStream xFormStream = null;// w ww . jav a 2 s . c o m boolean disableOutput = pathConstructionOperators.contains(operatorStr) || pathPaintingOperators.contains(operatorStr) || clippingPathOperators.contains(operatorStr); GraphicsState gs = pdfContentStreamProcessor.gs(); // key - number of a string in the TJ operator, value - number following the string; the first number without string (if it's presented) is stored under 0. // BE AWARE: zero-length strings are ignored!!! Map<Integer, Float> structuredTJoperands = null; if ("Do".equals(operatorStr)) { if (operands.size() == 2 && operands.get(0).isName()) { PdfDictionary xObjResources = cleanUpStrategy.getContext().getResources() .getAsDict(PdfName.XOBJECT); if (xObjResources != null) { PdfStream xObj = xObjResources.getAsStream((PdfName) operands.get(0)); if (xObj instanceof PRStream && xObj.getAsName(PdfName.SUBTYPE) != null && xObj.getAsName(PdfName.SUBTYPE).compareTo(PdfName.FORM) == 0) { xFormStream = (PRStream) xObj; cleanUpStrategy.registerNewContext(xObj.getAsDict(PdfName.RESOURCES), null); } } } } originalContentOperator.invoke(pdfContentStreamProcessor, operator, operands); List<PdfCleanUpContentChunk> chunks = cleanUpStrategy.getChunks(); if (xFormStream != null) { xFormStream.setData(cleanUpStrategy.getContext().getCanvas() .toPdf(cleanUpStrategy.getContext().getCanvas().getPdfWriter())); cleanUpStrategy.popContext(); canvas = cleanUpStrategy.getContext().getCanvas(); } if ("Do".equals(operatorStr)) { if (chunks.size() > 0 && chunks.get(0) instanceof PdfCleanUpContentChunk.Image) { PdfCleanUpContentChunk.Image chunk = (PdfCleanUpContentChunk.Image) chunks.get(0); if (chunk.isVisible()) { PdfDictionary xObjResources = cleanUpStrategy.getContext().getResources() .getAsDict(PdfName.XOBJECT); PRStream imageStream = (PRStream) xObjResources.getAsStream((PdfName) operands.get(0)); updateImageStream(imageStream, chunk.getNewImageData()); } else { disableOutput = true; } } } else if (lineStyleOperators.contains(operatorStr)) { disableOutput = true; } else if (textShowingOperators.contains(operatorStr) && !allChunksAreVisible(cleanUpStrategy.getChunks())) { disableOutput = true; if ("'".equals(operatorStr)) { canvas.getInternalBuffer().append(TStar); } else if ("\"".equals(operatorStr)) { operands.get(0).toPdf(canvas.getPdfWriter(), canvas.getInternalBuffer()); canvas.getInternalBuffer().append(Tw); operands.get(1).toPdf(canvas.getPdfWriter(), canvas.getInternalBuffer()); canvas.getInternalBuffer().append(TcTStar); } else if ("TJ".equals(operatorStr)) { structuredTJoperands = structureTJarray((PdfArray) operands.get(0)); } writeTextChunks(structuredTJoperands, chunks, canvas, gs.getCharacterSpacing(), gs.getWordSpacing(), gs.getFontSize(), gs.getHorizontalScaling()); } else if (pathPaintingOperators.contains(operatorStr)) { writePath(operatorStr, canvas, gs.getColorSpaceStroke()); } else if (strokeColorOperators.contains(operatorStr)) { // Replace current color with the new one. cleanUpStrategy.getContext().popStrokeColor(); cleanUpStrategy.getContext().pushStrokeColor(operands); } else if ("q".equals(operatorStr)) { cleanUpStrategy.getContext().pushStrokeColor(cleanUpStrategy.getContext().peekStrokeColor()); } else if ("Q".equals(operatorStr)) { cleanUpStrategy.getContext().popStrokeColor(); } if (!disableOutput) { writeOperands(canvas, operands); } cleanUpStrategy.clearChunks(); }
From source file:mkl.testarea.itext5.pdfcleanup.StrictPdfCleanUpProcessor.java
License:Open Source License
/** * Extracts locations from the concrete annotation. * Note: annotation can consist not only of one area specified by the RECT entry, but also of multiple areas specified * by the QuadPoints entry in the annotation dictionary. *///from ww w . jav a 2 s . com private List<PdfCleanUpLocation> extractLocationsFromRedactAnnot(int page, int annotIndex, PdfDictionary annotDict) { List<PdfCleanUpLocation> locations = new ArrayList<PdfCleanUpLocation>(); List<Rectangle> markedRectangles = new ArrayList<Rectangle>(); PdfArray quadPoints = annotDict.getAsArray(PdfName.QUADPOINTS); if (quadPoints.size() != 0) { markedRectangles.addAll(translateQuadPointsToRectangles(quadPoints)); } else { PdfArray annotRect = annotDict.getAsArray(PdfName.RECT); markedRectangles .add(new Rectangle(annotRect.getAsNumber(0).floatValue(), annotRect.getAsNumber(1).floatValue(), annotRect.getAsNumber(2).floatValue(), annotRect.getAsNumber(3).floatValue())); } clippingRects.put(annotIndex, markedRectangles); BaseColor cleanUpColor = null; PdfArray ic = annotDict.getAsArray(PdfName.IC); if (ic != null) { cleanUpColor = new BaseColor(ic.getAsNumber(0).floatValue(), ic.getAsNumber(1).floatValue(), ic.getAsNumber(2).floatValue()); } PdfStream ro = annotDict.getAsStream(PdfName.RO); if (ro != null) { cleanUpColor = null; } for (Rectangle rect : markedRectangles) { locations.add(new PdfCleanUpLocation(page, rect, cleanUpColor)); } return locations; }
From source file:mkl.testarea.itext5.pdfcleanup.StrictPdfCleanUpProcessor.java
License:Open Source License
/** * Deletes redact annotations from the page and substitutes them with either OverlayText or RO object if it's needed. *//*from w w w . j av a 2 s . co m*/ private void deleteRedactAnnots(int pageNum) throws IOException, DocumentException { Set<String> indirRefs = redactAnnotIndirRefs.get(pageNum); if (indirRefs == null || indirRefs.isEmpty()) { return; } PdfReader reader = pdfStamper.getReader(); PdfContentByte canvas = pdfStamper.getOverContent(pageNum); PdfDictionary pageDict = reader.getPageN(pageNum); PdfArray annotsArray = pageDict.getAsArray(PdfName.ANNOTS); // j is for access annotRect (i can be decreased, so we need to store additional index, // indicating current position in ANNOTS array in case if we don't remove anything for (int i = 0, j = 0; i < annotsArray.size(); ++i, ++j) { PdfIndirectReference annotIndRef = annotsArray.getAsIndirectObject(i); PdfDictionary annotDict = annotsArray.getAsDict(i); if (indirRefs.contains(annotIndRef.toString()) || indirRefs.contains(getParentIndRefStr(annotDict))) { PdfStream formXObj = annotDict.getAsStream(PdfName.RO); PdfString overlayText = annotDict.getAsString(PdfName.OVERLAYTEXT); if (fillCleanedArea && formXObj != null) { PdfArray rectArray = annotDict.getAsArray(PdfName.RECT); Rectangle annotRect = new Rectangle(rectArray.getAsNumber(0).floatValue(), rectArray.getAsNumber(1).floatValue(), rectArray.getAsNumber(2).floatValue(), rectArray.getAsNumber(3).floatValue()); insertFormXObj(canvas, pageDict, formXObj, clippingRects.get(j), annotRect); } else if (fillCleanedArea && overlayText != null && overlayText.toUnicodeString().length() > 0) { drawOverlayText(canvas, clippingRects.get(j), overlayText, annotDict.getAsString(PdfName.DA), annotDict.getAsNumber(PdfName.Q), annotDict.getAsBoolean(PdfName.REPEAT)); } annotsArray.remove(i--); // array size is changed, so we need to decrease i } } if (annotsArray.size() == 0) { pageDict.remove(PdfName.ANNOTS); } }
From source file:org.gmdev.pdftrick.engine.ImageListenerShowThumb.java
License:Open Source License
/** * extracts the images contained in selected page and convert it in a BufferedImage to add and show to the center panel. * @param renderInfo//from w w w . j ava 2 s . c o m */ private void render(ImageRenderInfo renderInfo) { final HashMap<Integer, String> rotationFromPages = factory.getRotationFromPages(); boolean isInline = false; PdfImageObject image = null; try { BufferedImage buffImg = null; if (renderInfo.getRef() == null) { isInline = true; inlineImageCounter += 1; } try { image = renderInfo.getImage(); } catch (UnsupportedPdfException updfe) { try { if (isInline) { buffImg = null; } else { buffImg = CustomExtraImgReader.readIndexedPNG(renderInfo.getRef().getNumber(), factory.getResultFile()); } } catch (Exception e) { logger.error("Exception", e); PdfTrickMessages.append("ERROR", Consts.SENDLOG_MSG); unsupportedImage++; return; } } if (image != null) { BufferedImage buffPic = null; try { // if image is JBIG2 type i need a custom way and using jbig2 ImageIO plugin if (image.getFileType().equalsIgnoreCase("JBIG2")) { buffPic = CustomExtraImgReader.readJBIG2(image); } else { buffPic = image.getBufferedImage(); } } catch (IIOException iioex) { byte[] imageByteArray = image.getImageAsBytes(); try { buffPic = CustomExtraImgReader.readCMYK_JPG(imageByteArray); } catch (Exception e) { logger.error("Exception", e); PdfTrickMessages.append("ERROR", Consts.SENDLOG_MSG); unsupportedImage++; return; } } catch (Exception e) { logger.error("Exception", e); PdfTrickMessages.append("ERROR", Consts.SENDLOG_MSG); unsupportedImage++; return; } // check if image contains a mask image BufferedImage buffMask = null; PdfDictionary imageDictionary = image.getDictionary(); PRStream maskStream = (PRStream) imageDictionary.getAsStream(PdfName.SMASK); if (maskStream != null) { // if i have an smak object i check that is not a jpeg format, because this may cause some problem on offscreen rendering // usually all imges with mask are png ... and there aren't problems, if image is jpg i discard the mask :) if (!image.getFileType().equalsIgnoreCase("jpg") && buffPic != null) { PdfImageObject maskImage = new PdfImageObject(maskStream); buffMask = maskImage.getBufferedImage(); Image img = PdfTrickUtils.TransformGrayToTransparency(buffMask); buffImg = PdfTrickUtils.ApplyTransparency(buffPic, img); } else { buffImg = buffPic; } } else { buffImg = buffPic; } } String flip = ""; String rotate = ""; Matrix matrix = renderInfo.getImageCTM(); String angle = "" + rotationFromPages.get(numPage); // experimental float i11 = matrix.get(Matrix.I11); // if negative -> horizontal flip float i12 = matrix.get(Matrix.I12); // if negative -> 90 degree rotation float i21 = matrix.get(Matrix.I21); // if negative -> 270 degree rotation float i22 = matrix.get(Matrix.I22); // if negative -> vertical flip // flip and rotation ... from matrix if i11 or i22 is negative i have to flip image if (("" + i11).charAt(0) == '-') { flip = "fh"; } else if (("" + i22).charAt(0) == '-') { flip = "fv"; } if (angle.equalsIgnoreCase("270") || ("" + i21).charAt(0) == '-') { rotate = "270"; } else if (angle.equalsIgnoreCase("180")) { rotate = "180"; } else if (angle.equalsIgnoreCase("90") || ("" + i12).charAt(0) == '-') { rotate = "90"; } if (buffImg != null) { buffImg = PdfTrickUtils.adjustImage(buffImg, flip, rotate); RenderedImageAttributes imageAttrs = null; if (isInline) { // set up inline image object attributes and store it in a hashmap InlineImage inImg = new InlineImage(buffImg, image != null ? image.getFileType() : "png"); imageAttrs = new RenderedImageInline(inlineImageCounter, inImg, numPage, flip, rotate); } else { // set up image object for normal images imageAttrs = new RenderedImageNormal(numPage, renderInfo.getRef().getNumber(), flip, rotate); } // scaling image with original aspect ratio (if image exceded pic box) int w = buffImg.getWidth(); int h = buffImg.getHeight(); if (w > 170 || h > 170) { double faktor; if (w > h) { faktor = 160 / (double) w; int scaledW = (int) Math.round(faktor * w); int scaledH = (int) Math.round(faktor * h); buffImg = PdfTrickUtils.getScaledImagWithScalr(buffImg, scaledW, scaledH); } else { faktor = 160 / (double) h; int scaledW = (int) Math.round(faktor * w); int scaledH = (int) Math.round(faktor * h); buffImg = PdfTrickUtils.getScaledImagWithScalr(buffImg, scaledW, scaledH); } } numImg++; // dynamic update on the center panel (under EDT thread). UpdatePanelCenter upPcenter = this.upPcenter; upPcenter.setInlineImg(isInline); upPcenter.setBuffImg(buffImg); upPcenter.setImageAttrs(imageAttrs); try { SwingUtilities.invokeAndWait(upPcenter); } catch (InterruptedException e) { logger.error("Exception", e); } catch (InvocationTargetException e) { logger.error("Exception", e); } buffImg.flush(); } else { unsupportedImage++; } } catch (IOException e) { logger.error("Exception", e); PdfTrickMessages.append("ERROR", Consts.SENDLOG_MSG); unsupportedImage++; } catch (Exception e) { logger.error("Exception", e); PdfTrickMessages.append("ERROR", Consts.SENDLOG_MSG); unsupportedImage++; } }
From source file:org.gmdev.pdftrick.engine.ImagesExtractor.java
License:Open Source License
/** * /*from w w w. jav a 2 s .c o m*/ * @param timeDirResult * @param resultFilePath * @param imageSelected * @param inlineImgSelected * @return TRUE if the extraction went good */ private boolean extractImgSel(String timeDirResult, String resultFilePath, HashMap<String, RenderedImageAttributes> imageSelected, HashMap<String, RenderedImageAttributes> inlineImgSelected) { final Properties messages = factory.getMessages(); String result = timeDirResult + "/" + "Img_%s.%s"; PdfReader reader = null; boolean retExtract = true; try { reader = new PdfReader(resultFilePath); Set<String> keys = imageSelected.keySet(); Iterator<String> i = keys.iterator(); int z = 1; while (i.hasNext()) { BufferedImage buff = null; String key = i.next(); RenderedImageAttributes imgAttr = imageSelected.get(key); String flip = imgAttr.getFlip(); String rotate = imgAttr.getRotate(); int ref = imgAttr.getReference(); PdfObject o = reader.getPdfObject(ref); PdfStream stream = (PdfStream) o; PdfImageObject io = null; try { io = new PdfImageObject((PRStream) stream); } catch (UnsupportedPdfException updfe) { try { buff = CustomExtraImgReader.readIndexedPNG(ref, resultFilePath); buff = PdfTrickUtils.adjustImage(buff, flip, rotate); String type = "png"; String filename = String.format(result, z, type); File outputfile = new File(filename); ImageIO.write(buff, type, outputfile); } catch (Exception e) { logger.error("Exception", e); PdfTrickMessages.append("ERROR", Consts.SENDLOG_MSG); } } if (io != null) { String type = io.getFileType(); String filename = String.format(result, z, type); BufferedImage buffPic = null; try { if (type.equalsIgnoreCase("JBIG2")) { buffPic = CustomExtraImgReader.readJBIG2(io); } else { buffPic = io.getBufferedImage(); } } catch (IIOException e) { byte[] imageByteArray = io.getImageAsBytes(); try { buffPic = CustomExtraImgReader.readCMYK_JPG(imageByteArray); } catch (Exception ex) { logger.error("Exception", e); PdfTrickMessages.append("ERROR", Consts.SENDLOG_MSG); } } // check if image contains a mask image BufferedImage buffMask = null; PdfDictionary imageDictionary = io.getDictionary(); PRStream maskStream = (PRStream) imageDictionary.getAsStream(PdfName.SMASK); if (maskStream != null) { // i have an smask object i check that is not a jpeg format, because this may cause some problem on offscreen rendering // usually all imges with mask are png ... and there aren't problem, if image is jpg i discard the mask :) if (!type.equalsIgnoreCase("jpg")) { PdfImageObject maskImage = new PdfImageObject(maskStream); buffMask = maskImage.getBufferedImage(); Image img = PdfTrickUtils.TransformGrayToTransparency(buffMask); buff = PdfTrickUtils.ApplyTransparency(buffPic, img); } else { buff = buffPic; } } else { buff = buffPic; } if (buff != null) { buff = PdfTrickUtils.adjustImage(buff, flip, rotate); //particular cases of encoding String encode = ""; if (type.equalsIgnoreCase("jp2")) { encode = "jpeg 2000"; } else if (type.equalsIgnoreCase("jbig2")) { encode = "jpeg"; filename = String.format(result, z, "jpg"); } else { encode = type; } File outputfile = new File(filename); ImageIO.write(buff, encode, outputfile); } } z++; } reader.close(); if (inlineImgSelected.size() > 0) { extractInlineImgSel(timeDirResult, inlineImgSelected, z); } PdfTrickMessages.append("INFO", messages.getProperty("tmsg_19")); } catch (Exception e) { logger.error("Exception", e); PdfTrickMessages.append("ERROR", Consts.SENDLOG_MSG); retExtract = false; } return retExtract; }
From source file:org.gmdev.pdftrick.utils.CustomExtraImgReader.java
License:Open Source License
/** * Tead a JBIG2 image and give a BufferedImage * @param image/*from www . j a va2 s.co m*/ * @return The BufferedImage obj */ public static BufferedImage readJBIG2(PdfImageObject image) { BufferedImage buffImg = null; PdfDictionary dic = image.getDictionary(); PdfDictionary decodedic = dic.getAsDict(PdfName.DECODEPARMS); PdfStream globalStream = decodedic.getAsStream(PdfName.JBIG2GLOBALS); try { byte[] byteArrayGlobal = PdfReader.getStreamBytes((PRStream) globalStream); InputStream in = new ByteArrayInputStream(image.getImageAsBytes()); ImageInputStream stream = ImageIO.createImageInputStream(in); InputStream inG = new ByteArrayInputStream(byteArrayGlobal); ImageInputStream streamG = ImageIO.createImageInputStream(inG); JBIG2ImageReader reader = new JBIG2ImageReader(new JBIG2ImageReaderSpi()); reader.setInput(stream); JBIG2Globals globals = reader.processGlobals(streamG); reader.setGlobals(globals); ImageReadParam param = reader.getDefaultReadParam(); buffImg = reader.read(0, param); in.close(); inG.close(); } catch (Exception e) { logger.error("Exception", e); PdfTrickMessages.append("ERROR", Consts.SENDLOG_MSG); } return buffImg; }
From source file:org.gmdev.pdftrick.utils.CustomExtraImgReader.java
License:Open Source License
/** * Read a png image with if all other method fails * @param ref/*from w w w. j av a 2s .com*/ * @param resultFile * @return The BufferedImage obj * @throws IOException * @throws ImageReadException */ public static BufferedImage readIndexedPNG(int ref, String resultFile) throws IOException, ImageReadException { PdfReader reader = new PdfReader(resultFile); PRStream stream = (PRStream) reader.getPdfObject(ref); PdfDictionary dic = stream; byte[] content = PdfReader.getStreamBytesRaw(stream); int width = dic.getAsNumber(PdfName.WIDTH).intValue(); int height = dic.getAsNumber(PdfName.HEIGHT).intValue(); int pngBitDepth = dic.getAsNumber(PdfName.BITSPERCOMPONENT).intValue(); PdfObject colorspace = dic.getDirectObject(PdfName.COLORSPACE); PdfArray decode = dic.getAsArray(PdfName.DECODE); PdfArray carray = (PdfArray) colorspace; PdfObject id2 = carray.getDirectObject(3); byte[] palette = null; if (id2 instanceof PdfString) { palette = ((PdfString) id2).getBytes(); } else if (id2 instanceof PRStream) { palette = PdfReader.getStreamBytes(((PRStream) id2)); } Map<PdfName, FilterHandlers.FilterHandler> handlers = new HashMap<PdfName, FilterHandlers.FilterHandler>( FilterHandlers.getDefaultFilterHandlers()); byte[] imageBytes = PdfReader.decodeBytes(content, dic, handlers); int stride = (width * pngBitDepth + 7) / 8; ByteArrayOutputStream ms = new ByteArrayOutputStream(); PngWriter png = new PngWriter(ms); if (decode != null) { if (pngBitDepth == 1) { // if the decode array is 1,0, then we need to invert the image if (decode.getAsNumber(0).intValue() == 1 && decode.getAsNumber(1).intValue() == 0) { int len = imageBytes.length; for (int t = 0; t < len; ++t) { imageBytes[t] ^= 0xff; } } else { // if the decode array is 0,1, do nothing. It's possible that the array could be 0,0 or 1,1 - but that would be silly, so we'll just ignore that case } } else { // todo: add decode transformation for other depths } } int pngColorType = 0; png.writeHeader(width, height, pngBitDepth, pngColorType); if (palette != null) { png.writePalette(palette); } png.writeData(imageBytes, stride); png.writeEnd(); imageBytes = ms.toByteArray(); InputStream in = new ByteArrayInputStream(imageBytes); ImageInputStream ima_stream = ImageIO.createImageInputStream(in); BufferedImage buffImg = null; BufferedImage buffPic = ImageIO.read(ima_stream); // check if image contains a mask image ... experimental for this type of image BufferedImage buffMask = null; PRStream maskStream = (PRStream) dic.getAsStream(PdfName.SMASK); if (maskStream != null) { PdfImageObject maskImage = new PdfImageObject(maskStream); buffMask = maskImage.getBufferedImage(); Image img = PdfTrickUtils.TransformGrayToTransparency(buffMask); buffImg = PdfTrickUtils.ApplyTransparency(buffPic, img); } else { buffImg = buffPic; } reader.close(); ms.close(); in.close(); return buffImg; }
From source file:pdfextract.ImageRenderListener.java
public void renderImage(ImageRenderInfo renderInfo) { try {/*from www . j av a 2 s. c om*/ 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(); } }