Example usage for org.apache.pdfbox.cos COSName FLATE_DECODE

List of usage examples for org.apache.pdfbox.cos COSName FLATE_DECODE

Introduction

In this page you can find the example usage for org.apache.pdfbox.cos COSName FLATE_DECODE.

Prototype

COSName FLATE_DECODE

To view the source code for org.apache.pdfbox.cos COSName FLATE_DECODE.

Click Source Link

Usage

From source file:ReducePDFSize.java

License:Apache License

public static void main(String[] args) throws IOException {
    if (2 != args.length) {
        throw new RuntimeException("arg0 must be input file, org1 must be output file");
    }//from  w w w.ja  v  a 2s.c o m
    String in = args[0];
    String out = args[1];
    PDDocument doc = null;

    try {
        doc = PDDocument.load(new File(in));
        doc.setAllSecurityToBeRemoved(true);
        for (COSObject cosObject : doc.getDocument().getObjects()) {
            COSBase base = cosObject.getObject();
            // if it's a stream: decode it, then re-write it using FLATE_DECODE
            if (base instanceof COSStream) {
                COSStream stream = (COSStream) base;
                byte[] bytes;
                try {
                    bytes = new PDStream(stream).toByteArray();
                } catch (IOException ex) {
                    // NOTE: original example code from PDFBox just logged & "continue;"d here, 'skipping' this stream.
                    // If this type of failure ever happens, we can (perhaps) consider (re)ignoring this type of failure?
                    //
                    // IIUC then that will leave the original (non-decoded / non-flated) stream in place?
                    throw new RuntimeException("can't serialize byte[] from: " + cosObject.getObjectNumber()
                            + " " + cosObject.getGenerationNumber() + " obj: " + ex.getMessage(), ex);
                }
                stream.removeItem(COSName.FILTER);
                OutputStream streamOut = stream.createOutputStream(COSName.FLATE_DECODE);
                streamOut.write(bytes);
                streamOut.close();
            }
        }
        doc.getDocumentCatalog();
        doc.save(out);
    } finally {
        if (doc != null) {
            doc.close();
        }
    }
}

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

License:Apache License

/**
 * This method extracts images by going through all COSObjects pointed from xref table
 * @param is input stream containing PDF file
 * @param prefix output basename for images
 * @param password password for access to PDF if needed
 * @param pagesToProcess list of pages which should be processed if null given => processed all pages
 *      -- not working yet/*from   w  ww .  j  a v a2  s.  c  o  m*/
 * @param binarize -- enables processing of nonbitonal images as well (LZW is still not
 *      processed because of output with inverted colors)
 * @throws PdfRecompressionException if problem to extract images from PDF
 */
public void extractImagesUsingPdfParser(InputStream is, String prefix, String password,
        Set<Integer> pagesToProcess, Boolean binarize) throws PdfRecompressionException {
    // checking arguments and setting appropriate variables
    if (binarize == null) {
        binarize = false;
    }

    log.debug("Extracting images (binarize set to {})", binarize);

    InputStream inputStream = null;
    if (password != null) {
        try (ByteArrayOutputStream decryptedOutputStream = new ByteArrayOutputStream()) {
            PdfReader reader = new PdfReader(is, password.getBytes(StandardCharsets.UTF_8));
            PdfStamper stamper = new PdfStamper(reader, decryptedOutputStream);
            if (stamper != null) {
                stamper.close();
            }
            inputStream = new ByteArrayInputStream(decryptedOutputStream.toByteArray());
        } catch (DocumentException ex) {
            throw new PdfRecompressionException(ex);
        } catch (IOException ex) {
            throw new PdfRecompressionException("Reading file caused exception", ex);
        }
    } else {
        inputStream = is;
    }

    PDFParser parser = null;
    COSDocument doc = null;
    try {
        parser = new PDFParser(inputStream);
        parser.parse();
        doc = parser.getDocument();

        List<COSObject> objs = doc.getObjectsByType(COSName.XOBJECT);
        if (objs != null) {
            for (COSObject obj : objs) {
                COSBase subtype = obj.getItem(COSName.SUBTYPE);
                if (subtype.toString().equalsIgnoreCase("COSName{Image}")) {
                    COSBase imageObj = obj.getObject();
                    COSBase cosNameObj = obj.getItem(COSName.NAME);
                    String key;
                    if (cosNameObj != null) {
                        String cosNameKey = cosNameObj.toString();
                        int startOfKey = cosNameKey.indexOf("{") + 1;
                        key = cosNameKey.substring(startOfKey, cosNameKey.length() - 1);
                    } else {
                        key = "im0";
                    }
                    int objectNum = obj.getObjectNumber().intValue();
                    int genNum = obj.getGenerationNumber().intValue();
                    PDXObjectImage image = (PDXObjectImage) PDXObjectImage.createXObject(imageObj);

                    PDStream pdStr = new PDStream(image.getCOSStream());
                    List<COSName> filters = pdStr.getFilters();

                    log.debug("Detected image with color depth: {} bits", image.getBitsPerComponent());
                    if (filters == null) {
                        continue;
                    }
                    log.debug("Detected filters: {}", filters.toString());

                    if ((image.getBitsPerComponent() > 1) && (!binarize)) {
                        log.info("It is not a bitonal image => skipping");
                        continue;
                    }

                    // at this moment for preventing bad output (bad coloring) from LZWDecode filter
                    if (filters.contains(COSName.LZW_DECODE)) {
                        log.info("This is LZWDecoded => skipping");
                        continue;
                    }

                    if (filters.contains(COSName.FLATE_DECODE)) {
                        log.debug("FlateDecoded image detected");
                    }

                    if (filters.contains(COSName.JBIG2_DECODE)) {
                        if (skipJBig2Images) {
                            log.warn("Allready compressed according to JBIG2 standard => skipping");
                            continue;
                        } else {
                            log.debug("JBIG2 image detected");
                        }
                    }

                    // detection of unsupported filters by pdfBox library
                    if (filters.contains(COSName.JPX_DECODE)) {
                        log.warn("Unsupported filter JPXDecode => skipping");
                        continue;
                    }

                    String name = getUniqueFileName(prefix, image.getSuffix());
                    log.info("Writing image: {}", name);
                    image.write2file(name);

                    PdfImageInformation pdfImageInfo = new PdfImageInformation(key, image.getWidth(),
                            image.getHeight(), objectNum, genNum);
                    originalImageInformations.add(pdfImageInfo);

                    namesOfImages.add(name + "." + image.getSuffix());

                }
            }
        }
    } catch (IOException ex) {
        Tools.deleteFilesFromList(namesOfImages);
        throw new PdfRecompressionException("Unable to parse PDF document", ex);
    } catch (Exception ex) {
        Tools.deleteFilesFromList(namesOfImages);
    } finally {
        if (doc != null) {
            try {
                doc.close();
            } catch (IOException ex) {
                throw new PdfRecompressionException(ex);
            }
        }
    }
}

From source file:de.rototor.pdfbox.graphics2d.PdfBoxGraphics2D.java

License:Apache License

PdfBoxGraphics2D(PDDocument document, PDRectangle bbox, PdfBoxGraphics2D parentGfx) throws IOException {
    this.document = document;
    this.bbox = bbox;

    PDAppearanceStream appearance = new PDAppearanceStream(document);
    xFormObject = appearance;//from   w w w.  jav a2 s . c o m
    xFormObject.setResources(new PDResources());
    xFormObject.setBBox(bbox);
    contentStream = new PDPageContentStream(document, appearance,
            xFormObject.getStream().createOutputStream(COSName.FLATE_DECODE));
    contentStreamSaveState();

    if (parentGfx != null) {
        this.colorMapper = parentGfx.colorMapper;
        this.fontTextDrawer = parentGfx.fontTextDrawer;
        this.imageEncoder = parentGfx.imageEncoder;
        this.paintApplier = parentGfx.paintApplier;
    }

    baseTransform = new AffineTransform();
    baseTransform.translate(0, bbox.getHeight());
    baseTransform.scale(1, -1);

    calcImage = new BufferedImage(100, 100, BufferedImage.TYPE_4BYTE_ABGR);
    calcGfx = calcImage.createGraphics();
    font = calcGfx.getFont();
    copyInfo = null;

}

From source file:fi.nls.oskari.printout.printing.PDPageContentStream.java

License:Apache License

/**
 * Create a new PDPage content stream.//w  w  w .j  a  v  a2  s  .  co  m
 * 
 * @param document
 *            The document the page is part of.
 * @param sourcePage
 *            The page to write the contents to.
 * @param appendContent
 *            Indicates whether content will be overwritten. If false all
 *            previous content is deleted.
 * @param compress
 *            Tell if the content stream should compress the page contents.
 * @param resetContext
 *            Tell if the graphic context should be reseted.
 * @throws IOException
 *             If there is an error writing to the page contents.
 */
public PDPageContentStream(PDDocument document, PDPage sourcePage, boolean appendContent, boolean compress,
        boolean resetContext) throws IOException {

    page = sourcePage;
    resources = page.getResources();
    if (resources == null) {
        resources = new PDResources();
        page.setResources(resources);
    }

    // Get the pdstream from the source page instead of creating a new one
    PDStream contents = sourcePage.getContents();
    boolean hasContent = contents != null;

    // If request specifies the need to append to the document
    if (appendContent && hasContent) {

        // Create a pdstream to append new content
        PDStream contentsToAppend = new PDStream(document);

        // This will be the resulting COSStreamArray after existing and new
        // streams are merged
        COSStreamArray compoundStream = null;

        // If contents is already an array, a new stream is simply appended
        // to it
        if (contents.getStream() instanceof COSStreamArray) {
            compoundStream = (COSStreamArray) contents.getStream();
            compoundStream.appendStream(contentsToAppend.getStream());
        } else {
            // Creates the COSStreamArray and adds the current stream plus a
            // new one to it
            COSArray newArray = new COSArray();
            newArray.add(contents.getCOSObject());
            newArray.add(contentsToAppend.getCOSObject());
            compoundStream = new COSStreamArray(newArray);
        }

        if (compress) {
            List<COSName> filters = new ArrayList<COSName>();
            filters.add(COSName.FLATE_DECODE);
            contentsToAppend.setFilters(filters);
        }

        if (resetContext) {
            // create a new stream to encapsulate the existing stream
            PDStream saveGraphics = new PDStream(document);
            output = saveGraphics.createOutputStream();
            // save the initial/unmodified graphics context
            saveGraphicsState();
            close(); // ?
            if (compress) {
                List<COSName> filters = new ArrayList<COSName>();
                filters.add(COSName.FLATE_DECODE);
                saveGraphics.setFilters(filters);
            }
            // insert the new stream at the beginning
            compoundStream.insertCOSStream(saveGraphics);
        }

        // Sets the compoundStream as page contents
        sourcePage.setContents(new PDStream(compoundStream));
        output = contentsToAppend.createOutputStream();
        if (resetContext) {
            // restore the initial/unmodified graphics context
            restoreGraphicsState();
        }
    } else {
        if (hasContent) {
            LOG.warn("You are overwriting an existing content, you should use the append mode");
        }
        contents = new PDStream(document);
        if (compress) {
            List<COSName> filters = new ArrayList<COSName>();
            filters.add(COSName.FLATE_DECODE);
            contents.setFilters(filters);
        }
        sourcePage.setContents(contents);
        output = contents.createOutputStream();
    }
    formatDecimal.setMaximumFractionDigits(10);
    formatDecimal.setGroupingUsed(false);
}

From source file:pdfpicmangler.PDPng.java

License:Open Source License

/**
 * Construct from a stream.//from  w  w  w.  j a v a 2 s  .co m
 * 
 * @param doc The document to create the image as part of.
 * @param is The stream that contains the png data.
 * @throws IOException If there is an error reading the png data.
 */
public PDPng(PDDocument doc, InputStream is) throws IOException {
    super(doc, "png");

    System.out.println("reading in png");

    COSDictionary dic = getCOSStream();

    dic.setItem(COSName.SUBTYPE, COSName.IMAGE);
    //dic.setItem(COSName.TYPE, COSName.XOBJECT);

    data = getCOSStream().createFilteredStream();

    readPng(is);

    setWidth(imageWidth);
    setHeight(imageHeight);
    dic.setInt(COSName.BITS_PER_COMPONENT, bitDepth);

    if ((colorType & PNG_TYPE_PALETTE) != 0) {
        getCOSStream().setItem(COSName.COLORSPACE, paldata);
    } else if ((colorType & PNG_TYPE_COLOR) != 0) {
        setColorSpace(PDDeviceRGB.INSTANCE);
    } else {
        setColorSpace(new PDDeviceGray());
    }

    COSDictionary filterParams = new COSDictionary();
    filterParams.setInt(COSName.PREDICTOR, 15); // png adaptive predictor
    filterParams.setInt(COSName.COLORS,
            ((colorType & PNG_TYPE_COLOR) == 0 || (colorType & PNG_TYPE_PALETTE) != 0) ? 1 : 3);
    filterParams.setInt(COSName.BITS_PER_COMPONENT, bitDepth);
    filterParams.setInt(COSName.COLUMNS, imageWidth);
    filterParams.setDirect(true);

    dic.setItem(COSName.DECODE_PARMS, filterParams);
    dic.setItem(COSName.FILTER, COSName.FLATE_DECODE);

    dic.setInt(COSName.LENGTH, dataLen);
    dic.getDictionaryObject(COSName.LENGTH).setDirect(true);
}