Example usage for com.itextpdf.text.pdf PdfName XOBJECT

List of usage examples for com.itextpdf.text.pdf PdfName XOBJECT

Introduction

In this page you can find the example usage for com.itextpdf.text.pdf PdfName XOBJECT.

Prototype

PdfName XOBJECT

To view the source code for com.itextpdf.text.pdf PdfName XOBJECT.

Click Source Link

Document

A name

Usage

From source file:com.betel.flowers.pdf.util.RemoveBlankPageFromPDF.java

public static void removeBlankPdfPages(String source, String destination)
        throws IOException, DocumentException {
    PdfReader r = null;/*from  w  w w . j a v  a 2s .c o  m*/
    RandomAccessSourceFactory rasf = null;
    RandomAccessFileOrArray raf = null;
    Document document = null;
    PdfCopy writer = null;

    try {
        r = new PdfReader(source);
        // deprecated
        //    RandomAccessFileOrArray raf
        //           = new RandomAccessFileOrArray(pdfSourceFile);
        // itext 5.4.1
        rasf = new RandomAccessSourceFactory();
        raf = new RandomAccessFileOrArray(rasf.createBestSource(source));
        document = new Document(r.getPageSizeWithRotation(1));
        writer = new PdfCopy(document, new FileOutputStream(destination));
        document.open();
        PdfImportedPage page = null;

        for (int i = 1; i <= r.getNumberOfPages(); i++) {
            // first check, examine the resource dictionary for /Font or
            // /XObject keys.  If either are present -> not blank.
            PdfDictionary pageDict = r.getPageN(i);
            PdfDictionary resDict = (PdfDictionary) pageDict.get(PdfName.RESOURCES);
            boolean noFontsOrImages = true;
            if (resDict != null) {
                noFontsOrImages = resDict.get(PdfName.FONT) == null && resDict.get(PdfName.XOBJECT) == null;
            }

            if (!noFontsOrImages) {
                byte bContent[] = r.getPageContent(i, raf);
                ByteArrayOutputStream bs = new ByteArrayOutputStream();
                bs.write(bContent);

                if (bs.size() > BLANK_THRESHOLD) {
                    page = writer.getImportedPage(r, i);
                    writer.addPage(page);
                }
            }
        }
    } finally {
        if (document != null) {
            document.close();
        }
        if (writer != null) {
            writer.close();
        }
        if (raf != null) {
            raf.close();
        }
        if (r != null) {
            r.close();
        }
    }
}

From source file:cz.muni.pdfjbim.PdfImageExtractor.java

License:Apache License

private List<Image> getImagesFromPdfDict(PdfDictionary dict, PdfReader doc) throws IOException {
    List<Image> images = new ArrayList<Image>();
    PdfDictionary res = (PdfDictionary) (PdfReader.getPdfObject(dict.get(PdfName.RESOURCES)));
    PdfDictionary xobj = (PdfDictionary) (PdfReader.getPdfObject(res.get(PdfName.XOBJECT)));

    if (xobj != null) {
        for (PdfName name : xobj.getKeys()) {
            PdfObject obj = xobj.get(name);
            if (obj.isIndirect()) {
                PdfDictionary tg = (PdfDictionary) (PdfReader.getPdfObject(obj));
                PdfName subtype = (PdfName) (PdfReader.getPdfObject(tg.get(PdfName.SUBTYPE)));
                if (PdfName.IMAGE.equals(subtype)) {
                    int xrefIdx = ((PRIndirectReference) obj).getNumber();
                    PdfObject pdfObj = doc.getPdfObject(xrefIdx);
                    PdfStream str = (PdfStream) (pdfObj);
                    byte[] bytes = PdfReader.getStreamBytesRaw((PRStream) str);

                    String filter = tg.get(PdfName.FILTER).toString();
                    String width = tg.get(PdfName.WIDTH).toString();
                    String height = tg.get(PdfName.HEIGHT).toString();
                    String bpp = tg.get(PdfName.BITSPERCOMPONENT).toString();

                    if ("/FlateDecode".equals(filter)) {
                        bytes = PdfReader.FlateDecode(bytes, true);
                        try {
                            images.add(Image.getInstance(bytes));
                        } catch (BadElementException ex) {
                            log.warn("problem to process FlatDecoded Image", ex);
                        }//  w  ww  .j a  v  a  2s .  co m
                    } else if (PdfName.FORM.equals(subtype) || PdfName.GROUP.equals(subtype)) {
                        images.addAll(getImagesFromPdfDict(tg, doc));
                    }
                }
            }
        }
    }
    return images;
}

From source file:cz.muni.pdfjbim.PdfImageProcessor.java

License:Apache License

/**
 * replace images by they recompressed version according to JBIG2 standard
 * positions and image data given in imagesData
 * @param pdfName represents name of original PDF file
 * @param os represents output stream for writing changed PDF file
 * @param imagesData contains compressed images according to JBIG2 standard and informations about them
 * @throws PdfRecompressionException if version of PDF is lower than 1.4 or was catch DocumentException or IOException
 *//*  w  w w  .  j a  v a 2  s . c  o m*/
public void replaceImageUsingIText(String pdfName, OutputStream os, Jbig2ForPdf imagesData)
        throws PdfRecompressionException {
    if (pdfName == null) {
        throw new NullPointerException("pdfName");
    }

    if (os == null) {
        throw new NullPointerException("os");
    }

    if (imagesData == null) {
        throw new NullPointerException("imagesData is null => nothing to recompress");
    }

    Map<PdfObjId, PdfImage> jbig2Images = imagesData.getMapOfJbig2Images();

    PdfReader pdf;
    PdfStamper stp = null;
    try {
        pdf = new PdfReader(pdfName);
        stp = new PdfStamper(pdf, os);
        PdfWriter writer = stp.getWriter();

        int version;
        if ((version = Integer.parseInt(String.valueOf(pdf.getPdfVersion()))) < 4) {
            writer.setPdfVersion(PdfWriter.PDF_VERSION_1_4);
        }

        Iterator itImages = jbig2Images.values().iterator();
        String key;
        if (itImages.hasNext()) {
            PdfImage myImg = (PdfImage) itImages.next();
            key = myImg.getPdfImageInformation().getKey();
        } else {
            key = "im0";
        }

        for (int pageNum = 1; pageNum <= pdf.getNumberOfPages(); pageNum++) {

            PdfDictionary pg = pdf.getPageN(pageNum);
            PdfDictionary resPg = (PdfDictionary) PdfReader.getPdfObject(pg.get(PdfName.RESOURCES));

            PdfDictionary xobjResPg = (PdfDictionary) PdfReader.getPdfObject(resPg.get(PdfName.XOBJECT));

            PdfObject obj = null;
            if (xobjResPg != null) {
                for (Iterator it = xobjResPg.getKeys().iterator(); it.hasNext();) {
                    PdfObject pdfObjIndirect = xobjResPg.get((PdfName) it.next());
                    if (pdfObjIndirect.isIndirect()) {
                        PdfDictionary pdfObj2 = (PdfDictionary) PdfReader.getPdfObject(pdfObjIndirect);
                        PdfDictionary xobj2Res = (PdfDictionary) PdfReader
                                .getPdfObject(pdfObj2.get(PdfName.RESOURCES));
                        if (xobj2Res != null) {
                            for (Iterator it2 = xobj2Res.getKeys().iterator(); it2.hasNext();) {
                                PdfObject resObj = xobj2Res.get((PdfName) it2.next());
                            }
                            PdfDictionary xobj = (PdfDictionary) PdfReader
                                    .getPdfObject(xobj2Res.get(PdfName.XOBJECT));
                            if (xobj == null) {
                                continue;
                            }
                            obj = xobj.get(new PdfName(key));
                        } else {
                            obj = xobjResPg.get(new PdfName(key));
                            if (obj == null) {
                                obj = pdfObjIndirect;
                            }
                        }
                    }
                }
            }

            if ((obj != null) && (obj.isIndirect())) {

                PdfDictionary tg = (PdfDictionary) PdfReader.getPdfObject(obj);
                if (tg == null) {
                    continue;
                }
                PdfName type = (PdfName) PdfReader.getPdfObject(tg.get(PdfName.SUBTYPE));
                if (PdfName.IMAGE.equals(type)) {
                    PRIndirectReference ref = (PRIndirectReference) obj;
                    PdfObjId imId = new PdfObjId(ref.getNumber(), ref.getGeneration());
                    PdfImage jbImage = jbig2Images.get(imId);
                    if (jbImage == null) {
                        continue;
                    }
                    PdfImageInformation jbImageInfo = jbImage.getPdfImageInformation();
                    Image img = Image.getInstance(jbImageInfo.getWidth(), jbImageInfo.getHeight(),
                            jbImage.getImageData(), imagesData.getGlobalData());

                    PdfReader.killIndirect(obj);
                    Image maskImage = img.getImageMask();

                    if (maskImage != null) {
                        writer.addDirectImageSimple(maskImage);
                    }
                    writer.addDirectImageSimple(img, (PRIndirectReference) obj);
                }
            }
        }
        stp.close();
    } catch (IOException ioEx) {
        throw new PdfRecompressionException(ioEx);
    } catch (DocumentException dEx) {
        throw new PdfRecompressionException(dEx);
    } finally {
        Tools.deleteFilesFromList(imagesData.getJbFiles().toArray(new File[0]));
    }
}

From source file:cz.muni.pdfjbim.PdfImageReplacer.java

License:Apache License

/**
 * replace images by they recompressed version according to JBIG2 standard positions and image
 * data given in imagesData/*from   w  w w . j  ava 2  s .co  m*/
 *
 * @param originalPdf represents name of original PDF file
 * @param os represents output stream for writing changed PDF file
 * @param imagesData contains compressed images according to JBIG2 standard and informations
 * about them
 * @throws PdfRecompressionException if version of PDF is lower than 1.4 or was catch
 * DocumentException or IOException
 */
public void replaceImageUsingIText(InputStream originalPdf, OutputStream os, List<Jbig2ForPdf> imagesDataList)
        throws PdfRecompressionException {
    if (originalPdf == null) {
        throw new NullPointerException("pdfName");
    }

    if (os == null) {
        throw new NullPointerException("os");
    }

    if (imagesDataList == null) {
        throw new NullPointerException("imagesData is null => nothing to recompress");
    }

    log.info("Replacing old images in PDF with their equivalent encoded according to standard JBIG2");
    PdfReader pdf;
    PdfStamper stp = null;
    try {
        pdf = new PdfReader(originalPdf);
        stp = new PdfStamper(pdf, os);
        PdfWriter writer = stp.getWriter();

        int version;
        if ((version = Integer.parseInt(String.valueOf(pdf.getPdfVersion()))) < 4) {
            log.debug("PDF version of original PDF was {} => changing to PDF version 1.4", pdf.getPdfVersion());
            writer.setPdfVersion(PdfWriter.PDF_VERSION_1_4);
        }

        for (Jbig2ForPdf imagesData : imagesDataList) {

            Map<PdfObjId, PdfImage> jbig2Images = imagesData.getMapOfJbig2Images();

            Iterator itImages = jbig2Images.values().iterator();
            String key;
            if (itImages.hasNext()) {
                PdfImage myImg = (PdfImage) itImages.next();
                key = myImg.getPdfImageInformation().getKey();
            } else {
                key = "im0";
            }

            for (int pageNum = 1; pageNum <= pdf.getNumberOfPages(); pageNum++) {

                PdfDictionary pg = pdf.getPageN(pageNum);
                PdfDictionary resPg = (PdfDictionary) PdfReader.getPdfObject(pg.get(PdfName.RESOURCES));

                PdfDictionary xobjResPg = (PdfDictionary) PdfReader.getPdfObject(resPg.get(PdfName.XOBJECT));

                PdfObject obj = null;
                if (xobjResPg != null) {
                    for (Iterator it = xobjResPg.getKeys().iterator(); it.hasNext();) {
                        PdfObject pdfObjIndirect = xobjResPg.get((PdfName) it.next());
                        if (pdfObjIndirect.isIndirect()) {
                            PdfDictionary pdfObj2 = (PdfDictionary) PdfReader.getPdfObject(pdfObjIndirect);
                            PdfDictionary xobj2Res = (PdfDictionary) PdfReader
                                    .getPdfObject(pdfObj2.get(PdfName.RESOURCES));
                            if (xobj2Res != null) {
                                for (Iterator it2 = xobj2Res.getKeys().iterator(); it2.hasNext();) {
                                    PdfObject resObj = xobj2Res.get((PdfName) it2.next());
                                }
                                PdfDictionary xobj = (PdfDictionary) PdfReader
                                        .getPdfObject(xobj2Res.get(PdfName.XOBJECT));
                                if (xobj == null) {
                                    continue;
                                }
                                obj = xobj.get(new PdfName(key));
                            } else {
                                obj = xobjResPg.get(new PdfName(key));
                                if (obj == null) {
                                    obj = pdfObjIndirect;
                                }
                            }
                        }
                    }
                }

                if ((obj != null) && (obj.isIndirect())) {

                    PdfDictionary tg = (PdfDictionary) PdfReader.getPdfObject(obj);
                    if (tg == null) {
                        continue;
                    }
                    PdfName type = (PdfName) PdfReader.getPdfObject(tg.get(PdfName.SUBTYPE));
                    if (PdfName.IMAGE.equals(type)) {
                        PRIndirectReference ref = (PRIndirectReference) obj;
                        PdfObjId imId = new PdfObjId(ref.getNumber(), ref.getGeneration());
                        PdfImage jbImage = jbig2Images.get(imId);
                        if (jbImage == null) {
                            continue;
                        }

                        log.debug("Replacing image {}", jbImage);
                        PdfImageInformation jbImageInfo = jbImage.getPdfImageInformation();
                        Image img = Image.getInstance(jbImageInfo.getWidth(), jbImageInfo.getHeight(),
                                jbImage.getImageData(), imagesData.getGlobalData());

                        PdfReader.killIndirect(obj);
                        Image maskImage = img.getImageMask();

                        if (maskImage != null) {
                            writer.addDirectImageSimple(maskImage);
                        }
                        writer.addDirectImageSimple(img, (PRIndirectReference) obj);
                    }
                }
            }
        }
    } catch (IOException ioEx) {
        throw new PdfRecompressionException(ioEx);
    } catch (DocumentException dEx) {
        throw new PdfRecompressionException(dEx);
    } finally {
        log.debug("Deleting temporary files created during process of PDF recompression");
        for (Jbig2ForPdf imagesData : imagesDataList) {
            Tools.deleteFilesFromList(imagesData.getJbFiles().toArray(new File[0]));
        }
        try {
            if (stp != null) {
                stp.close();
            }
        } catch (DocumentException ex) {
            log.error("Exception thrown while closing stream", ex);
        } catch (IOException ex) {
            log.error("Exception thrown while closing stream", ex);
        }
    }

}

From source file:de.mat.utils.pdftools.PdfExtractEmptyPages.java

License:Mozilla Public License

/**
 * <h4>FeatureDomain:</h4>/*from  w  w  w . j  ava 2 s  .c om*/
 *     PublishingTools
 * <h4>FeatureDescription:</h4>
 *     reads readerOrig and adds pages to writerRemoved if empty, or to 
 *     writerTrimmed if not empty
 * <h4>FeatureResult:</h4>
 *   <ul>
 *     <li>updates writerTrimmed - add all pages which are not empty
 *     <li>updates writerRemoved - add all empty pages
 *   </ul> 
 * <h4>FeatureKeywords:</h4>
 *     PDF Publishing
 * @param origFileName - orig filename of the sourcepdf
 * @param readerOrig - reader of source
 * @param writerTrimmed - writer for trimmed pages
 * @param writerRemoved - writer for empty pages
 * @param flgTrim - ??
 * @return - count of trimmed pages
 * @throws Exception
 */
public static int addTrimmedPages(String origFileName, PdfReader readerOrig, PdfCopy writerTrimmed,
        PdfCopy writerRemoved, boolean flgTrim) throws Exception {
    PdfImportedPage page = null;
    int countTrimmedPages = 0;

    //loop each page
    for (int i = 1; i <= readerOrig.getNumberOfPages(); i++) {
        boolean flgIsEmpty = true;

        // get dictionary
        PdfDictionary pageDict = readerOrig.getPageN(i);

        // every pdf-version has its own way :-(
        char version = readerOrig.getPdfVersion();

        if (version == '3') {
            // PDF-Version: 3

            // examine the resource dictionary for /Font or
            // /XObject keys.  If either are present, they're almost
            // certainly actually used on the page -> not blank.
            PdfObject myObj = pageDict.get(PdfName.RESOURCES);
            PdfDictionary resDict = null;
            if (myObj instanceof PdfDictionary) {
                resDict = (PdfDictionary) myObj;
            } else {
                resDict = (PdfDictionary) PdfReader.getPdfObject(myObj);
            }
            if (resDict != null) {
                flgIsEmpty = resDict.get(PdfName.FONT) == null && resDict.get(PdfName.XOBJECT) == null;
                if (LOGGER.isInfoEnabled()) {
                    if (flgIsEmpty) {
                        LOGGER.info("probably empty page " + i + " Version: 1." + version
                                + " FONT/XOBJECT found in File:" + origFileName);
                    } else {
                        LOGGER.info("normal page " + i + " Version: 1." + version
                                + " no FONT/XOBJECT found in File:" + origFileName);
                    }
                }
            }
        } else if (version == '4') {
            // PDF-Version: 4
            // check the contentsize.

            // get the page content
            byte bContent[] = readerOrig.getPageContent(i);
            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            // write the content to an output stream
            bs.write(bContent);

            flgIsEmpty = true;
            if (bs.size() > blankPdfsize) {
                if (LOGGER.isInfoEnabled())
                    LOGGER.info("normal page " + i + " Version: 1." + version + " BS:" + bs.size() + " File:"
                            + origFileName);
                flgIsEmpty = false;
            } else {
                if (LOGGER.isInfoEnabled())
                    LOGGER.info("probably empty page " + i + " Version: 1." + version + " BS:" + bs.size()
                            + " File:" + origFileName);
            }
        } else if (version == '5') {
            // PDF-Version: 5
            // check the contentsize.

            // get the page content
            byte bContent[] = readerOrig.getPageContent(i);
            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            // write the content to an output stream
            bs.write(bContent);

            flgIsEmpty = true;
            if (bs.size() > blankPdfsize_v5) {
                if (LOGGER.isInfoEnabled())
                    LOGGER.info("normal page " + i + " Version: 1." + version + " BS:" + bs.size() + " File:"
                            + origFileName);
                flgIsEmpty = false;
            } else {
                if (LOGGER.isInfoEnabled())
                    LOGGER.info("probably empty page " + i + " Version: 1." + version + " BS:" + bs.size()
                            + " File:" + origFileName);
            }
        }

        // add page to removed or trimmed document
        if (!flgIsEmpty || !flgTrim) {
            if (LOGGER.isInfoEnabled())
                LOGGER.info("add page " + i);
            page = writerTrimmed.getImportedPage(readerOrig, i);
            writerTrimmed.addPage(page);
            countTrimmedPages++;
        } else {
            if (LOGGER.isInfoEnabled())
                LOGGER.info("skip page " + i + " Version: 1." + version + " File:" + origFileName);
            if (writerRemoved != null) {
                page = writerRemoved.getImportedPage(readerOrig, i);
                writerRemoved.addPage(page);
            }
        }
    }

    return countTrimmedPages;
}

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;//from  w w w. j  a v  a  2  s  .  c  om
    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

private PdfName generateNameForXObj(PdfDictionary pageDict) {
    PdfDictionary resourcesDict = pageDict.getAsDict(PdfName.RESOURCES);
    PdfDictionary xobjDict = resourcesDict.getAsDict(PdfName.XOBJECT);

    if (xobjDict != null) {
        for (PdfName xobjName : xobjDict.getKeys()) {
            int xobjNum = getXObjNum(xobjName);

            if (currentXObjNum <= xobjNum) {
                currentXObjNum = xobjNum + 1;
            }/*  w  w w.  j av a 2s .c  om*/
        }
    }

    return new PdfName(XOBJ_NAME_PREFIX + currentXObjNum++);
}

From source file:org.h819.commons.file.MyPDFUtils.java

/**
 *  pdf ? pdf/*from ww w  .  j av a2s. c  o  m*/
 *
 * @param srcPdf      the original PDF
 * @param destPdf     the resulting PDF
 * @param imageFactor The multiplication factor for the image (?  imageFacto =0.5f)
 * @throws IOException
 * @throws DocumentException
 */
public static void compressPdf(File srcPdf, File destPdf, float imageFactor)
        throws IOException, DocumentException {

    PdfReader reader = new PdfReader(srcPdf.getAbsolutePath());
    int n = reader.getXrefSize();
    PdfObject object;
    PRStream stream;
    // Look for image and manipulate image stream
    for (int i = 0; i < n; i++) {
        object = reader.getPdfObject(i);
        if (object == null || !object.isStream())
            continue;
        stream = (PRStream) object;
        if (!PdfName.IMAGE.equals(stream.getAsName(PdfName.SUBTYPE)))
            continue;
        if (!PdfName.DCTDECODE.equals(stream.getAsName(PdfName.FILTER)))
            continue;
        PdfImageObject image = new PdfImageObject(stream);
        BufferedImage bi = image.getBufferedImage();
        if (bi == null)
            continue;
        int width = (int) (bi.getWidth() * imageFactor);
        int height = (int) (bi.getHeight() * imageFactor);
        if (width <= 0 || height <= 0)
            continue;
        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        AffineTransform at = AffineTransform.getScaleInstance(imageFactor, imageFactor);
        Graphics2D g = img.createGraphics();
        g.drawRenderedImage(bi, at);
        ByteArrayOutputStream imgBytes = new ByteArrayOutputStream();
        ImageIO.write(img, "JPG", imgBytes);
        stream.clear();
        stream.setData(imgBytes.toByteArray(), false, PRStream.NO_COMPRESSION);
        stream.put(PdfName.TYPE, PdfName.XOBJECT);
        stream.put(PdfName.SUBTYPE, PdfName.IMAGE);
        stream.put(PdfName.FILTER, PdfName.DCTDECODE);
        stream.put(PdfName.WIDTH, new PdfNumber(width));
        stream.put(PdfName.HEIGHT, new PdfNumber(height));
        stream.put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));
        stream.put(PdfName.COLORSPACE, PdfName.DEVICERGB);
    }
    reader.removeUnusedObjects();
    // Save altered PDF
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destPdf.getAbsolutePath()));
    stamper.setFullCompression();
    stamper.close();
    reader.close();
}

From source file:spntoolsdata.pdf.util.RemoveBlankPageFromPDF.java

public static void removeBlankPdfPages(String source, String destination)
        throws IOException, DocumentException {
    PdfReader r = null;//from   www. j a v  a  2 s.c om
    RandomAccessSourceFactory rasf = null;
    RandomAccessFileOrArray raf = null;
    Document document = null;
    PdfCopy writer = null;

    try {
        r = new PdfReader(source);
        // deprecated
        //    RandomAccessFileOrArray raf
        //           = new RandomAccessFileOrArray(pdfSourceFile);
        // itext 5.4.1
        rasf = new RandomAccessSourceFactory();
        raf = new RandomAccessFileOrArray(rasf.createBestSource(source));
        document = new Document(r.getPageSizeWithRotation(1));
        writer = new PdfCopy(document, new FileOutputStream(destination));
        document.open();
        PdfImportedPage page = null;

        for (int i = 1; i <= r.getNumberOfPages(); i++) {
            // first check, examine the resource dictionary for /Font or
            // /XObject keys.  If either are present -> not blank.
            PdfDictionary pageDict = r.getPageN(i);
            PdfDictionary resDict = (PdfDictionary) pageDict.get(PdfName.RESOURCES);
            boolean noFontsOrImages = true;
            if (resDict != null) {
                noFontsOrImages = resDict.get(PdfName.FONT) == null && resDict.get(PdfName.XOBJECT) == null;
            }

            if (!noFontsOrImages) {
                byte bContent[] = r.getPageContent(i, raf);
                ByteArrayOutputStream bs = new ByteArrayOutputStream();
                bs.write(bContent);

                if (bs.size() > BLANK_THRESHOLD) {
                    page = writer.getImportedPage(r, i);
                    writer.addPage(page);
                }
            }
        }
    } finally {
        if (document != null)
            document.close();
        if (writer != null)
            writer.close();
        if (raf != null)
            raf.close();
        if (r != null)
            r.close();
    }
}