📄 prtokeniser.java
字号:
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;
}
public int intValue() {
return Integer.parseInt(stringValue);
}
public boolean readLineSegment(byte input[]) throws IOException {
int c = -1;
boolean eol = false;
int ptr = 0;
int len = input.length;
// ssteward, pdftk-1.10, 040922:
// skip initial whitespace; added this because PdfReader.rebuildXref()
// assumes that line provided by readLineSegment does not have init. whitespace;
if ( ptr < len ) {
while ( isWhitespace( (c = read()) ) );
}
while ( !eol && ptr < len ) {
switch (c) {
case -1:
case '\n':
eol = true;
break;
case '\r':
eol = true;
int cur = getFilePointer();
if ((read()) != '\n') {
seek(cur);
}
break;
default:
input[ptr++] = (byte)c;
break;
}
// break loop? do it before we read() again
if( eol || len <= ptr ) {
break;
}
else {
c = read();
}
}
if (ptr >= len) {
eol = false;
while (!eol) {
switch (c = read()) {
case -1:
case '\n':
eol = true;
break;
case '\r':
eol = true;
int cur = getFilePointer();
if ((read()) != '\n') {
seek(cur);
}
break;
}
}
}
if ((c == -1) && (ptr == 0)) {
return false;
}
if (ptr + 2 <= len) {
input[ptr++] = (byte)' ';
input[ptr] = (byte)'X';
}
return true;
}
public static int[] checkObjectStart(byte line[]) {
try {
PRTokeniser tk = new PRTokeniser(line);
int num = 0;
int gen = 0;
if (!tk.nextToken() || tk.getTokenType() != TK_NUMBER)
return null;
num = tk.intValue();
if (!tk.nextToken() || tk.getTokenType() != TK_NUMBER)
return null;
gen = tk.intValue();
if (!tk.nextToken())
return null;
if (!tk.getStringValue().equals("obj"))
return null;
return new int[]{num, gen};
}
catch (Exception ioe) {
// empty on purpose
}
return null;
}
public boolean isHexString() {
return this.hexString;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -