diff --git a/src/core.js b/src/core.js index 5faee59c7..1bad175da 100644 --- a/src/core.js +++ b/src/core.js @@ -392,12 +392,17 @@ var PDFDocModel = (function pdfDoc() { if (find(stream, 'endobj', 1024)) startXRef = stream.pos + 6; } else { - // Find startxref at the end of the file. - var start = stream.end - 1024; - if (start < 0) - start = 0; - stream.pos = start; - if (find(stream, 'startxref', 1024, true)) { + // Find startxref by jumping backward from the end of the file. + var step = 1024; + var found = false, pos = stream.end; + while (!found && pos > 0) { + pos -= step - 'startxref'.length; + if (pos < 0) + pos = 0; + stream.pos = pos; + found = find(stream, 'startxref', step, true); + } + if (found) { stream.skip(9); var ch; do { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 7a36acd58..d3caa968a 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -17,4 +17,5 @@ !devicen.pdf !cmykjpeg.pdf !issue840.pdf +!scan-bad.pdf !freeculture.pdf diff --git a/test/pdfs/scan-bad.pdf b/test/pdfs/scan-bad.pdf new file mode 100755 index 000000000..ca09315f9 Binary files /dev/null and b/test/pdfs/scan-bad.pdf differ diff --git a/test/test.py b/test/test.py index 256200587..888bd9ce8 100644 --- a/test/test.py +++ b/test/test.py @@ -12,6 +12,7 @@ DOC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__),"..")) ANAL = True DEFAULT_MANIFEST_FILE = 'test_manifest.json' EQLOG_FILE = 'eq.log' +BROWSERLOG_FILE = 'browser.log' REFDIR = 'ref' TMPDIR = 'tmp' VERBOSE = False @@ -229,6 +230,7 @@ class BaseBrowserCommand(object): def setup(self): self.tempDir = tempfile.mkdtemp() self.profileDir = os.path.join(self.tempDir, "profile") + self.browserLog = open(BROWSERLOG_FILE, "w") def teardown(self): # If the browser is still running, wait up to ten seconds for it to quit @@ -245,6 +247,8 @@ class BaseBrowserCommand(object): if self.tempDir is not None and os.path.exists(self.tempDir): shutil.rmtree(self.tempDir) + self.browserLog.close() + def start(self, url): raise Exception("Can't start BaseBrowserCommand") @@ -262,7 +266,7 @@ class FirefoxBrowserCommand(BaseBrowserCommand): if platform.system() == "Darwin": cmds.append("-foreground") cmds.extend(["-no-remote", "-profile", self.profileDir, url]) - self.process = subprocess.Popen(cmds) + self.process = subprocess.Popen(cmds, stdout = self.browserLog, stderr = self.browserLog) class ChromeBrowserCommand(BaseBrowserCommand): def _fixupMacPath(self): @@ -272,7 +276,7 @@ class ChromeBrowserCommand(BaseBrowserCommand): cmds = [self.path] cmds.extend(["--user-data-dir=%s" % self.profileDir, "--no-first-run", "--disable-sync", url]) - self.process = subprocess.Popen(cmds) + self.process = subprocess.Popen(cmds, stdout = self.browserLog, stderr = self.browserLog) def makeBrowserCommand(browser): path = browser["path"].lower() diff --git a/test/test_manifest.json b/test/test_manifest.json index ab8a618c0..5cf266c63 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -227,6 +227,12 @@ "rounds": 1, "type": "load" }, + { "id": "scan-bad", + "file": "pdfs/scan-bad.pdf", + "md5": "4cf988f01ab83f61aca57f406dfd6584", + "rounds": 1, + "type": "load" + }, { "id": "ibwa-bad", "file": "pdfs/ibwa-bad.pdf", "md5": "6ca059d32b74ac2688ae06f727fee755",