Admin preview view now includes javascript tags provided by media, There are dependencies added for backbone and underscore in that specific admin page.
96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
import poppler
|
|
|
|
import pdfformfiller.models
|
|
import pdb
|
|
|
|
class PopplerController(object):
|
|
def __init__(self, pdf=""):
|
|
doc_path = self._get_pdf_path(pdf)
|
|
self.doc = self._load_poppler_doc(doc_path)
|
|
|
|
|
|
def _get_pdf_path(self, pdf):
|
|
import os
|
|
from django.conf import settings
|
|
|
|
search = [
|
|
os.path.abspath(pdf),
|
|
os.path.abspath(os.path.join(settings.STATIC_FORMS_ROOT, pdf)),
|
|
]
|
|
|
|
for path in search:
|
|
if os.path.isfile(path):
|
|
return path
|
|
|
|
def _load_poppler_doc(self, pdf_path):
|
|
return poppler.document_new_from_file('file://' + pdf_path, password=None)
|
|
|
|
|
|
def generate_page_images(self, pages=[], clear_page=True):
|
|
import cairo
|
|
import StringIO
|
|
|
|
page = self.doc.get_page(pages[0] if pages else 0)
|
|
|
|
width, height = page.get_size()
|
|
surface = cairo.ImageSurface(cairo.FORMAT_RGB24, int(width*2), int(height*2))
|
|
context = cairo.Context(surface)
|
|
context.scale(2, 2)
|
|
|
|
for page_num in pages or xrange(self.doc.get_n_pages()):
|
|
page = self.doc.get_page(page_num)
|
|
|
|
if clear_page:
|
|
self.clear_page(page)
|
|
|
|
context.set_source_rgb(1.0, 1.0, 1.0)
|
|
context.rectangle(0.0, 0.0, width*2, height*2)
|
|
context.fill()
|
|
|
|
page.render(context)
|
|
fd = StringIO.StringIO()
|
|
surface.write_to_png(fd)
|
|
fd.seek(0)
|
|
yield fd
|
|
|
|
|
|
def clear_page(self, page):
|
|
for field_mapping in page.get_form_field_mapping():
|
|
field = field_mapping.field
|
|
field_type = field.get_field_type().value_nick
|
|
|
|
if field_type == 'text':
|
|
field.text_set_text('')
|
|
elif field_type == 'button':
|
|
field.button_set_state(0)
|
|
|
|
|
|
def get_page_fields(self, page_num):
|
|
page = self.doc.get_page(page_num)
|
|
for field in page.get_form_field_mapping():
|
|
area = field.area
|
|
data = field.field
|
|
field_type = data.get_field_type()
|
|
|
|
if field_type.value_nick == 'text':
|
|
value = data.text_get_text()
|
|
elif field_type.value_nick == 'button':
|
|
value = data.button_get_state()
|
|
|
|
yield {
|
|
'name': data.get_name() or data.get_mapping_name() or data.get_partial_name(),
|
|
'value': value,
|
|
'type': field_type.value_nick,
|
|
'area': {
|
|
'pos_x': area.x1,
|
|
'pos_y': area.y1,
|
|
'width': area.x2 - area.x1,
|
|
'height': area.y2 - area.y1,
|
|
}
|
|
}
|
|
|
|
|
|
class PDFFormFillerPostSave(PopplerController):
|
|
def __init__(self, document):
|
|
pass
|
|
|