Example usage for org.apache.pdfbox.cos COSDocument getStartXref

List of usage examples for org.apache.pdfbox.cos COSDocument getStartXref

Introduction

In this page you can find the example usage for org.apache.pdfbox.cos COSDocument getStartXref.

Prototype

public long getStartXref() 

Source Link

Document

Return the startXref Position of the parsed document.

Usage

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/* w  w  w.ja v  a2  s .co 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);
        }/*from  ww  w  . j  a v  a2s .co  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;
        }
    }
}