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

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

Introduction

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

Prototype

COSName PREV

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

Click Source Link

Usage

From source file:com.aaasec.sigserv.csspsupport.pdfbox.modifications.CsCOSWriter.java

License:Apache License

/**
 * This will write the trailer to the PDF document.
 *
 * @param doc The document to create the trailer for.
 *
 * @throws IOException If there is an IOError while writing the document.
 * @throws COSVisitorException If there is an error while generating the
 * data./*from  w ww  .  j  a  v  a  2  s .c o m*/
 */
protected void doWriteTrailer(COSDocument doc) throws IOException, COSVisitorException {
    getStandardOutput().write(TRAILER);
    getStandardOutput().writeEOL();

    COSDictionary trailer = doc.getTrailer();
    //sort xref, needed only if object keys not regenerated
    Collections.sort(getXRefEntries());
    COSWriterXRefEntry lastEntry = getXRefEntries().get(getXRefEntries().size() - 1);
    trailer.setInt(COSName.SIZE, (int) lastEntry.getKey().getNumber() + 1);
    // Only need to stay, if an incremental update will be performed
    if (!incrementalUpdate) {
        trailer.removeItem(COSName.PREV);
    }
    // Remove a checksum if present
    trailer.removeItem(COSName.DOC_CHECKSUM);

    trailer.accept(this);
}

From source file:com.aaasec.sigserv.csspsupport.pdfbox.modifications.CsCOSWriter.java

License:Apache License

/**
 * write the x ref section for the pdf file
 *
 * currently, the pdf is reconstructed from the scratch, so we write a
 * single section/* ww  w  . j a v a 2 s. c  o  m*/
 *
 * todo support for incremental writing?
 *
 * @param doc The document to write the xref from.
 *
 * @throws IOException If there is an error writing the data to the stream.
 */
protected void doWriteXRef(COSDocument doc) throws IOException {
    if (doc.isXRefStream()) {
        // sort xref, needed only if object keys not regenerated
        Collections.sort(getXRefEntries());
        COSWriterXRefEntry lastEntry = getXRefEntries().get(getXRefEntries().size() - 1);

        // remember the position where x ref is written
        setStartxref(getStandardOutput().getPos());
        //
        getStandardOutput().write(XREF);
        getStandardOutput().writeEOL();
        // write start object number and object count for this x ref section
        // we assume starting from scratch
        writeXrefRange(0, lastEntry.getKey().getNumber() + 1);
        // write initial start object with ref to first deleted object and magic generation number
        writeXrefEntry(COSWriterXRefEntry.getNullEntry());
        // write entry for every object
        long lastObjectNumber = 0;
        for (Iterator<COSWriterXRefEntry> i = getXRefEntries().iterator(); i.hasNext();) {
            COSWriterXRefEntry entry = i.next();
            while (lastObjectNumber < entry.getKey().getNumber() - 1) {
                writeXrefEntry(COSWriterXRefEntry.getNullEntry());
            }
            lastObjectNumber = entry.getKey().getNumber();
            writeXrefEntry(entry);
        }
    } else {

        COSDictionary trailer = doc.getTrailer();
        trailer.setLong(COSName.PREV, doc.getStartXref());
        addXRefEntry(COSWriterXRefEntry.getNullEntry());

        // sort xref, needed only if object keys not regenerated
        Collections.sort(getXRefEntries());

        // remember the position where x ref was written
        setStartxref(getStandardOutput().getPos());

        getStandardOutput().write(XREF);
        getStandardOutput().writeEOL();
        // write start object number and object count for this x ref section
        // we assume starting from scratch

        Integer[] xRefRanges = getXRefRanges(getXRefEntries());
        int xRefLength = xRefRanges.length;
        int x = 0;
        int j = 0;
        while (x < xRefLength && (xRefLength % 2) == 0) {
            writeXrefRange(xRefRanges[x], xRefRanges[x + 1]);

            for (int i = 0; i < xRefRanges[x + 1]; ++i) {
                writeXrefEntry(xRefEntries.get(j++));
            }
            x += 2;
        }
    }
}

From source file:com.aaasec.sigserv.csspsupport.pdfbox.modifications.CsCOSWriter.java

License:Apache License

private void doWriteXRefInc(COSDocument doc, long hybridPrev) throws IOException, COSVisitorException {
    if (doc.isXRefStream() || hybridPrev != -1) {
        // the file uses XrefStreams, so we need to update
        // it with an xref stream. We create a new one and fill it
        // with data available here
        // first set an entry for the null entry in the xref table
        // this is probably not necessary
        // addXRefEntry(COSWriterXRefEntry.getNullEntry());

        // create a new XRefStrema object
        PDFXRefStream pdfxRefStream = new PDFXRefStream();

        // add all entries from the incremental update.
        List<COSWriterXRefEntry> xRefEntries2 = getXRefEntries();
        for (COSWriterXRefEntry cosWriterXRefEntry : xRefEntries2) {
            pdfxRefStream.addEntry(cosWriterXRefEntry);
        }/*  ww w .  j av  a  2  s .  c  o  m*/

        COSDictionary trailer = doc.getTrailer();
        //            trailer.setLong(COSName.PREV, hybridPrev == -1 ? prev : hybridPrev);
        trailer.setLong(COSName.PREV, doc.getStartXref());

        pdfxRefStream.addTrailerInfo(trailer);
        // the size is the highest object number+1. we add one more
        // for the xref stream object we are going to write
        pdfxRefStream.setSize(getNumber() + 2);

        setStartxref(getStandardOutput().getPos());
        COSStream stream2 = pdfxRefStream.getStream();
        doWriteObject(stream2);
    }

    if (!doc.isXRefStream() || hybridPrev != -1) {
        COSDictionary trailer = doc.getTrailer();
        trailer.setLong(COSName.PREV, doc.getStartXref());
        if (hybridPrev != -1) {
            COSName xrefStm = COSName.XREF_STM;
            trailer.removeItem(xrefStm);
            trailer.setLong(xrefStm, getStartxref());
        }
        addXRefEntry(COSWriterXRefEntry.getNullEntry());

        // sort xref, needed only if object keys not regenerated
        Collections.sort(getXRefEntries());

        // remember the position where x ref was written
        setStartxref(getStandardOutput().getPos());

        getStandardOutput().write(XREF);
        getStandardOutput().writeEOL();
        // write start object number and object count for this x ref section
        // we assume starting from scratch

        Integer[] xRefRanges = getXRefRanges(getXRefEntries());
        int xRefLength = xRefRanges.length;
        int x = 0;
        int j = 0;
        while (x < xRefLength && (xRefLength % 2) == 0) {
            writeXrefRange(xRefRanges[x], xRefRanges[x + 1]);

            for (int i = 0; i < xRefRanges[x + 1]; ++i) {
                writeXrefEntry(xRefEntries.get(j++));
            }
            x += 2;
        }
    }
}