示例#1
0
 public void checkFdfHeader() throws IOException {
   file.setStartOffset(0);
   String str = readString(1024);
   int idx = str.indexOf("%FDF-1.2");
   if (idx < 0) throw new IOException("FDF header signature not found.");
   file.setStartOffset(idx);
 }
示例#2
0
 public char checkPdfHeader() throws IOException {
   file.setStartOffset(0);
   String str = readString(1024);
   int idx = str.indexOf("%PDF-1.");
   if (idx < 0) throw new IOException("PDF header signature not found.");
   file.setStartOffset(idx);
   return str.charAt(idx + 7);
 }
示例#3
0
 public int getStartxref() throws IOException {
   int size = Math.min(1024, file.length());
   int pos = file.length() - size;
   file.seek(pos);
   String str = readString(1024);
   int idx = str.lastIndexOf("startxref");
   if (idx < 0) throw new IOException("PDF startxref not found.");
   return pos + idx;
 }
示例#4
0
 public void nextValidToken() throws IOException {
   int level = 0;
   String n1 = null;
   String n2 = null;
   int ptr = 0;
   while (nextToken()) {
     if (type == TK_COMMENT) continue;
     switch (level) {
       case 0:
         {
           if (type != TK_NUMBER) return;
           ptr = file.getFilePointer();
           n1 = stringValue;
           ++level;
           break;
         }
       case 1:
         {
           if (type != TK_NUMBER) {
             file.seek(ptr);
             type = TK_NUMBER;
             stringValue = n1;
             return;
           }
           n2 = stringValue;
           ++level;
           break;
         }
       default:
         {
           if (type != TK_OTHER || !stringValue.equals("R")) {
             file.seek(ptr);
             type = TK_NUMBER;
             stringValue = n1;
             return;
           }
           type = TK_REF;
           reference = Integer.valueOf(n1).intValue();
           generation = Integer.valueOf(n2).intValue();
           return;
         }
     }
   }
   throwError("Unexpected end of file");
 }
示例#5
0
 public String readString(int size) throws IOException {
   StringBuffer buf = new StringBuffer();
   int ch;
   while ((size--) > 0) {
     ch = file.read();
     if (ch == -1) break;
     buf.append((char) ch);
   }
   return buf.toString();
 }
示例#6
0
 public boolean nextToken() throws IOException {
   StringBuffer outBuf = null;
   stringValue = EMPTY;
   int ch = 0;
   do {
     ch = file.read();
   } while (ch != -1 && isWhitespace(ch));
   if (ch == -1) return false;
   switch (ch) {
     case '[':
       type = TK_START_ARRAY;
       break;
     case ']':
       type = TK_END_ARRAY;
       break;
     case '/':
       {
         outBuf = new StringBuffer();
         type = TK_NAME;
         while (true) {
           ch = file.read();
           if (delims[ch + 1]) break;
           if (ch == '#') {
             ch = (getHex(file.read()) << 4) + getHex(file.read());
           }
           outBuf.append((char) ch);
         }
         backOnePosition(ch);
         break;
       }
     case '>':
       ch = file.read();
       if (ch != '>') throwError("'>' not expected");
       type = TK_END_DIC;
       break;
     case '<':
       {
         int v1 = file.read();
         if (v1 == '<') {
           type = TK_START_DIC;
           break;
         }
         outBuf = new StringBuffer();
         type = TK_STRING;
         hexString = true;
         int v2 = 0;
         while (true) {
           while (isWhitespace(v1)) v1 = file.read();
           if (v1 == '>') break;
           v1 = getHex(v1);
           if (v1 < 0) break;
           v2 = file.read();
           while (isWhitespace(v2)) v2 = file.read();
           if (v2 == '>') {
             ch = v1 << 4;
             outBuf.append((char) ch);
             break;
           }
           v2 = getHex(v2);
           if (v2 < 0) break;
           ch = (v1 << 4) + v2;
           outBuf.append((char) ch);
           v1 = file.read();
         }
         if (v1 < 0 || v2 < 0) throwError("Error reading string");
         break;
       }
     case '%':
       type = TK_COMMENT;
       do {
         ch = file.read();
       } while (ch != -1 && ch != '\r' && ch != '\n');
       break;
     case '(':
       {
         outBuf = new StringBuffer();
         type = TK_STRING;
         hexString = false;
         int nesting = 0;
         while (true) {
           ch = file.read();
           if (ch == -1) break;
           if (ch == '(') {
             ++nesting;
           } else if (ch == ')') {
             --nesting;
           } else if (ch == '\\') {
             boolean lineBreak = false;
             ch = file.read();
             switch (ch) {
               case 'n':
                 ch = '\n';
                 break;
               case 'r':
                 ch = '\r';
                 break;
               case 't':
                 ch = '\t';
                 break;
               case 'b':
                 ch = '\b';
                 break;
               case 'f':
                 ch = '\f';
                 break;
               case '(':
               case ')':
               case '\\':
                 break;
               case '\r':
                 lineBreak = true;
                 ch = file.read();
                 if (ch != '\n') backOnePosition(ch);
                 break;
               case '\n':
                 lineBreak = true;
                 break;
               default:
                 {
                   if (ch < '0' || ch > '7') {
                     break;
                   }
                   int octal = ch - '0';
                   ch = file.read();
                   if (ch < '0' || ch > '7') {
                     backOnePosition(ch);
                     ch = octal;
                     break;
                   }
                   octal = (octal << 3) + ch - '0';
                   ch = file.read();
                   if (ch < '0' || ch > '7') {
                     backOnePosition(ch);
                     ch = octal;
                     break;
                   }
                   octal = (octal << 3) + ch - '0';
                   ch = octal & 0xff;
                   break;
                 }
             }
             if (lineBreak) continue;
             if (ch < 0) break;
           } else if (ch == '\r') {
             ch = file.read();
             if (ch < 0) break;
             if (ch != '\n') {
               backOnePosition(ch);
               ch = '\n';
             }
           }
           if (nesting == -1) break;
           outBuf.append((char) ch);
         }
         if (ch == -1) throwError("Error reading string");
         break;
       }
     default:
       {
         outBuf = new StringBuffer();
         if (ch == '-' || ch == '+' || ch == '.' || (ch >= '0' && ch <= '9')) {
           type = TK_NUMBER;
           do {
             outBuf.append((char) ch);
             ch = file.read();
           } while (ch != -1 && ((ch >= '0' && ch <= '9') || ch == '.'));
         } else {
           type = TK_OTHER;
           do {
             outBuf.append((char) ch);
             ch = file.read();
           } while (!delims[ch + 1]);
         }
         backOnePosition(ch);
         break;
       }
   }
   if (outBuf != null) stringValue = outBuf.toString();
   return true;
 }
示例#7
0
 public void throwError(String error) throws IOException {
   throw new IOException(error + " at file pointer " + file.getFilePointer());
 }
示例#8
0
 public void backOnePosition(int ch) throws IOException {
   if (ch != -1) file.pushBack((byte) ch);
 }
示例#9
0
 public int read() throws IOException {
   return file.read();
 }
示例#10
0
 public int length() throws IOException {
   return file.length();
 }
示例#11
0
 public void close() throws IOException {
   file.close();
 }
示例#12
0
 public int getFilePointer() throws IOException {
   return file.getFilePointer();
 }
示例#13
0
 public void seek(int pos) throws IOException {
   file.seek(pos);
 }