Admin preview view now includes javascript tags provided by media, There are dependencies added for backbone and underscore in that specific admin page.
114 lines
3.2 KiB
Python
114 lines
3.2 KiB
Python
import os
|
|
|
|
from django.db import models
|
|
from django.core.files import File
|
|
|
|
from pdfformfiller.controller import PopplerController
|
|
|
|
|
|
FIELD_TYPE_CHOICES = (
|
|
('t', 'Text'),
|
|
('c', 'Checkbox'),
|
|
('b', 'Button'),
|
|
)
|
|
|
|
|
|
class Document(models.Model):
|
|
name = models.CharField(max_length=64)
|
|
pdf = models.FileField(upload_to='pdfformfiller_pdf', blank=True)
|
|
|
|
def __unicode__(self):
|
|
return self.name
|
|
|
|
def process_pages(self):
|
|
poppler_con = PopplerController(self.pdf.path)
|
|
|
|
for page_num, image in enumerate(poppler_con.generate_page_images()):
|
|
page_width, page_height = poppler_con.doc.get_page(page_num).get_size()
|
|
try:
|
|
page = self.page_set.get(page_num=page_num)
|
|
except Page.DoesNotExist:
|
|
page = Page(document=self,
|
|
page_num=page_num,
|
|
name=self.name + (' page %d' % page_num),
|
|
width=page_width,
|
|
height=page_height)
|
|
page.image.save(
|
|
os.path.basename(self.pdf.path) + ('_page%03d.png' % page_num),
|
|
File(image)
|
|
)
|
|
|
|
|
|
def document_post_save(sender, **kwargs):
|
|
instance = kwargs.get('instance', None)
|
|
|
|
if instance:
|
|
instance.process_pages()
|
|
|
|
models.signals.post_save.connect(document_post_save, sender=Document)
|
|
|
|
|
|
class Page(models.Model):
|
|
document = models.ForeignKey('Document')
|
|
name = models.CharField(max_length=64, blank=True)
|
|
image = models.ImageField(upload_to='pdfformfiller_page')
|
|
page_num = models.SmallIntegerField()
|
|
width = models.FloatField()
|
|
height = models.FloatField()
|
|
|
|
def __unicode__(self):
|
|
return self.name
|
|
|
|
@property
|
|
def poppler(self):
|
|
if not hasattr(self, '_poppler'):
|
|
self._poppler = PopplerController(self.document.pdf.path)
|
|
return self._poppler
|
|
|
|
def extract_fields(self):
|
|
fields = self.poppler.get_page_fields(self.page_num)
|
|
|
|
for fdata in fields:
|
|
try:
|
|
field = self.formfield_set.get(name=fdata['name'])
|
|
except FormField.DoesNotExist:
|
|
field = FormField(page=self,
|
|
name=fdata['name'])
|
|
|
|
field.fieldtype = fdata['type'][0]
|
|
area = fdata['area']
|
|
field.pos_x = area['pos_x']
|
|
field.pos_y = area['pos_y']
|
|
field.width = area['width']
|
|
field.height = area['height']
|
|
field.save()
|
|
|
|
|
|
|
|
def page_post_save(sender, **kwargs):
|
|
instance = kwargs.get('instance', None)
|
|
if instance:
|
|
instance.extract_fields()
|
|
|
|
models.signals.post_save.connect(page_post_save, sender=Page)
|
|
|
|
|
|
class FormField(models.Model):
|
|
page = models.ForeignKey('Page')
|
|
name = models.CharField(max_length=255)
|
|
fieldtype = models.CharField(choices=FIELD_TYPE_CHOICES, max_length=1)
|
|
pos_x = models.FloatField()
|
|
pos_y = models.FloatField()
|
|
width = models.FloatField()
|
|
height = models.FloatField()
|
|
|
|
def __unicode__(self):
|
|
return self.name
|
|
|
|
def page_num(self):
|
|
return self.page.page_num
|
|
|
|
@classmethod
|
|
def create_from_poppler_field(cls, field):
|
|
return cls()
|
|
|