/** * Checks if this {@link PdfIndirectReference} instance corresponds to free indirect reference. * Indirect reference might be in a free state either because it was read as such from the opened existing * PDF document or because it was set free via {@link PdfIndirectReference#setFree()} method. * @return {@code true} if this {@link PdfIndirectReference} is free, {@code false} otherwise. */ public boolean isFree() { return checkState(FREE); }
/** * Indicates is the object has been flushed or not. * * @return true if object has been flushed, otherwise false. */ public boolean isFlushed() { PdfIndirectReference indirectReference = getIndirectReference(); return (indirectReference != null && indirectReference.checkState(FLUSHED)); }
/** * Indicates is the object has been set as modified or not. Useful for incremental updates (e.g. appendMode). * * @return true is object has been set as modified, otherwise false. */ public boolean isModified() { PdfIndirectReference indirectReference = getIndirectReference(); return (indirectReference != null && indirectReference.checkState(MODIFIED)); }
@Override public String toString() { StringBuilder states = new StringBuilder(" "); if (checkState(FREE)) { states.append("Free; "); } if (checkState(MODIFIED)) { states.append("Modified; "); } if (checkState(MUST_BE_FLUSHED)) { states.append("MustBeFlushed; "); } if (checkState(READING)) { states.append("Reading; "); } if (checkState(FLUSHED)) { states.append("Flushed; "); } if (checkState(ORIGINAL_OBJECT_STREAM)) { states.append("OriginalObjectStream; "); } if (checkState(FORBID_RELEASE)) { states.append("ForbidRelease; "); } if (checkState(READ_ONLY)) { states.append("ReadOnly; "); } return MessageFormatUtil.format("{0} {1} R{2}", Integer.toString(getObjNumber()), Integer.toString(getGenNumber()), states.substring(0, states.length() - 1)); }
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++; } }
public void release() { // In case ForbidRelease flag is set, release will not be performed. if (isReleaseForbidden()) { Logger logger = LoggerFactory.getLogger(PdfObject.class); logger.warn(LogMessageConstant.FORBID_RELEASE_IS_SET); } else { if (indirectReference != null && indirectReference.getReader() != null && !indirectReference.checkState(FLUSHED)) { indirectReference.refersTo = null; indirectReference = null; setState(READ_ONLY); } //TODO log reasonless call of method } }
PdfIndirectReference reference = xref[i]; if (document.properties.appendMode && reference != null && (!reference.checkState(PdfObject.MODIFIED) || dropObjectsFromObjectStream && reference.getObjStreamNumber() != 0)) { reference = null;
/** * Gets direct object and try to resolve indirects chain. * <p> * Note: If chain of references has length of more than 32, * this method return 31st reference in chain. * </p> */ public PdfObject getRefersTo(boolean recursively) { if (!recursively) { if (refersTo == null && !checkState(FLUSHED) && !checkState(MODIFIED) && !checkState(FREE) && getReader() != null) { refersTo = getReader().readObject(this); } return refersTo; } else { PdfObject currentRefersTo = getRefersTo(false); for (int i = 0; i < LENGTH_OF_INDIRECTS_CHAIN; i++) { if (currentRefersTo instanceof PdfIndirectReference) currentRefersTo = ((PdfIndirectReference) currentRefersTo).getRefersTo(false); else break; } return currentRefersTo; } }
/** * Flushes all modified objects which have not been flushed yet. Used in case incremental updates. * @param forbiddenToFlush {@link Set<PdfIndirectReference>} of references that are forbidden to be flushed automatically. */ protected void flushModifiedWaitingObjects(Set<PdfIndirectReference> forbiddenToFlush) { PdfXrefTable xref = document.getXref(); for (int i = 1; i < xref.size(); i++) { PdfIndirectReference indirectReference = xref.get(i); if (null != indirectReference && !indirectReference.isFree() && !forbiddenToFlush.contains(indirectReference)) { boolean isModified = indirectReference.checkState(PdfObject.MODIFIED); if (isModified) { PdfObject obj = indirectReference.getRefersTo(false); if (obj != null) { if (!obj.equals(objectStream)) { obj.flush(); } } } } } if (objectStream != null && objectStream.getSize() > 0) { objectStream.flush(); objectStream = null; } }
/** * Flushes all objects which have not been flushed yet. * @param forbiddenToFlush {@link Set<PdfIndirectReference>} of references that are forbidden to be flushed automatically. */ protected void flushWaitingObjects(Set<PdfIndirectReference> forbiddenToFlush) { PdfXrefTable xref = document.getXref(); boolean needFlush = true; while (needFlush) { needFlush = false; for (int i = 1; i < xref.size(); i++) { PdfIndirectReference indirectReference = xref.get(i); if (indirectReference != null && !indirectReference.isFree() && indirectReference.checkState(PdfObject.MUST_BE_FLUSHED) && !forbiddenToFlush.contains(indirectReference)) { PdfObject obj = indirectReference.getRefersTo(false); if (obj != null) { obj.flush(); needFlush = true; } } } } if (objectStream != null && objectStream.getSize() > 0) { objectStream.flush(); objectStream = null; } }
protected void flushFonts() { if (properties.appendMode) { for (PdfFont font : getDocumentFonts()) { if (font.getPdfObject().checkState(PdfObject.MUST_BE_INDIRECT) || font.getPdfObject().getIndirectReference().checkState(PdfObject.MODIFIED)) { font.flush(); } } } else { for (PdfFont font : getDocumentFonts()) { font.flush(); } } }
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); } } } }
PdfIndirectReference indirectReference = xref.get(i); if (indirectReference != null && !indirectReference.isFree() && indirectReference.checkState(PdfObject.MODIFIED) && !indirectReference.checkState(PdfObject.FLUSHED) && !forbiddenToFlush.contains(indirectReference)) { indirectReference.setFree(); for (int i = 0; i < xref.size(); i++) { PdfIndirectReference indirectReference = xref.get(i); if (indirectReference != null && !indirectReference.isFree() && !indirectReference.checkState(PdfObject.FLUSHED) && !forbiddenToFlush.contains(indirectReference)) { PdfObject object; if (isFlushUnusedObjects() && !indirectReference.checkState(PdfObject.ORIGINAL_OBJECT_STREAM) && (object = indirectReference.getRefersTo(false)) != null) { object.flush(); } else {
boolean refReadingState = reference != null && reference.checkState(PdfObject.READING) && reference.getGenNumber() == gen; boolean refFirstEncountered = reference == null } else if (reference.checkState(PdfObject.READING) && reference.getGenNumber() == gen) { reference.setOffset(pos); reference.clearState(PdfObject.READING);
boolean refReadingState = reference != null && reference.checkState(PdfObject.READING) && reference.getGenNumber() == newReference.getGenNumber(); boolean refFirstEncountered = reference == null