in pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java [497:648]
protected COSString parseCOSString() throws IOException
{
char nextChar = (char) source.read();
if (nextChar == '<')
{
return parseCOSHexString();
}
else if (nextChar != '(')
{
throw new IOException( "parseCOSString string should start with '(' or '<' and not '" +
nextChar + "' at offset " + source.getPosition());
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
// This is the number of braces read
int braces = 1;
int c = source.read();
while( braces > 0 && c != -1)
{
char ch = (char)c;
int nextc = -2; // not yet read
if (ch == ')')
{
braces--;
braces = checkForEndOfString(braces);
if( braces != 0 )
{
out.write(ch);
}
}
else if (ch == '(')
{
braces++;
out.write(ch);
}
else if( ch == '\\' )
{
//patched by ram
char next = (char) source.read();
switch(next)
{
case 'n':
out.write('\n');
break;
case 'r':
out.write('\r');
break;
case 't':
out.write('\t');
break;
case 'b':
out.write('\b');
break;
case 'f':
out.write('\f');
break;
case ')':
// PDFBox 276 /Title (c:\)
braces = checkForEndOfString(braces);
if( braces != 0 )
{
out.write(next);
}
else
{
out.write('\\');
}
break;
case '(':
case '\\':
out.write(next);
break;
case ASCII_LF:
case ASCII_CR:
//this is a break in the line so ignore it and the newline and continue
c = source.read();
while( isEOL(c) && c != -1)
{
c = source.read();
}
nextc = c;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
StringBuilder octal = new StringBuilder();
octal.append( next );
c = source.read();
char digit = (char)c;
if( digit >= '0' && digit <= '7' )
{
octal.append( digit );
c = source.read();
digit = (char)c;
if( digit >= '0' && digit <= '7' )
{
octal.append( digit );
}
else
{
nextc = c;
}
}
else
{
nextc = c;
}
int character = 0;
try
{
character = Integer.parseInt( octal.toString(), 8 );
}
catch( NumberFormatException e )
{
throw new IOException( "Error: Expected octal character, actual='" + octal + "'", e );
}
out.write(character);
break;
default:
// dropping the backslash
// see 7.3.4.2 Literal Strings for further information
out.write(next);
}
}
else
{
out.write(ch);
}
if (nextc != -2)
{
c = nextc;
}
else
{
c = source.read();
}
}
if (c != -1)
{
source.rewind(1);
}
return new COSString(out.toByteArray());
}