#include "Parser.h"
#include "XRef.h"
#include "Error.h"
-#ifndef NO_DECRYPTION
#include "Decrypt.h"
-#endif
Parser::Parser(XRef *xrefA, Lexer *lexerA) {
xref = xrefA;
delete lexer;
}
-#ifndef NO_DECRYPTION
Object *Parser::getObj(Object *obj,
Guchar *fileKey, int keyLength,
int objNum, int objGen) {
-#else
-Object *Parser::getObj(Object *obj) {
-#endif
char *key;
Stream *str;
Object obj2;
int num;
-#ifndef NO_DECRYPTION
Decrypt *decrypt;
GString *s;
char *p;
int i;
-#endif
// refill buffer after inline image data
if (inlineImg == 2) {
shift();
obj->initArray(xref);
while (!buf1.isCmd("]") && !buf1.isEOF())
-#ifndef NO_DECRYPTION
obj->arrayAdd(getObj(&obj2, fileKey, keyLength, objNum, objGen));
-#else
- obj->arrayAdd(getObj(&obj2));
-#endif
if (buf1.isEOF())
error(getPos(), "End of file inside array");
shift();
gfree(key);
break;
}
-#ifndef NO_DECRYPTION
obj->dictAdd(key, getObj(&obj2, fileKey, keyLength, objNum, objGen));
-#else
- obj->dictAdd(key, getObj(&obj2));
-#endif
}
}
if (buf1.isEOF())
if (buf2.isCmd("stream")) {
if ((str = makeStream(obj))) {
obj->initStream(str);
-#ifndef NO_DECRYPTION
if (fileKey) {
str->getBaseStream()->doDecryption(fileKey, keyLength,
objNum, objGen);
}
-#endif
} else {
obj->free();
obj->initError();
obj->initInt(num);
}
-#ifndef NO_DECRYPTION
// string
} else if (buf1.isString() && fileKey) {
buf1.copy(obj);
}
delete decrypt;
shift();
-#endif
// simple object
} else {
Stream *Parser::makeStream(Object *dict) {
Object obj;
+ BaseStream *baseStr;
Stream *str;
Guint pos, endPos, length;
if (!lexer->getStream()) {
return NULL;
}
-
- // make base stream
- str = lexer->getStream()->getBaseStream()->makeSubStream(pos, gTrue,
- length, dict);
-
- // get filters
- str = str->addFilters(dict);
+ baseStr = lexer->getStream()->getBaseStream();
// skip over stream data
lexer->setPos(pos + length);
shift();
} else {
error(getPos(), "Missing 'endstream'");
- str->ignoreLength();
+ // kludge for broken PDF files: just add 5k to the length, and
+ // hope its enough
+ length += 5000;
}
+ // make base stream
+ str = baseStr->makeSubStream(pos, gTrue, length, dict);
+
+ // get filters
+ str = str->addFilters(dict);
+
return str;
}