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'), ) 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 def process_fields(self): poppler_con = PopplerController(self.document.pdf.path) fields = poppler_con.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']) area = fdata['area'] field.pos_x = area['pos_x'] field.pos_y = area['pos_y'] field.width = area['width'] field.height = area['height'] field.fieldtype = 't' field.save() def page_post_save(sender, **kwargs): instance = kwargs.get('instance', None) if instance: instance.process_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