private static void appendSyntaxString(PdfIndirectReference reference) { stringBuilder .append(reference.getObjNumber()) .append(" ") .append(reference.getGenNumber()) .append(" R"); }
IndirectRefDescription(PdfIndirectReference reference) { this.docId = reference.getDocument().getDocumentId(); this.objNr = reference.getObjNumber(); this.genNr = reference.getGenNumber(); }
/** * 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); } } }
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++; } }
@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)); }
Integer leastFreeRefObjNum = null; for (Map.Entry<Integer, PdfIndirectReference> entry : freeReferencesLinkedList.entrySet()) { if (entry.getKey() <= 0 || xref[entry.getKey()].getGenNumber() >= MAX_GENERATION) { continue;
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); } }
} else if (xref[next].getGenNumber() == MAX_GENERATION && xref[next].getOffset() == 0) { continue;
/** * 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); }
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; }
&& getType() != INDIRECT_REFERENCE && getIndirectReference().getGenNumber() == 0);
xrefStream.getOutputStream().write(0); xrefStream.getOutputStream().write(reference.getOffset(), offsetSize); xrefStream.getOutputStream().write(reference.getGenNumber(), 2); } else if (reference.getObjStreamNumber() == 0) { xrefStream.getOutputStream().write(1); xrefStream.getOutputStream().write(reference.getOffset(), offsetSize); xrefStream.getOutputStream().write(reference.getGenNumber(), 2); } else { xrefStream.getOutputStream().write(2); StringBuilder gen = new StringBuilder("00000").append(reference.getGenNumber()); writer.writeString(off.substring(off.length() - 10, off.length())).writeSpace(). writeString(gen.substring(gen.length() - 5, gen.length())).writeSpace();
protected void fixXref() throws IOException { fixedXref = true; PdfXrefTable xref = pdfDocument.getXref(); tokens.seek(0); ByteBuffer buffer = new ByteBuffer(24); PdfTokenizer lineTokeniser = new PdfTokenizer(new RandomAccessFileOrArray(new ReusableRandomAccessSource(buffer))); for (; ; ) { long pos = tokens.getPosition(); buffer.reset(); if (!tokens.readLineSegment(buffer, true)) // added boolean because of mailing list issue (17 Feb. 2014) break; if (buffer.get(0) >= '0' && buffer.get(0) <= '9') { int[] obj = PdfTokenizer.checkObjectStart(lineTokeniser); if (obj == null) continue; int num = obj[0]; int gen = obj[1]; PdfIndirectReference reference = xref.get(num); if (reference != null && reference.getGenNumber() == gen) { reference.fixOffset(pos); } } } }
if (tokens.getTokenType() != PdfTokenizer.TokenType.Obj || tokens.getObjNr() != reference.getObjNumber() || tokens.getGenNr() != reference.getGenNumber()) { tokens.throwError(PdfException.InvalidOffsetForObject1, reference.toString());
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);
decrypt.setHashKeyForNextObject(stream.getIndirectReference().getObjNumber(), stream.getIndirectReference().getGenNumber()); bytes = decrypt.decryptByteArray(bytes);
int num = obj[0]; int gen = obj[1]; if (xref.get(num) == null || xref.get(num).getGenNumber() <= gen) { xref.add(new PdfIndirectReference(pdfDocument, num, gen, pos));
boolean refReadingState = reference != null && reference.checkState(PdfObject.READING) && reference.getGenNumber() == newReference.getGenNumber(); boolean refFirstEncountered = reference == null
PdfString pdfString = new PdfString(tokens.getByteContent(), tokens.isHexString()); if (isEncrypted() && !decrypt.isEmbeddedFilesOnly() && !objStm) { pdfString.setDecryption(currentIndirectReference.getObjNumber(), currentIndirectReference.getGenNumber(), decrypt);