108 lines
3 KiB
Python
108 lines
3 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()):
|
|
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))
|
|
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()
|
|
|
|
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']
|
|
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()
|
|
|