X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=rendertest%2Ftestpdfs.py;fp=rendertest%2Ftestpdfs.py;h=cb6344e963d51757a0f065edce1b8ea31eea3564;hp=0000000000000000000000000000000000000000;hb=f450343be0738a608569bee64e6bc37f5125c357;hpb=a4be97bc967c8aceac1c893cbbe307b23b603683
diff --git a/rendertest/testpdfs.py b/rendertest/testpdfs.py
new file mode 100644
index 0000000..cb6344e
--- /dev/null
+++ b/rendertest/testpdfs.py
@@ -0,0 +1,359 @@
+import Image
+import ImageChops
+import ImageFilter
+import sys
+import os
+import traceback
+from athana import getTALstr
+import random
+import md5
+
+filenames = []
+directories = ["pdfs"]
+
+SWFRENDER="swfrender"
+PDFTOPPM="pdftoppm"
+CONVERT="convert"
+PDF2SWF="pdf2swf"
+
+#COMPARE=["xpdf", PDF2SWF+" -s poly2bitmap"]
+#OUTPUTDIR = "results.poly2bitmap/"
+
+COMPARE=["xpdf", PDF2SWF+" -s convertgradients"]
+OUTPUTDIR = "results.pdf2swf/"
+
+#COMPARE=[PDF2SWF, PDF2SWF+" --flatten"]
+#OUTPUTDIR = "results.flatten/"
+
+counter = 1
+
+def randstr():
+ return md5.md5(str(random.random())).hexdigest()[0:8]
+
+def unlink(file):
+ try:
+ os.unlink(file)
+ except:
+ pass
+
+def system(command):
+ if ">" not in command:
+ if os.system(command + " > /tmp/log.txt 2>&1") & 0xff00:
+ error = open("/tmp/log.txt", "rb").read()
+ print error
+ return error
+ else:
+ if os.system(command) & 0xff00:
+ return "Unknown error in "+command
+
+class ConversionError:
+ def __init__(self, msg):
+ self.msg = msg
+ def __str__(self):
+ return self.msg
+
+class TooComplexError:
+ def __init__(self, msg):
+ self.msg = msg
+ def __str__(self):
+ return self.msg
+
+class BadMatch:
+ def __init__(self, msg):
+ self.msg = msg
+ def __str__(self):
+ return self.msg
+
+def formatException():
+ s = "Exception "+str(sys.exc_info()[0])
+ info = sys.exc_info()[1]
+ if info:
+ s += " "+str(info)
+ s += "\n"
+ for l in traceback.extract_tb(sys.exc_info()[2]):
+ s += " File \"%s\", line %d, in %s\n" % (l[0],l[1],l[2])
+ s += " %s\n" % l[3]
+ return s
+
+
+class PDFPage:
+ def __init__(self, filename, page, width, height):
+ self.filename = filename
+ self.page = page
+ self.rating = None
+ self.message = None
+ self.htmlmessage = None
+ self.file1 = None
+ self.file2 = None
+ self.file12 = None
+ self.html12 = None
+ self.htmldiff = None
+ self.width,self.height = width,height
+
+ def runtools(self, filename, page, file1, file2, file12):
+
+ badness = 0.0
+
+ if COMPARE[0] == "xpdf":
+ unlink("/tmp/test-%06d.ppm" % page)
+ error = system(PDFTOPPM + " -r 72 -f %d -l %d '%s' /tmp/test" % (page, page, filename))
+ if error and "supports 65536" in error:
+ raise TooComplexError(error)
+ if error:
+ raise ConversionError(error)
+ unlink(file2)
+ error = system(CONVERT + " /tmp/test-%06d.ppm %s" % (page, file2))
+ if error:
+ raise ConversionError(error)
+ unlink("/tmp/test-%06d.ppm" % page)
+ else:
+ unlink("/tmp/test.swf")
+ unlink("svp.ps")
+ error = system(COMPARE[0]+ " -Q 300 -p%d '%s' -o /tmp/test.swf" % (page, filename))
+ #system("mv svp.ps %s.ps" % randstr())
+ if error and "supports 65536" in error:
+ raise TooComplexError(error)
+ if error:
+ raise ConversionError(error)
+ unlink(file2)
+ error = system(SWFRENDER + " /tmp/test.swf -o %s" % file2)
+ if error:
+ raise ConversionError(error)
+ unlink("/tmp/test.swf")
+
+ unlink("/tmp/test.swf")
+ error = system(COMPARE[1]+ " -Q 300 -p%d '%s' -o /tmp/test.swf" % (page, filename))
+ if error:
+ raise ConversionError(error)
+ unlink(file1)
+ error = system(SWFRENDER + " /tmp/test.swf -o %s" % file1)
+ if error:
+ raise ConversionError(error)
+ unlink("/tmp/test.swf")
+
+ unlink(file12)
+ pic1 = Image.open(file1)
+ pic1.load()
+ self.width1 = pic1.size[0]
+ self.height1 = pic1.size[1]
+
+ pic2 = Image.open(file2)
+ pic2.load()
+ self.width2 = pic2.size[0]
+ self.height2 = pic2.size[1]
+
+ if abs(self.width1-self.width2)>5 or abs(self.height1!=self.height2)>5:
+ badness += 65536*abs(self.width2-self.width1)*max(self.height1,self.height2)+65536*abs(self.height2-self.height1)*max(self.width1,self.width2)
+
+ minx = min(self.width1,self.width2)
+ miny = min(self.height1,self.height2)
+
+ pic1 = pic1.crop((0,0,minx,miny))
+ pic1 = pic1.convert("RGB")
+ pic1 = pic1.filter(ImageFilter.BLUR)
+ pic2 = pic2.crop((0,0,minx,miny))
+ pic2 = pic2.convert("RGB")
+ pic2 = pic2.filter(ImageFilter.BLUR)
+
+ diffimage = ImageChops.difference(pic1,pic2)
+ diffimage.save(file12, "PNG")
+
+ # compute quadratical difference
+ diff = diffimage.histogram()
+ for i in range(1,128):
+ badness += (diff[i] + diff[256-i])*float(i*i)
+ badness += (diff[256+i] + diff[256+256-i])*float(i*i)
+ badness += (diff[512+i] + diff[512+256-i])*float(i*i)
+
+ badness /= (minx*miny)*3
+
+ return badness
+
+ def compare(self):
+ try:
+ global counter
+ self.file1 = str(counter) + ".png"
+ counter = counter + 1
+ self.file2 = str(counter) + ".png"
+ counter = counter + 1
+ self.file12 = str(counter) + ".png"
+ counter = counter + 1
+ self.rating = self.runtools(self.filename, self.page, OUTPUTDIR + self.file1, OUTPUTDIR + self.file2, OUTPUTDIR + self.file12)
+ except BadMatch:
+ self.rating = 65534.0
+ self.message = formatException()
+ print self.message
+ except ConversionError:
+ self.rating = 65535.0
+ self.message = formatException()
+ print self.message
+ except TooComplexError:
+ self.rating = 65536.0
+ self.message = formatException()
+ print self.message
+ except:
+ self.rating = 65537.0
+ self.message = formatException()
+ print self.message
+
+ def getsizes(self):
+ if self.message:
+ return ""
+ if abs(self.width1 - self.width2) > 5 or \
+ abs(self.height1 - self.height2) > 5:
+ return '%dx%d <-> %dx%d' % (self.width1, self.height1, self.width2, self.height2)
+ else:
+ return '%dx%d,%dx%d' % (self.width1, self.height1, self.width2, self.height2)
+
+ def generatehtml(self):
+ global OUTPUTDIR
+ global counter
+ self.html12 = str(counter) + ".html"
+ counter = counter + 1
+ self.htmldiff = str(counter) + ".html"
+ counter = counter + 1
+ fi = open(OUTPUTDIR + self.html12, "wb")
+ fi.write(getTALstr("""
+
+
+
+
+
+
+
+
+ | |
+pdf2swf Version | pdftoppm Version |
+
+
+
+""", {"self": self}))
+ fi.close()
+
+ fi = open(OUTPUTDIR + self.htmldiff, "wb")
+ fi.write(getTALstr("""
+
+
+
+
+
+
+
+
+
+
+""", {"self": self}))
+ fi.close()
+
+ if self.message:
+ self.htmlmessage = str(counter) + ".html"
+ counter = counter + 1
+ fi = open(OUTPUTDIR + self.htmlmessage, "wb")
+ fi.write(getTALstr("""
+
+
+
+
+
+""", {"self": self}))
+ fi.close()
+
+
+
+def compare_pages(page1,page2):
+ if page1.rating < page2.rating:
+ return 1
+ elif page1.rating > page2.rating:
+ return -1
+ else:
+ return 0
+
+
+def add_directory(directory):
+ if not os.path.isdir(directory):
+ print "bad directory:",directory
+ return
+ for file in os.listdir(directory):
+ global filenames
+ filename = os.path.join(directory, file)
+ if file.lower().endswith(".pdf"):
+ filenames += [filename]
+ print "+",filename
+ elif os.path.isdir(filename):
+ add_directory(filename)
+
+pages = []
+try:
+ os.mkdir(OUTPUTDIR)
+except: pass
+
+for file in filenames:
+ print "+",file
+
+for dir in directories:
+ add_directory(dir)
+
+for filename in filenames:
+ try:
+ unlink("/tmp/test.txt")
+ error = system(PDF2SWF + " -I %s -o /tmp/test.txt" % filename)
+ if error:
+ raise ConversionError(error)
+ fi = open("/tmp/test.txt", "rb")
+ for line in fi.readlines():
+ p = {}
+ for param in line.split(" "):
+ key,value = param.split("=")
+ p[key] = value
+ page = int(p["page"])
+ width = int(float(p["width"]))
+ height = int(float(p["height"]))
+ print filename, page, "%dx%d" % (width, height)
+ pdfpage = PDFPage(filename, page, width, height)
+ pdfpage.compare()
+
+ if width < 2000 and height < 2000:
+ pages += [pdfpage]
+
+ # only consider the first 3 pages
+ if page > 3:
+ break
+ fi.close()
+ except KeyboardInterrupt:
+ break
+ except:
+ pdfpage = PDFPage(filename, -1, -1, -1)
+ pdfpage.rating = 65536.0
+ pdfpage.message = formatException()
+ pages += [pdfpage]
+
+pages.sort(compare_pages)
+
+position = 1
+for page in pages:
+ page.generatehtml()
+ page.position = position
+ position = position + 1
+
+fi = open(OUTPUTDIR + "index.html", "wb")
+fi.write(getTALstr("""
+
+
+
+
+""", {"pages": pages}))
+fi.close()
+