private static void appendSyntaxString(PdfIndirectReference reference) { stringBuilder .append(reference.getObjNumber()) .append(" ") .append(reference.getGenNumber()) .append(" R"); }
/** * Adds indirect reference to list of indirect objects. * * @param reference indirect reference to add. */ public PdfIndirectReference add(PdfIndirectReference reference) { if (reference == null) { return null; } int objNr = reference.getObjNumber(); this.count = Math.max(this.count, objNr); ensureCount(objNr); xref[objNr] = reference; return reference; }
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); }
/** * Processes an object. If the object is indirect, it is added to the * list of resources. If not, it is just processed. * * @param obj the object to process */ protected final void process(PdfObject obj) { PdfIndirectReference ref = obj.getIndirectReference(); if (ref == null) { loopOver(obj); } else if (!resources.containsKey(ref.getObjNumber())) { resources.put(ref.getObjNumber(), obj); loopOver(obj); } }
IndirectRefDescription(PdfIndirectReference reference) { this.docId = reference.getDocument().getDocumentId(); this.objNr = reference.getObjNumber(); this.genNr = reference.getGenNumber(); }
/** * Getter for the object number in case the object is indirect or if it is reference. * * @return -1 for direct objects; the object number for indirect objects */ public int getNumber() { if (isIndirect() && object.getIndirectReference() != null) { return object.getIndirectReference().getObjNumber(); } if (isIndirectReference()) { return ((PdfIndirectReference) object).getObjNumber(); } return number; }
void addNewIndirectObject(PdfObject object) { object.makeIndirect(document); ++n; int idx = size(); idxToRef.put(idx, object.getIndirectReference().getObjNumber()); refToIdx.put(object.getIndirectReference().getObjNumber(), idx); objects.add(object); LoggerHelper.info("New indirect object was successfully created. Its object number is: " + object.getIndirectReference().getObjNumber(), getClass()); } }
/** * Creates an xml node that describes a direct path stored in this ObjectPath instance. * * @param document xml document, to which this xml node will be added. * @return an xml node describing direct path. */ public Node toXmlNode(Document document) { Element element = document.createElement("path"); Element baseNode = document.createElement("base"); baseNode.setAttribute("cmp", MessageFormatUtil.format("{0} {1} obj", baseCmpObject.getObjNumber(), baseCmpObject.getGenNumber())); baseNode.setAttribute("out", MessageFormatUtil.format("{0} {1} obj", baseOutObject.getObjNumber(), baseOutObject.getGenNumber())); element.appendChild(baseNode); Stack<LocalPathItem> pathClone = (Stack<LocalPathItem>) path.clone(); List<LocalPathItem> localPathItems = new ArrayList<>(path.size()); for (int i = 0; i < path.size(); ++i) { localPathItems.add(pathClone.pop()); } for (int i = localPathItems.size() - 1; i >= 0; --i) { element.appendChild(localPathItems.get(i).toXmlNode(document)); } return element; }
private String composeExceptionBasedOnNamespacePresence(String role, PdfNamespace namespace, String withoutNsEx, String withNsEx) { if (namespace == null) { return MessageFormat.format(withoutNsEx, role); } else { String nsName = namespace.getNamespaceName(); PdfIndirectReference ref = namespace.getPdfObject().getIndirectReference(); if (ref != null) { nsName = nsName + " (" + Integer.toString(ref.getObjNumber()) + " " + Integer.toString(ref.getGenNumber()) + " obj)"; } return MessageFormat.format(withNsEx, role, nsName); } } }
public void addNewIndirectObject(PdfObject object) { objects.addNewIndirectObject(object); nodes.add(PdfObjectTreeNode.getInstance(object, object.getIndirectReference().getObjNumber())); LoggerHelper.info("Tree node was successfully created for new indirect object", getClass()); } }
/** * Creates a {@link PdfFont} object by a font dictionary. The font may have been cached in case it is an indirect object. * * @param fontDict * @return the font */ protected PdfFont getFont(PdfDictionary fontDict) { if (fontDict.getIndirectReference() == null) { return PdfFontFactory.createFont(fontDict); } else { int n = fontDict.getIndirectReference().getObjNumber(); WeakReference<PdfFont> fontRef = cachedFonts.get(n); PdfFont font = (PdfFont) (fontRef == null ? null : fontRef.get()); if (font == null) { font = PdfFontFactory.createFont(fontDict); cachedFonts.put(n, new WeakReference<>(font)); } return font; } }
protected void associateIfIndirect(PdfObjectTreeNode node) { PdfIndirectReference ref = null; if (node != null && node.getPdfObject() != null) { ref = node.getPdfObject().getIndirectReference(); } if (ref != null) { int idx = objects.getIndexByRef(ref.getObjNumber()); nodes.set(idx, node); } }
private static void deleteOldReferences(PdfArray all, PdfArray toDelete) { if (all == null || toDelete == null) return; for (PdfObject pi : toDelete) { PdfIndirectReference pir = pi.getIndirectReference(); if (pir == null) { continue; } for (int k = 0; k < all.size(); ++k) { PdfIndirectReference pod = all.get(k).getIndirectReference(); if (pod == null) { continue; } if (pir.getObjNumber() == pod.getObjNumber()) { all.remove(k); --k; } } } }
private static void deleteOldReferences(PdfArray all, PdfArray toDelete) { if (all == null || toDelete == null) return; for (PdfObject pi : toDelete) { PdfIndirectReference pir = pi.getIndirectReference(); if (pir == null) { continue; } for (int k = 0; k < all.size(); ++k) { PdfIndirectReference pod = all.get(k).getIndirectReference(); if (pod == null) { continue; } if (pir.getObjNumber() == pod.getObjNumber()) { all.remove(k); --k; } } } }
@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)); }
private void write(PdfIndirectReference indirectReference) { if (document != null && !indirectReference.getDocument().equals(document)) { throw new PdfException(PdfException.PdfIndirectObjectBelongsToOtherPdfDocument); } if (indirectReference.isFree()) { Logger logger = LoggerFactory.getLogger(PdfOutputStream.class); logger.error(LogMessageConstant.FLUSHED_OBJECT_CONTAINS_FREE_REFERENCE); write(PdfNull.PDF_NULL); } else if (indirectReference.getRefersTo() == null) { Logger logger = LoggerFactory.getLogger(PdfOutputStream.class); logger.error(LogMessageConstant.FLUSHED_OBJECT_CONTAINS_REFERENCE_WHICH_NOT_REFER_TO_ANY_OBJECT); write(PdfNull.PDF_NULL); } else if (indirectReference.getGenNumber() == 0) { writeInteger(indirectReference.getObjNumber()). writeBytes(endIndirectWithZeroGenNr); } else { writeInteger(indirectReference.getObjNumber()). writeSpace(). writeInteger(indirectReference.getGenNumber()). writeBytes(endIndirect); } }
/** * Writes object to body of PDF document. * * @param pdfObj object to write. * @throws IOException */ protected void writeToBody(PdfObject pdfObj) throws IOException { if (crypto != null) { crypto.setHashKeyForNextObject(pdfObj.getIndirectReference().getObjNumber(), pdfObj.getIndirectReference().getGenNumber()); } writeInteger(pdfObj.getIndirectReference().getObjNumber()). writeSpace(). writeInteger(pdfObj.getIndirectReference().getGenNumber()).writeBytes(obj); write(pdfObj); writeBytes(endobj); }
public void expand(PdfIndirectReference ref, PdfDictionary dict) { if (dict == null) return; if (PdfName.Pages.equals(dict.getAsName(PdfName.Type))) { PdfArray kids = dict.getAsArray(PdfName.Kids); if (kids != null) { for (int i = 0; i < kids.size(); i++) { expand((PdfIndirectReference) kids.get(i, false), kids.getAsDictionary(i)); } } } else if (PdfName.Page.equals(dict.getAsName(PdfName.Type))) { pages.add((PdfPageTreeNode) factory.getNode(ref.getObjNumber())); } } }
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; }
/** * Adds object to the object stream. * * @param object object to add. */ public void addObject(PdfObject object) { if (size.intValue() == MAX_OBJ_STREAM_SIZE) { throw new PdfException(PdfException.PdfObjectStreamReachMaxSize); } PdfOutputStream outputStream = getOutputStream(); indexStream.writeInteger(object.getIndirectReference().getObjNumber()). writeSpace(). writeLong(outputStream.getCurrentPos()). writeSpace(); outputStream.write(object); object.getIndirectReference().setObjStreamNumber(getIndirectReference().getObjNumber()); object.getIndirectReference().setIndex(size.intValue()); outputStream.writeSpace(); size.increment(); getAsNumber(PdfName.First).setValue(indexStream.getCurrentPos()); }