/** * Escape special symbols or convert to hexadecimal string. * This method don't change either {@code value} or {@code content} ot the {@code PdfString}. * * @param bytes byte array to manipulate with. * @return Hexadecimal string or string with escaped symbols in byte array view. */ protected byte[] encodeBytes(byte[] bytes) { if (hexWriting) { ByteBuffer buf = new ByteBuffer(bytes.length * 2); for (byte b : bytes) { buf.appendHex(b); } return buf.getInternalBuffer(); } else { ByteBuffer buf = StreamUtil.createBufferedEscapedString(bytes); return buf.toByteArray(1, buf.size() - 2); } }
public static ByteBuffer createBufferedHexedString(byte[] bytes) { ByteBuffer buf = new ByteBuffer(bytes.length * 2 + 2); buf.append('<'); for (byte b : bytes) { buf.appendHex(b); } buf.append('>'); return buf; }
/** * Checks whether {@code line} equals to 'trailer'. * @param line for check. * @return true, if line is equals tio 'trailer', otherwise false. */ public static boolean checkTrailer(ByteBuffer line) { if (Trailer.length > line.size()) return false; for (int i = 0; i < Trailer.length; i++) { if (Trailer[i] != line.get(i)) return false; } return true; }
@Override public int get(long offset) { if (offset >= buffer.size()) return -1; return 0xff & buffer.getInternalBuffer()[(int) offset]; }
/** * Creates a PdfLiteral that contains an array of two id entries. These entries are both hexadecimal * strings containing 16 hex characters. The first entry is the original id, the second entry * should be different from the first one if the document has changed. * * @param firstId the first id * @param secondId the second id * @return PdfObject containing the two entries. */ public static PdfObject createInfoId(byte[] firstId, byte[] secondId) { if ( firstId.length < 16 ) { firstId = padByteArrayTo16(firstId); } if ( secondId.length < 16 ) { secondId = padByteArrayTo16(secondId); } com.itextpdf.io.source.ByteBuffer buf = new com.itextpdf.io.source.ByteBuffer(90); buf.append('[').append('<'); for (int k = 0; k < firstId.length; ++k) buf.appendHex(firstId[k]); buf.append('>').append('<'); for (int k = 0; k < secondId.length; ++k) buf.appendHex(secondId[k]); buf.append('>').append(']'); return new PdfLiteral(buf.toByteArray()); }
@Override protected void generateContent() { int length = value.length(); ByteBuffer buf = new ByteBuffer(length + 20); char c; char[] chars = value.toCharArray(); buf.append(space); break; case '%': buf.append(percent); break; case '(': buf.append(leftParenthesis); break; case ')': buf.append(rightParenthesis); break; case '<': buf.append(lessThan); break; case '>': buf.append(greaterThan); break; case '[': buf.append(leftSquare); break; case ']': buf.append(rightSquare); break;
public T writeInteger(int value) { try { ByteUtils.getIsoBytes(value, numBuffer.reset()); write(numBuffer.getInternalBuffer(), numBuffer.capacity() - numBuffer.size(), numBuffer.size()); return (T) this; } catch (java.io.IOException e) { throw new IOException(IOException.CannotWriteIntNumber, e); } }
ByteBuffer buffer = new ByteBuffer(to - from + 1); if (hexWriting) { // <6954657874ae...> for (int i = from; i <= to; ) { int v1 = ByteBuffer.getHex(content[i++]); if (i > to) { buffer.append(v1 << 4); break; v2 = ByteBuffer.getHex(v2); buffer.append((v1 << 4) + v2); buffer.append(ch); return buffer.toByteArray();
bb.append("$Lnull"); return; byte[] cached = serializedCache.get(reference); if (cached != null) { bb.append(cached); return; } else { bb = new ByteBuffer(); obj = reference.getRefersTo(); bb.append("$B"); if (level > 0) { bb.append(md5.digest(((PdfStream) obj).getBytes(false))); serArray((PdfArray) obj, bb, level - 1, serializedCache); } else if (obj.isString()) { bb.append("$S").append(obj.toString()); // TODO specify length for strings, streams, may be names? } else if (obj.isName()) { bb.append("$N").append(obj.toString()); } else { bb.append("$L").append(obj.toString()); // PdfNull case is also here serializedCache.put(reference, bb.toByteArray()); savedBb.append(bb.getInternalBuffer());
/** * Converts an array of bytes to a String of hexadecimal values * * @param bytes a byte array * @return the same bytes expressed as hexadecimal values */ public static String convertToHex(byte[] bytes) { ByteBuffer buf = new ByteBuffer(); for (byte b : bytes) { buf.appendHex(b); } return PdfEncodings.convertToString(buf.toByteArray(), null).toUpperCase(); } }
static byte[] getIsoBytes(int n, ByteBuffer buffer) { boolean negative = false; if (n < 0) { negative = true; n = -n; } int intLen = intSize(n); ByteBuffer buf = buffer == null ? new ByteBuffer(intLen + (negative ? 1 : 0)) : buffer; for (int i = 0; i < intLen; i++) { buf.prepend(bytes[n % 10]); n /= 10; } if (negative) buf.prepend((byte) '-'); return buffer == null ? buf.getInternalBuffer() : null; }
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); } } } }
break; prevWasWhitespace = true; buffer.append((byte) c); break; default: prevWasWhitespace = false; buffer.append((byte) c); break; if (eol || buffer.size() == buffer.capacity()) { eol = true; } else { if (buffer.size() == buffer.capacity()) { eol = false; while (!eol) { return !(c == -1 && buffer.isEmpty());
public boolean nextToken() throws java.io.IOException { int ch; outBuf.reset(); do { ch = file.read(); if (delims[ch + 1]) break; outBuf.append(ch); if (v1 == '>') break; outBuf.append(v1); v1 = ByteBuffer.getHex(v1); if (v1 < 0) break; outBuf.append(v2); v2 = ByteBuffer.getHex(v2); if (v2 < 0) break; break; } else if (ch == '\\') { outBuf.append('\\'); ch = file.read(); if (ch < 0) break; outBuf.append(ch);
public byte[] getByteContent() { return outBuf.toByteArray(); }
public static ByteBuffer createBufferedEscapedString(byte[] bytes) { ByteBuffer buf = new ByteBuffer(bytes.length * 2 + 2); buf.append('('); for (byte b : bytes) { switch (b) { case (byte) '\r': buf.append(escR); break; case (byte) '\n': buf.append(escN); break; case (byte) '\t': buf.append(escT); break; case (byte) '\b': buf.append(escB); break; case (byte) '\f': buf.append(escF); break; case (byte) '(': case (byte) ')': case (byte) '\\': buf.append('\\').append(b); break; default: if (b < 8 && b >= 0) { buf.append("\\00").append(Integer.toOctalString(b)); } else if (b >= 8 && b < 32) { buf.append("\\0").append(Integer.toOctalString(b));
public SerializedObjectContent serializeObject(PdfObject obj) { if (!obj.isStream() && !obj.isDictionary()) { return null; } PdfIndirectReference indRef = obj.getIndirectReference(); assert indRef != null; Map<PdfIndirectReference, byte[]> serializedCache = indRef.getDocument().serializedObjectsCache; byte[] content = serializedCache.get(indRef); if (content == null) { ByteBuffer bb = new ByteBuffer(); int level = 100; try { serObject(obj, bb, level, serializedCache); } catch (SelfReferenceException e) { return null; } content = bb.toByteArray(); } return new SerializedObjectContent(content); }
ByteBuffer line = new ByteBuffer(16); 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)) { streamLength = (int) (pos - start); break; } else if (line.startsWith(endobj)) { tokens.seek(pos - 16); String s = tokens.readString(16);