public PdfXrefTable(int capacity) { if (capacity < 1) { capacity = INITIAL_CAPACITY; } xref = new PdfIndirectReference[capacity]; freeReferencesLinkedList = new TreeMap<>(); add((PdfIndirectReference) new PdfIndirectReference(null, 0, MAX_GENERATION, 0).setState(PdfObject.FREE)); }
/** * Sets the 'modified' flag to the indirect object, the flag denotes that the object was modified since the document opening. * <p> * This flag is meaningful only if the {@link PdfDocument} is opened in append mode * (see {@link StampingProperties#useAppendMode()}). * </p> * <p> * In append mode the whole document is preserved as is, and only changes to the document are * appended to the end of the document file. Because of this, only modified objects need to be flushed and are * allowed to be flushed (i.e. to be written). * </p> * * @return this {@link PdfObject} instance. */ public PdfObject setModified() { if (indirectReference != null) { indirectReference.setState(MODIFIED); setState(FORBID_RELEASE); } return this; }
/** * Mark an object with {@link PdfObject#MUST_BE_FLUSHED}. * * @param pdfObject an object to mark. */ protected void markObjectAsMustBeFlushed(PdfObject pdfObject) { if (pdfObject.getIndirectReference() != null) { pdfObject.getIndirectReference().setState(PdfObject.MUST_BE_FLUSHED); } }
PdfIndirectReference createNewIndirectReference(PdfDocument document) { PdfIndirectReference reference = new PdfIndirectReference(document, ++count); add(reference); return (PdfIndirectReference) reference.setState(PdfObject.MODIFIED); }
/** * Creates next available indirect reference. * * @return created indirect reference. */ protected PdfIndirectReference createNextIndirectReference(PdfDocument document) { PdfIndirectReference reference = new PdfIndirectReference(document, ++count); add(reference); return (PdfIndirectReference) reference.setState(PdfObject.MODIFIED); }
private void appendNewRefToFreeList(PdfIndirectReference reference) { reference.setOffset(0); if (freeReferencesLinkedList.<Integer, PdfIndirectReference>isEmpty()) { assert false; // free references list is not initialized yet return; } PdfIndirectReference lastFreeRef = freeReferencesLinkedList.get(0); ((PdfIndirectReference) lastFreeRef.setState(PdfObject.MODIFIED)).setOffset(reference.getObjNumber()); freeReferencesLinkedList.put(reference.getObjNumber(), lastFreeRef); freeReferencesLinkedList.put(0, reference); }
protected void freeReference(PdfIndirectReference reference) { if (reference.isFree()) { return; } if (reference.checkState(PdfObject.MUST_BE_FLUSHED)) { Logger logger = LoggerFactory.getLogger(PdfXrefTable.class); logger.error(LogMessageConstant.INDIRECT_REFERENCE_USED_IN_FLUSHED_OBJECT_MADE_FREE); return; } if (reference.checkState(PdfObject.FLUSHED)) { Logger logger = LoggerFactory.getLogger(PdfXrefTable.class); logger.error(LogMessageConstant.ALREADY_FLUSHED_INDIRECT_OBJECT_MADE_FREE); return; } reference.setState(PdfObject.FREE).setState(PdfObject.MODIFIED); appendNewRefToFreeList(reference); if (reference.getGenNumber() < MAX_GENERATION) { reference.genNr++; } }
void initFreeReferencesList(PdfDocument pdfDocument) { freeReferencesLinkedList.clear(); xref[0].setState(PdfObject.FREE); // ensure zero object is free TreeSet<Integer> freeReferences = new TreeSet<>(); for (int i = 1; i < size(); ++i) { continue; xref[next] = (PdfIndirectReference) new PdfIndirectReference(pdfDocument, next, 0).setState(PdfObject.FREE).setState(PdfObject.MODIFIED); } else if (xref[next].getGenNumber() == MAX_GENERATION && xref[next].getOffset() == 0) { continue; ((PdfIndirectReference) prevFreeRef.setState(PdfObject.MODIFIED)).setOffset(next); ((PdfIndirectReference) prevFreeRef.setState(PdfObject.MODIFIED)).setOffset(0);
if (prevFreeRef != null) { freeReferencesLinkedList.put((int) freeRef.getOffset(), prevFreeRef); ((PdfIndirectReference) prevFreeRef.setState(PdfObject.MODIFIED)).setOffset(freeRef.getOffset());
protected PdfObject readReference(boolean readAsDirect) { int num = tokens.getObjNr(); PdfXrefTable table = pdfDocument.getXref(); PdfIndirectReference reference = table.get(num); if (reference != null) { if (reference.isFree()) { Logger logger = LoggerFactory.getLogger(PdfReader.class); logger.warn(MessageFormatUtil.format(LogMessageConstant.INVALID_INDIRECT_REFERENCE, tokens.getObjNr(), tokens.getGenNr())); return createPdfNullInstance(readAsDirect); } if (reference.getGenNumber() != tokens.getGenNr()) { if (fixedXref) { Logger logger = LoggerFactory.getLogger(PdfReader.class); logger.warn(MessageFormatUtil.format(LogMessageConstant.INVALID_INDIRECT_REFERENCE, tokens.getObjNr(), tokens.getGenNr())); return createPdfNullInstance(readAsDirect); } else { throw new PdfException(PdfException.InvalidIndirectReference1, MessageFormatUtil.format("{0} {1} R", reference.getObjNumber(), reference.getGenNumber())); } } } else { reference = table.add((PdfIndirectReference) new PdfIndirectReference(pdfDocument, num, tokens.getGenNr(), 0).setState(PdfObject.READING)); } return reference; }
private void markObjectToFlush(PdfObject pdfObject) { if (pdfObject != null) { PdfIndirectReference indirectReference = pdfObject.getIndirectReference(); if (indirectReference != null) { if (!indirectReference.checkState(PdfObject.FLUSHED)) { indirectReference.setState(PdfObject.MUST_BE_FLUSHED); } } else { if (pdfObject.getType() == PdfObject.INDIRECT_REFERENCE) { if (!pdfObject.checkState(PdfObject.FLUSHED)) { pdfObject.setState(PdfObject.MUST_BE_FLUSHED); } } else if (pdfObject.getType() == PdfObject.ARRAY) { markArrayContentToFlush((PdfArray) pdfObject); } else if (pdfObject.getType() == PdfObject.DICTIONARY) { markDictionaryContentToFlush((PdfDictionary) pdfObject); } } } }
writeToBody(pdfObject); indirectReference.setState(PdfObject.FLUSHED).clearState(PdfObject.MUST_BE_FLUSHED); switch (pdfObject.getType()) { case PdfObject.BOOLEAN:
objectStream.getIndirectReference().setState(PdfObject.ORIGINAL_OBJECT_STREAM); } finally { tokens = saveTokens;
reference.setState(PdfObject.FREE);
switch (type) { case 0: newReference = (PdfIndirectReference) new PdfIndirectReference(pdfDocument, base, field3, field2).setState(PdfObject.FREE); break; case 1: