PdfDictionary dic = new PdfDictionary(); while (!rangeIsCorrect) { tokens.nextValidToken(); if (tokens.getTokenType() == PdfTokenizer.TokenType.EndDic) { currentLevel--; break; if (tokens.getTokenType() != PdfTokenizer.TokenType.Name) { tokens.throwError(PdfException.DictionaryKey1IsNotAName, tokens.getStringValue()); long startPosition = tokens.getPosition(); int ch; int whiteSpacesCount = -1; do { ch = tokens.read(); whiteSpacesCount++; } while (ch != -1 && PdfTokenizer.isWhitespace(ch)); tokens.seek(startPosition); obj = readObject(true, objStm); long endPosition = tokens.getPosition(); if (endPosition == contentsEnd && startPosition + whiteSpacesCount == contentsStart) { rangeIsCorrect = true; if (tokens.getTokenType() == PdfTokenizer.TokenType.EndDic) tokens.throwError(PdfException.UnexpectedGtGt); if (tokens.getTokenType() == PdfTokenizer.TokenType.EndArray) tokens.throwError(PdfException.UnexpectedCloseBracket);
/** * Check whether line starts with object declaration. * @param lineTokenizer tokenizer, built by single line. * @return object number and generation if check is successful, otherwise - null. */ public static int[] checkObjectStart(PdfTokenizer lineTokenizer) { try { lineTokenizer.seek(0); if (!lineTokenizer.nextToken() || lineTokenizer.getTokenType() != TokenType.Number) return null; int num = lineTokenizer.getIntValue(); if (!lineTokenizer.nextToken() || lineTokenizer.getTokenType() != TokenType.Number) return null; int gen = lineTokenizer.getIntValue(); if (!lineTokenizer.nextToken()) return null; if (!Arrays.equals(Obj, lineTokenizer.getByteContent())) return null; return new int[]{num, gen}; } catch (Exception ioe) { // empty on purpose } return null; }
/** * Reads the next token skipping over the comments. * @return {@code true} if a token was read, {@code false} if the end of content was reached. * @throws java.io.IOException on error. */ public boolean nextValidToken() throws java.io.IOException { while (tokeniser.nextToken()) { if (tokeniser.getTokenType() == TokenType.Comment) continue; return true; } return false; }
protected PdfName readPdfName(boolean readAsDirect) { if (readAsDirect) { PdfName cachedName = PdfName.staticNames.get(tokens.getStringValue()); if (cachedName != null) return cachedName; } // an indirect name (how odd...), or a non-standard one return new PdfName(tokens.getByteContent()); }
protected PdfObject readObject(boolean readAsDirect, boolean objStm) throws IOException { tokens.nextValidToken(); PdfTokenizer.TokenType type = tokens.getTokenType(); switch (type) { case StartDic: { PdfDictionary dict = readDictionary(objStm); long pos = tokens.getPosition(); hasNext = tokens.nextToken(); } while (hasNext && tokens.getTokenType() == PdfTokenizer.TokenType.Comment); if (hasNext && tokens.tokenValueEqualsTo(PdfTokenizer.Stream)) { ch = tokens.read(); } while (ch == 32 || ch == 9 || ch == 0 || ch == 12); if (ch != '\n') ch = tokens.read(); if (ch != '\n') tokens.backOnePosition(ch); return new PdfStream(tokens.getPosition(), dict); } else { tokens.seek(pos); return dict; return readArray(objStm); case Number: return new PdfNumber(tokens.getByteContent()); case String: { PdfString pdfString = new PdfString(tokens.getByteContent(), tokens.isHexString()); if (isEncrypted() && !decrypt.isEmbeddedFilesOnly() && !objStm) {
protected void readXref() throws IOException { tokens.seek(tokens.getStartxref()); tokens.nextToken(); if (!tokens.tokenValueEqualsTo(PdfTokenizer.Startxref)) throw new PdfException(PdfException.PdfStartxrefNotFound, tokens); tokens.nextToken(); if (tokens.getTokenType() != PdfTokenizer.TokenType.Number) throw new PdfException(PdfException.PdfStartxrefIsNotFollowedByANumber, tokens); long startxref = tokens.getLongValue(); lastXref = startxref; eofPos = tokens.getPosition(); try { if (readXrefStream(startxref)) { tokens.seek(startxref); trailer = readXrefSection(); throw new PdfException(PdfException.TrailerPrevEntryPointsToItsOwnCrossReferenceSection); startxref = prev.longValue(); tokens.seek(startxref); trailer2 = readXrefSection();
protected static Object[] splitDAelements(String da) { PdfTokenizer tk = new PdfTokenizer(new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(PdfEncodings.convertToBytes(da, null)))); List<String> stack = new ArrayList<>(); Object[] ret = new Object[3]; try { while (tk.nextToken()) { if (tk.getTokenType() == PdfTokenizer.TokenType.Comment) continue; if (tk.getTokenType() == PdfTokenizer.TokenType.Other) { String operator = tk.getStringValue(); if (operator.equals("Tf")) { if (stack.size() >= 2) { stack.add(tk.getStringValue());
if (!nextValidToken()) return null; TokenType type = tokeniser.getTokenType(); switch (type) { case StartDic: case String: CMapObject obj; if (tokeniser.isHexString()) { obj = new CMapObject(CMapObject.HEX_STRING, PdfTokenizer.decodeStringContent(tokeniser.getByteContent(), true)); } else { obj = new CMapObject(CMapObject.STRING, PdfTokenizer.decodeStringContent(tokeniser.getByteContent(), false)); return new CMapObject(CMapObject.NAME, decodeName(tokeniser.getByteContent())); case Number: CMapObject numObject = new CMapObject(CMapObject.NUMBER, null); try { numObject.setValue((int)java.lang.Double.parseDouble(tokeniser.getStringValue())); } catch (NumberFormatException e) { numObject.setValue(Integer.MIN_VALUE); return new CMapObject(CMapObject.LITERAL, tokeniser.getStringValue()); case EndArray: return new CMapObject(CMapObject.TOKEN, "]");
/** * Reads a dictionary. The tokeniser must be positioned past the "<<" token. * @return the dictionary * @throws IOException on error */ public PdfDictionary readDictionary() throws IOException { PdfDictionary dic = new PdfDictionary(); while (true) { if (!nextValidToken()) throw new PdfException(PdfException.UnexpectedEndOfFile); if (tokeniser.getTokenType() == PdfTokenizer.TokenType.EndDic) break; if (tokeniser.getTokenType() != PdfTokenizer.TokenType.Name) tokeniser.throwError(PdfException.DictionaryKey1IsNotAName, tokeniser.getStringValue()); PdfName name = new PdfName(tokeniser.getStringValue()); PdfObject obj = readObject(); dic.put(name, obj); } return dic; }
protected PdfDictionary readDictionary(boolean objStm) throws IOException { PdfDictionary dic = new PdfDictionary(); while (true) { tokens.nextValidToken(); if (tokens.getTokenType() == PdfTokenizer.TokenType.EndDic) break; if (tokens.getTokenType() != PdfTokenizer.TokenType.Name) tokens.throwError(PdfException.DictionaryKey1IsNotAName, tokens.getStringValue()); PdfName name = readPdfName(true); PdfObject obj = readObject(true, objStm); if (obj == null) { if (tokens.getTokenType() == PdfTokenizer.TokenType.EndDic) tokens.throwError(PdfException.UnexpectedGtGt); if (tokens.getTokenType() == PdfTokenizer.TokenType.EndArray) tokens.throwError(PdfException.UnexpectedCloseBracket); } dic.put(name, obj); } return dic; }
protected PdfDictionary readXrefSection() throws IOException { tokens.nextValidToken(); if (!tokens.tokenValueEqualsTo(PdfTokenizer.Xref)) tokens.throwError(PdfException.XrefSubsectionNotFound); PdfXrefTable xref = pdfDocument.getXref(); while (true) { tokens.nextValidToken(); if (tokens.tokenValueEqualsTo(PdfTokenizer.Trailer)) { break; if (tokens.getTokenType() != PdfTokenizer.TokenType.Number) { tokens.throwError(PdfException.ObjectNumberOfTheFirstObjectInThisXrefSubsectionNotFound); int start = tokens.getIntValue(); tokens.nextValidToken(); if (tokens.getTokenType() != PdfTokenizer.TokenType.Number) { tokens.throwError(PdfException.NumberOfEntriesInThisXrefSubsectionNotFound); int end = tokens.getIntValue() + start; for (int num = start; num < end; num++) { tokens.nextValidToken(); long pos = tokens.getLongValue(); tokens.nextValidToken(); int gen = tokens.getIntValue(); tokens.nextValidToken(); if (pos == 0L && gen == 65535 && num == 1 && start != 0) { if (tokens.tokenValueEqualsTo(PdfTokenizer.N)) { if (pos == 0) { tokens.throwError(PdfException.FilePosition1CrossReferenceEntryInThisXrefSubsection);
PdfXrefTable xref = pdfDocument.getXref(); xref.clear(); tokens.seek(0); trailer = null; 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) == 't') { if (!PdfTokenizer.checkTrailer(buffer)) continue; tokens.seek(pos); tokens.nextToken(); pos = tokens.getPosition(); try { PdfDictionary dic = (PdfDictionary) readObject(false); trailer = dic; else tokens.seek(pos); } catch (Exception e) { tokens.seek(pos); int[] obj = PdfTokenizer.checkObjectStart(lineTokeniser); if (obj == null) continue;
PdfObject object; try { tokens.seek(reference.getOffset()); tokens.nextValidToken(); if (tokens.getTokenType() != PdfTokenizer.TokenType.Obj || tokens.getObjNr() != reference.getObjNumber() || tokens.getGenNr() != reference.getGenNumber()) { tokens.throwError(PdfException.InvalidOffsetForObject1, reference.toString());
private void checkPdfStreamLength(PdfStream pdfStream) throws IOException { if (!correctStreamLength) return; long fileLength = tokens.length(); long start = pdfStream.getOffset(); boolean calc = false; calc = true; } else { tokens.seek(start + streamLength); String line = tokens.readString(20); if (!line.startsWith(endstream2) && !line.startsWith(endstream3) && !line.startsWith(endstream4) && !line.startsWith(endstream1)) { tokens.seek(start); long pos; while (true) { pos = tokens.getPosition(); line.reset(); if (!tokens.readLineSegment(line, false)) // added boolean because of mailing list issue (17 Feb. 2014) break; if (line.startsWith(endstream)) { break; } else if (line.startsWith(endobj)) { tokens.seek(pos - 16); String s = tokens.readString(16); int index = s.indexOf(endstream1); if (index >= 0)
while (isWhitespace((c = read()), isNullWhitespace)) ; case '\r': eol = true; long cur = getPosition(); if ((read()) != '\n') { seek(cur); eol = true; } else { c = read(); eol = false; while (!eol) { switch (c = read()) { case -1: case '\n': case '\r': eol = true; long cur = getPosition(); if ((read()) != '\n') { seek(cur);
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); } } } }
protected boolean readXrefStream(long ptr) throws IOException { tokens.seek(ptr); if (!tokens.nextToken()) { return false; if (tokens.getTokenType() != PdfTokenizer.TokenType.Number) { return false; if (!tokens.nextToken() || tokens.getTokenType() != PdfTokenizer.TokenType.Number) { return false; if (!tokens.nextToken() || !tokens.tokenValueEqualsTo(PdfTokenizer.Obj)) { return false;
/** * Reads a pdf object. * @return the pdf object * @throws IOException on error */ public PdfObject readObject() throws IOException { if (!nextValidToken()) return null; final PdfTokenizer.TokenType type = tokeniser.getTokenType(); switch (type) { case StartDic: { PdfDictionary dic = readDictionary(); return dic; } case StartArray: return readArray(); case String: PdfString str = new PdfString(tokeniser.getDecodedStringContent()).setHexWriting(tokeniser.isHexString()); return str; case Name: return new PdfName(tokeniser.getByteContent()); case Number: //use PdfNumber(byte[]) here, as in this case number parsing won't happen until it's needed. return new PdfNumber(tokeniser.getByteContent()); default: return new PdfLiteral(tokeniser.getByteContent()); } }
final PdfTokenizer.TokenType type = getTokeniser().getTokenType(); switch (type) { case StartArray: if (document == null) throw new RuntimeException(LoggerMessages.EDITING_REFERENCE_NO_DOCUMENT_ERROR); return document.getPdfObject(getTokeniser().getObjNr()).getIndirectReference(); default: if (getTokeniser().tokenValueEqualsTo(PdfTokenizer.Null)) { return PdfNull.PDF_NULL; } else if (getTokeniser().tokenValueEqualsTo(PdfTokenizer.True)) { return PdfBoolean.TRUE; } else if (getTokeniser().tokenValueEqualsTo(PdfTokenizer.False)) { return new PdfBoolean(false);
protected PdfArray readArray(boolean objStm) throws IOException { PdfArray array = new PdfArray(); while (true) { PdfObject obj = readObject(true, objStm); if (obj == null) { if (tokens.getTokenType() == PdfTokenizer.TokenType.EndArray) break; if (tokens.getTokenType() == PdfTokenizer.TokenType.EndDic) tokens.throwError(PdfException.UnexpectedGtGt); } array.add(obj); } return array; }