public static PdfObject getDirectObject(PdfObject object) { if (object == null) return null; while (object.isIndirect()) object = PdfReader.getPdfObjectRelease(object); return object; }
public static PdfObject getDirectObject(PdfObject object) { if (object == null) return null; while (object.isIndirect()) object = PdfReader.getPdfObjectRelease(object); return object; }
/** * Returns a <CODE>PdfObject</CODE> as a <CODE>PdfIndirectReference</CODE>. * * The object associated with the <CODE>PdfName</CODE> given is retrieved * If it is a <CODE>PdfIndirectReference</CODE>, it is cast down and returned * as such. Otherwise <CODE>null</CODE> is returned. * * @param key A <CODE>PdfName</CODE> * @return the associated <CODE>PdfIndirectReference</CODE> object, * or <CODE>null</CODE> */ public PdfIndirectReference getAsIndirectObject(final PdfName key) { PdfIndirectReference ref = null; PdfObject orig = get(key); // not getDirect this time. if (orig != null && orig.isIndirect()) ref = (PdfIndirectReference) orig; return ref; } }
/** * Returns a <CODE>PdfObject</CODE> as a <CODE>PdfIndirectReference</CODE>. * * The object associated with the <CODE>PdfName</CODE> given is retrieved * If it is a <CODE>PdfIndirectReference</CODE>, it is cast down and returned * as such. Otherwise <CODE>null</CODE> is returned. * * @param key A <CODE>PdfName</CODE> * @return the associated <CODE>PdfIndirectReference</CODE> object, * or <CODE>null</CODE> */ public PdfIndirectReference getAsIndirectObject(final PdfName key) { PdfIndirectReference ref = null; PdfObject orig = get(key); // not getDirect this time. if (orig != null && orig.isIndirect()) ref = (PdfIndirectReference) orig; return ref; } }
/** * @param obj */ public static void releaseLastXrefPartial(final PdfObject obj) { if (obj == null) return; if (!obj.isIndirect()) return; if (!(obj instanceof PRIndirectReference)) return; PRIndirectReference ref = (PRIndirectReference)obj; PdfReader reader = ref.getReader(); if (reader.partial && reader.lastXrefPartial != -1 && reader.lastXrefPartial == ref.getNumber()) { reader.xrefObj.set(reader.lastXrefPartial, null); } reader.lastXrefPartial = -1; }
/** * @param obj */ public static void releaseLastXrefPartial(final PdfObject obj) { if (obj == null) return; if (!obj.isIndirect()) return; if (!(obj instanceof PRIndirectReference)) return; PRIndirectReference ref = (PRIndirectReference)obj; PdfReader reader = ref.getReader(); if (reader.partial && reader.lastXrefPartial != -1 && reader.lastXrefPartial == ref.getNumber()) { reader.xrefObj.set(reader.lastXrefPartial, null); } reader.lastXrefPartial = -1; }
/** * Add kid to structureTreeRoot from structTreeRoot */ protected void attachStructTreeRootKids(PdfObject firstNotNullKid) throws IOException, BadPdfFormatException { PdfObject structKids = structTreeRoot.get(PdfName.K); if (structKids == null || (!structKids.isArray() && !structKids.isIndirect())) { // incorrect syntax of tags addKid(structureTreeRoot, firstNotNullKid); } else { if (structKids.isIndirect()) { addKid(structKids); } else { //structKids.isArray() for (PdfObject kid: (PdfArray)structKids) addKid(kid); } } }
/** * Add kid to structureTreeRoot from structTreeRoot */ protected void attachStructTreeRootKids(PdfObject firstNotNullKid) throws IOException, BadPdfFormatException { PdfObject structKids = structTreeRoot.get(PdfName.K); if (structKids == null || (!structKids.isArray() && !structKids.isIndirect())) { // incorrect syntax of tags addKid(structureTreeRoot, firstNotNullKid); } else { if (structKids.isIndirect()) { addKid(structKids); } else { //structKids.isArray() for (PdfObject kid: (PdfArray)structKids) addKid(kid); } } }
private void addKid(PdfObject obj) throws IOException, BadPdfFormatException { if (!obj.isIndirect()) return; PRIndirectReference currRef = (PRIndirectReference)obj; RefKey key = new RefKey(currRef); if (!writer.indirects.containsKey(key)) { writer.copyIndirect(currRef, true, false); } PdfIndirectReference newKid = writer.indirects.get(key).getRef(); if (writer.updateRootKids) { addKid(structureTreeRoot, newKid); writer.structureTreeRootKidsForReaderImported(reader); } }
private void addKid(PdfObject obj) throws IOException, BadPdfFormatException { if (!obj.isIndirect()) return; PRIndirectReference currRef = (PRIndirectReference)obj; RefKey key = new RefKey(currRef); if (!writer.indirects.containsKey(key)) { writer.copyIndirect(currRef, true, false); } PdfIndirectReference newKid = writer.indirects.get(key).getRef(); if (writer.updateRootKids) { addKid(structureTreeRoot, newKid); writer.structureTreeRootKidsForReaderImported(reader); } }
private static void deleteOldReferences(PdfArray all, PdfArray toDelete) { if (all == null || toDelete == null) return; for (PdfObject pi : toDelete) { if (!pi.isIndirect()) continue; PRIndirectReference pir = (PRIndirectReference)pi; for (int k = 0; k < all.size(); ++k) { PdfObject po = all.getPdfObject(k); if (!po.isIndirect()) continue; PRIndirectReference pod = (PRIndirectReference)po; if (pir.getNumber() == pod.getNumber()) { all.remove(k); --k; } } } }
private static void deleteOldReferences(PdfArray all, PdfArray toDelete) { if (all == null || toDelete == null) return; for (PdfObject pi : toDelete) { if (!pi.isIndirect()) continue; PRIndirectReference pir = (PRIndirectReference)pi; for (int k = 0; k < all.size(); ++k) { PdfObject po = all.getPdfObject(k); if (!po.isIndirect()) continue; PRIndirectReference pod = (PRIndirectReference)po; if (pir.getNumber() == pod.getNumber()) { all.remove(k); --k; } } } }
private int removeRefFromArray(PdfArray array, PdfObject refo) { if (refo == null || !refo.isIndirect()) return array.size(); PdfIndirectReference ref = (PdfIndirectReference)refo; for (int j = 0; j < array.size(); ++j) { PdfObject obj = array.getPdfObject(j); if (!obj.isIndirect()) continue; if (((PdfIndirectReference)obj).getNumber() == ref.getNumber()) array.remove(j--); } return array.size(); }
private int removeRefFromArray(PdfArray array, PdfObject refo) { if (refo == null || !refo.isIndirect()) return array.size(); PdfIndirectReference ref = (PdfIndirectReference)refo; for (int j = 0; j < array.size(); ++j) { PdfObject obj = array.getPdfObject(j); if (!obj.isIndirect()) continue; if (((PdfIndirectReference)obj).getNumber() == ref.getNumber()) array.remove(j--); } return array.size(); }
/** * Eliminates the reference to the object freeing the memory used by it and clearing * the xref entry. * @param obj the object. If it's an indirect reference it will be eliminated * @return the object or the already erased dereferenced object */ public static PdfObject killIndirect(final PdfObject obj) { if (obj == null || obj.isNull()) return null; PdfObject ret = getPdfObjectRelease(obj); if (obj.isIndirect()) { PRIndirectReference ref = (PRIndirectReference)obj; PdfReader reader = ref.getReader(); int n = ref.getNumber(); reader.xrefObj.set(n, null); if (reader.partial) reader.xref[n * 2] = -1; } return ret; }
private void serDic(PdfDictionary dic, int level, ByteBuffer bb, HashMap<RefKey, Integer> serialized) throws IOException { bb.append("$D"); if (level <= 0) return; Object[] keys = dic.getKeys().toArray(); Arrays.sort(keys); for (int k = 0; k < keys.length; ++k) { if(keys[k].equals(PdfName.P) &&(dic.get((PdfName)keys[k]).isIndirect() || dic.get((PdfName)keys[k]).isDictionary())) // ignore recursive call continue; serObject((PdfObject) keys[k], level, bb, serialized); serObject(dic.get((PdfName) keys[k]), level, bb, serialized); } }
private void serDic(PdfDictionary dic, int level, ByteBuffer bb, HashMap<RefKey, Integer> serialized) throws IOException { bb.append("$D"); if (level <= 0) return; Object[] keys = dic.getKeys().toArray(); Arrays.sort(keys); for (int k = 0; k < keys.length; ++k) { if(keys[k].equals(PdfName.P) &&(dic.get((PdfName)keys[k]).isIndirect() || dic.get((PdfName)keys[k]).isDictionary())) // ignore recursive call continue; serObject((PdfObject) keys[k], level, bb, serialized); serObject(dic.get((PdfName) keys[k]), level, bb, serialized); } }
protected PdfObject getDirectObject(PdfObject obj) { if (obj == null) return null; // use counter to prevent indirect reference cycling int count = 0; // resolve references while (obj instanceof PdfIndirectReference) { PdfObject curr; if (obj.isIndirect()) curr = PdfReader.getPdfObject(obj); else curr = getObjectFromCache(new RefKey((PdfIndirectReference) obj)); if (curr == null) break; obj = curr; //10 - is max allowed reference chain if (count++ > 10) break; } return obj; }
private void updateCalculationOrder(PdfReader reader) { PdfDictionary catalog = reader.getCatalog(); PdfDictionary acro = catalog.getAsDict(PdfName.ACROFORM); if (acro == null) return; PdfArray co = acro.getAsArray(PdfName.CO); if (co == null || co.size() == 0) return; AcroFields af = reader.getAcroFields(); for (int k = 0; k < co.size(); ++k) { PdfObject obj = co.getPdfObject(k); if (obj == null || !obj.isIndirect()) continue; String name = getCOName(reader, (PRIndirectReference) obj); if (af.getFieldItem(name) == null) continue; name = "." + name; if (calculationOrder.contains(name)) continue; calculationOrder.add(name); } }
private PdfObject propagate(PdfObject obj) throws IOException { if (obj == null) { return new PdfNull(); } else if (obj.isArray()) { PdfArray a = (PdfArray)obj; for (int i = 0; i < a.size(); i++) { a.set(i, propagate(a.getPdfObject(i))); } return a; } else if (obj.isDictionary() || obj.isStream()) { PdfDictionary d = (PdfDictionary)obj; for (PdfName key : d.getKeys()) { d.put(key, propagate(d.get(key))); } return d; } else if (obj.isIndirect()) { obj = PdfReader.getPdfObject(obj); return addToBody(propagate(obj)).getIndirectReference(); } else return obj; }