Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -126,38 +126,49 @@ private static void writeTokensToStream(PDStream newContents, List<Object> newTo

private static List<Object> createTokensWithoutText(PDContentStream contentStream) throws IOException
{
PDFStreamParser parser = new PDFStreamParser(contentStream);
Object token = parser.parseNextToken();
List<Object> newTokens = new ArrayList<>();
while (token != null)
PDFStreamParser parser = null;
try
{
if (token instanceof Operator)
parser = new PDFStreamParser(contentStream);
Object token = parser.parseNextToken();
while (token != null)
{
Operator op = (Operator) token;
String opName = op.getName();
if (OperatorName.SHOW_TEXT_ADJUSTED.equals(opName)
|| OperatorName.SHOW_TEXT.equals(opName)
|| OperatorName.SHOW_TEXT_LINE.equals(opName))
if (token instanceof Operator)
{
// remove the argument to this operator
newTokens.remove(newTokens.size() - 1);
Operator op = (Operator) token;
String opName = op.getName();
if (OperatorName.SHOW_TEXT_ADJUSTED.equals(opName)
|| OperatorName.SHOW_TEXT.equals(opName)
|| OperatorName.SHOW_TEXT_LINE.equals(opName))
{
// remove the argument to this operator
newTokens.remove(newTokens.size() - 1);

token = parser.parseNextToken();
continue;
}
else if (OperatorName.SHOW_TEXT_LINE_AND_SPACE.equals(opName))
{
// remove the 3 arguments to this operator
newTokens.remove(newTokens.size() - 1);
newTokens.remove(newTokens.size() - 1);
newTokens.remove(newTokens.size() - 1);
token = parser.parseNextToken();
continue;
}
else if (OperatorName.SHOW_TEXT_LINE_AND_SPACE.equals(opName))
{
// remove the 3 arguments to this operator
newTokens.remove(newTokens.size() - 1);
newTokens.remove(newTokens.size() - 1);
newTokens.remove(newTokens.size() - 1);

token = parser.parseNextToken();
continue;
token = parser.parseNextToken();
continue;
}
}
newTokens.add(token);
token = parser.parseNextToken();
}
}
finally
{
if (parser != null)
{
parser.close();
}
newTokens.add(token);
token = parser.parseNextToken();
}
return newTokens;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -533,19 +533,22 @@ private void processStream(PDContentStream contentStream) throws IOException
private void processStreamOperators(PDContentStream contentStream) throws IOException
{
List<COSBase> arguments = new ArrayList<>();
PDFStreamParser parser = new PDFStreamParser(contentStream);
Object token = parser.parseNextToken();

boolean isFirstOperator = true;
PDFStreamParser parser = null;
boolean oldShouldProcessColorOperators = shouldProcessColorOperators;
shouldProcessColorOperators = true;
if (contentStream instanceof PDTilingPattern &&
((PDTilingPattern) contentStream).getPaintType() == PDTilingPattern.PAINT_UNCOLORED)
{
shouldProcessColorOperators = false;
}

try
{
parser = new PDFStreamParser(contentStream);
Object token = parser.parseNextToken();

boolean isFirstOperator = true;
shouldProcessColorOperators = true;
if (contentStream instanceof PDTilingPattern &&
((PDTilingPattern) contentStream).getPaintType() == PDTilingPattern.PAINT_UNCOLORED)
{
shouldProcessColorOperators = false;
}

while (token != null)
{
if (token instanceof Operator)
Expand All @@ -568,6 +571,10 @@ private void processStreamOperators(PDContentStream contentStream) throws IOExce
}
finally
{
if (parser != null)
{
parser.close();
}
shouldProcessColorOperators = oldShouldProcessColorOperators;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,41 +113,52 @@ public PDRectangle getBBox()
public PDRectangle getGlyphBBox() throws IOException
{
List<COSBase> arguments = new ArrayList<>();
PDFStreamParser parser = new PDFStreamParser(this);
Object token = parser.parseNextToken();
while (token != null)
PDFStreamParser parser = null;
try
{
if (token instanceof Operator)
parser = new PDFStreamParser(this);
Object token = parser.parseNextToken();
while (token != null)
{
if (((Operator) token).getName().equals("d1") && arguments.size() == 6)
if (token instanceof Operator)
{
for (int i = 0; i < 6; ++i)
if (((Operator) token).getName().equals("d1") && arguments.size() == 6)
{
if (!(arguments.get(i) instanceof COSNumber))
for (int i = 0; i < 6; ++i)
{
return null;
if (!(arguments.get(i) instanceof COSNumber))
{
return null;
}
}
float x = ((COSNumber) arguments.get(2)).floatValue();
float y = ((COSNumber) arguments.get(3)).floatValue();
return new PDRectangle(
x,
y,
((COSNumber) arguments.get(4)).floatValue() - x,
((COSNumber) arguments.get(5)).floatValue() - y);
}
else
{
return null;
}
float x = ((COSNumber) arguments.get(2)).floatValue();
float y = ((COSNumber) arguments.get(3)).floatValue();
return new PDRectangle(
x,
y,
((COSNumber) arguments.get(4)).floatValue() - x,
((COSNumber) arguments.get(5)).floatValue() - y);
}
else
{
return null;
arguments.add((COSBase) token);
}
token = parser.parseNextToken();
}
else
return null;
}
finally
{
if (parser != null)
{
arguments.add((COSBase) token);
parser.close();
}
token = parser.parseNextToken();
}
return null;
}

@Override
Expand All @@ -166,19 +177,30 @@ public Matrix getMatrix()
public float getWidth() throws IOException
{
List<COSBase> arguments = new ArrayList<>();
PDFStreamParser parser = new PDFStreamParser(this);
Object token = parser.parseNextToken();
while (token != null)
PDFStreamParser parser = null;
try
{
if (token instanceof Operator)
parser = new PDFStreamParser(this);
Object token = parser.parseNextToken();
while (token != null)
{
return parseWidth((Operator) token, arguments);
if (token instanceof Operator)
{
return parseWidth((Operator) token, arguments);
}
else
{
arguments.add((COSBase) token);
}
token = parser.parseNextToken();
}
else
}
finally
{
if (parser != null)
{
arguments.add((COSBase) token);
parser.close();
}
token = parser.parseNextToken();
}
throw new IOException("Unexpected end of stream");
}
Expand Down