2014-11-16 14:57:38 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
import shutil
|
2014-11-20 04:19:45 +00:00
|
|
|
import unittest
|
2014-11-16 14:57:38 +00:00
|
|
|
|
|
|
|
from PIL import Image, ImageChops
|
|
|
|
from test import Common
|
|
|
|
|
|
|
|
class BrowserTests(Common):
|
|
|
|
TEST_DATA_DIR = os.path.join(Common.TEST_DIR, 'browser_tests')
|
|
|
|
|
|
|
|
DEFAULT_PDF2HTMLEX_ARGS = [
|
|
|
|
'--fit-width', 800,
|
|
|
|
'--last-page', 1,
|
|
|
|
'--embed', 'fi', # avoid base64 to make it faster
|
|
|
|
]
|
|
|
|
|
|
|
|
BROWSER_WIDTH=800
|
|
|
|
BROWSER_HEIGHT=1200
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def setUpClass(cls):
|
2014-11-18 15:34:48 +00:00
|
|
|
pass
|
2014-11-16 14:57:38 +00:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def tearDownClass(cls):
|
|
|
|
pass
|
|
|
|
|
2015-03-17 11:07:05 +00:00
|
|
|
def run_test_case(self, filename, pdf2htmlEX_args=[], page_must_load=True):
|
2014-11-16 14:57:38 +00:00
|
|
|
basefilename, extension = os.path.splitext(filename)
|
2016-09-26 15:14:06 +00:00
|
|
|
self.assertEquals(extension.lower(), '.pdf', 'Input file is not PDF')
|
2014-11-16 14:57:38 +00:00
|
|
|
|
2016-09-26 15:14:06 +00:00
|
|
|
htmlfilename = basefilename + '.html'
|
2014-11-16 14:57:38 +00:00
|
|
|
ref_htmlfolder = os.path.join(self.TEST_DATA_DIR, basefilename)
|
|
|
|
ref_htmlfilename = os.path.join(ref_htmlfolder, htmlfilename)
|
2016-09-26 14:30:38 +00:00
|
|
|
out_htmlfilename = os.path.join(self.OUTDIR, htmlfilename)
|
2014-11-16 14:57:38 +00:00
|
|
|
|
2016-09-26 16:02:07 +00:00
|
|
|
pdf2htmlEX_args = self.DEFAULT_PDF2HTMLEX_ARGS + [
|
2014-11-16 14:57:38 +00:00
|
|
|
os.path.join(self.TEST_DATA_DIR, filename),
|
2016-09-26 16:02:07 +00:00
|
|
|
htmlfilename ]
|
2014-11-16 14:57:38 +00:00
|
|
|
result = self.run_pdf2htmlEX(pdf2htmlEX_args)
|
2016-09-26 15:14:06 +00:00
|
|
|
|
2014-11-16 14:57:38 +00:00
|
|
|
self.assertIn(htmlfilename, result['output_files'], 'HTML file is not generated')
|
|
|
|
|
|
|
|
if self.GENERATING_MODE:
|
|
|
|
# copy generated html files
|
|
|
|
shutil.rmtree(ref_htmlfolder, True)
|
2016-09-26 14:30:38 +00:00
|
|
|
shutil.copytree(self.OUTDIR, ref_htmlfolder)
|
2014-11-16 14:57:38 +00:00
|
|
|
return
|
|
|
|
|
2016-09-26 15:14:06 +00:00
|
|
|
pngfilename_out = os.path.join(self.PNGDIR, basefilename + '.out.png')
|
|
|
|
self.generate_image(out_htmlfilename, pngfilename_out)
|
|
|
|
out_img = Image.open(pngfilename_out)
|
2014-11-16 14:57:38 +00:00
|
|
|
|
2016-09-26 15:14:06 +00:00
|
|
|
pngfilename_ref = os.path.join(self.PNGDIR, basefilename + '.ref.png')
|
|
|
|
self.generate_image(ref_htmlfilename, pngfilename_ref, page_must_load=page_must_load)
|
|
|
|
ref_img = Image.open(pngfilename_ref)
|
2014-11-16 14:57:38 +00:00
|
|
|
|
|
|
|
diff_img = ImageChops.difference(ref_img, out_img);
|
|
|
|
|
2015-03-17 09:31:19 +00:00
|
|
|
diff_bbox = diff_img.getbbox()
|
|
|
|
if diff_bbox is not None:
|
|
|
|
diff_size = (diff_bbox[2] - diff_bbox[0]) * (diff_bbox[3] - diff_bbox[1])
|
|
|
|
img_size = ref_img.size[0] * ref_img.size[1]
|
2016-09-26 15:14:06 +00:00
|
|
|
# save the diff image (http://stackoverflow.com/questions/15721484):
|
2016-09-26 14:30:38 +00:00
|
|
|
diff_file_name = os.path.join(self.PNGDIR, basefilename + '.diff.png')
|
|
|
|
diff_img.convert('RGB').save(diff_file_name)
|
|
|
|
self.fail(('PNG files %s and %s differ by <= %d pixels, (%f%% of %d pixels in total), '+
|
|
|
|
'difference: %s') %
|
2016-09-26 15:14:06 +00:00
|
|
|
(pngfilename_out, pngfilename_ref,
|
2016-09-26 14:30:38 +00:00
|
|
|
diff_size, 1.0*diff_size/img_size, img_size, diff_file_name))
|
2014-11-16 14:57:38 +00:00
|
|
|
|
2014-11-20 04:19:45 +00:00
|
|
|
@unittest.skipIf(Common.GENERATING_MODE, 'Do not auto generate reference for test_fail')
|
|
|
|
def test_fail(self):
|
2014-12-18 15:49:53 +00:00
|
|
|
# The HTML reference is generated manually, which mismatches the PDF
|
2014-11-20 04:19:45 +00:00
|
|
|
# To test if the environment can detect any errors
|
|
|
|
# E.g. when network is down, 404 message is shown for any HTML message
|
|
|
|
with self.assertRaises(AssertionError):
|
2015-03-17 11:07:05 +00:00
|
|
|
self.run_test_case('test_fail.pdf', page_must_load=False)
|
2014-11-20 04:19:45 +00:00
|
|
|
|
2014-11-16 14:57:38 +00:00
|
|
|
def test_basic_text(self):
|
|
|
|
self.run_test_case('basic_text.pdf')
|
|
|
|
|
|
|
|
def test_geneve_1564(self):
|
|
|
|
self.run_test_case('geneve_1564.pdf')
|
|
|
|
|
|
|
|
def test_text_visibility(self):
|
2014-11-18 17:05:26 +00:00
|
|
|
self.run_test_case('text_visibility.pdf', ['--correct-text-visibility', 1])
|
2014-11-16 14:57:38 +00:00
|
|
|
|
2014-12-18 15:49:53 +00:00
|
|
|
def test_process_form(self):
|
|
|
|
self.run_test_case('with_form.pdf', ['--process-form', 1])
|
|
|
|
|
2015-05-03 04:08:03 +00:00
|
|
|
def test_invalid_unicode_issue477(self):
|
|
|
|
self.run_test_case('invalid_unicode_issue477.pdf')
|
2015-05-03 08:45:25 +00:00
|
|
|
|
|
|
|
def test_svg_background_with_page_rotation_issue402(self):
|
|
|
|
self.run_test_case('svg_background_with_page_rotation_issue402.pdf', ['--bg-format', 'svg'])
|
2015-05-03 11:13:45 +00:00
|
|
|
|
|
|
|
def test_fontfile3_opentype(self):
|
|
|
|
self.run_test_case('fontfile3_opentype.pdf', ['-l', 1])
|