Exemple #1
0
def watermarkAndSave(figureName, outputPath, subtitle=None, verticalLabel=40):
    # CREATE WATERMARK AND SAVE PDF FILE;

    watermark = canvas.Canvas("dummy.pdf")
    watermark.setFont("Helvetica", 20)
    watermark.drawString(10, verticalLabel, figureName)

    if subtitle:
        watermark.setFont("Helvetica", 14)
        watermark.drawString(20, verticalLabel - 20, subtitle)
    watermark.save()

    #outputPath = "graphs/TGONDIILOCI_%s.pdf" % gene


    # JOIN WATERMARK WITH OUTPUT
    base = pdfrw.PdfReader(outputPath)
    watermark = pdfrw.PdfReader("dummy.pdf").pages[0]

    merger = pdfrw.PageMerge(base.pages[0])
    merger.add(watermark).render()
    writer = pdfrw.PdfWriter()
    writer.write(outputPath, base)

    os.remove("dummy.pdf")
Exemple #2
0
def print_on_layout(report_path, layout_path):
    if not pdfrw:
        raise XlwingsError(
            "Couldn't find the 'pdfrw' package, which is required when using 'layout'."
        )
    report = pdfrw.PdfReader(report_path)
    layout = pdfrw.PdfReader(layout_path)

    for ix, page in enumerate(report.pages):
        if len(layout.pages) == 1:
            # Same layout for whole report
            layout_page_ix = 0
        elif len(report.pages) == len(layout.pages):
            # Every report page has a corresponding page in the layout
            layout_page_ix = ix
        else:
            raise XlwingsError(
                "The layout PDF must either be a single page or have the "
                f"same number of pages as the report (report: {len(report.pages)}, "
                f"layout: {len(layout.pages)})")
        merge = pdfrw.PageMerge().add(layout.pages[layout_page_ix])[0]
        pdfrw.PageMerge(page).add(merge, prepend=True).render()
    # Changing log level as the exported PDFs from Excel aren't fully compliant and
    # would log the following:
    # [WARNING] tokens.py:221 Did not find PDF object (12, 0) (...)
    logging.getLogger("pdfrw").setLevel(logging.CRITICAL)
    pdfrw.PdfWriter(report_path, trailer=report).write()
Exemple #3
0
    def __add__(self, other):
        if not self.pdf_stream:
            return other

        writer = pdfrw.PdfWriter()

        self_path = os.path.join(current.request.folder, "temp",
                                 uuid.uuid4().hex + ".pdf")
        other_path = os.path.join(current.request.folder, "temp",
                                  uuid.uuid4().hex + ".pdf")

        with open(self_path, "wb+") as f:
            f.write(self.pdf_stream)

        with open(other_path, "wb+") as f:
            f.write(other.pdf_stream)

        writer.addpages(pdfrw.PdfReader(self_path).pages)
        writer.addpages(pdfrw.PdfReader(other_path).pages)

        new_final_path = os.path.join(current.request.folder, "temp",
                                      uuid.uuid4().hex + ".pdf")
        writer.write(new_final_path)

        new_obj = self.__class__()
        with open(new_final_path, "rb+") as f:
            new_obj.pdf_stream = f.read()

        os.remove(self_path)
        os.remove(other_path)
        os.remove(new_final_path)

        return new_obj
def watermark_it(file_to_be_watermarked, file_containing_watermark):
    # Reading the file which has to be watermarked and storing it as an object
    base_file_object = pdfrw.PdfReader(file_to_be_watermarked)

    # Initialising a writer object
    writer_object = pdfrw.PdfWriter()

    # Reading the file which contains the watermark and storing it as an object
    watermark_object = pdfrw.PdfReader(file_containing_watermark)

    # Extracting the watermark from the watermark object
    watermark = watermark_object.pages[0]

    total_pages_in_base_file = len(base_file_object.pages)

    # Main logic to add watermark to all pages of the pdf
    for page in range(total_pages_in_base_file):

        # Creating a merge object for all the pages of the pdf
        merge_object = pdfrw.PageMerge(base_file_object.pages[page])

        # Adding the watermark to all the pages through the merge object
        merge_object.add(watermark).render()

    # Creating an output file with modified name
    watermarked_output = (
        "watermarked_" + file_to_be_watermarked.split(".pdf")[0] + ".pdf"
    )

    # Writing the merged base file object to the output file
    writer_object.write(watermarked_output, base_file_object)

    print("Your pdf file has been successfully watermarked!!!!")
def write_fillable_pdf(input_pdf_path, output_pdf_path, out_path, data_dict):
    ANNOT_KEY = '/Annots'
    ANNOT_FIELD_KEY = '/T'
    ANNOT_VAL_KEY = '/V'
    ANNOT_RECT_KEY = '/Rect'
    SUBTYPE_KEY = '/Subtype'
    WIDGET_SUBTYPE_KEY = '/Widget'
    try:
        template_pdf = pdfrw.PdfReader(input_pdf_path)
    except:
        try:
            template_path = out_path + 'template.pdf'
            req = requests.get(input_pdf_path, timeout=4)
            with open(template_path, 'wb') as f:
                f.write(req.content)
            template_pdf = pdfrw.PdfReader(template_path)
        except:
            femaSetProxies()
            template_path = out_path + 'template.pdf'
            template_pdf = pdfrw.PdfReader(template_path)
    try:
        template_pdf.Root.AcroForm.update(pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject('true')))
    except:
        pass
    annotations = template_pdf.pages[0][ANNOT_KEY]
    for annotation in annotations:
        if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
            if annotation[ANNOT_FIELD_KEY]:
                key = annotation[ANNOT_FIELD_KEY][1:-1]
                if key in data_dict.keys():
                    annotation.update(
                        pdfrw.PdfDict(V='{}'.format(data_dict[key]))
                    )
    pdfrw.PdfWriter().write(output_pdf_path, template_pdf)
Exemple #6
0
def write_fillable_pdf(input_pdf_path, output_pdf_path, data_dict,
                       signature_path):
    pdf = pdfrw.PdfReader(input_pdf_path)
    annotations = pdf.pages[0][ANNOT_KEY]
    for annotation in annotations:
        if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
            if annotation[ANNOT_FIELD_KEY]:
                key = annotation[ANNOT_FIELD_KEY][1:-1]
                if key in data_dict.keys():
                    if data_dict[key] == '/YES':
                        annotation.update(
                            pdfrw.PdfDict(AS=pdfrw.PdfName('On'),
                                          V=pdfrw.PdfName('On')))
                    else:
                        annotation.update(
                            pdfrw.PdfDict(V='{}'.format(data_dict[key])))

    sgn = pdfrw.PageMerge().add(pdfrw.PdfReader(signature_path).pages[0])[0]
    sgn.scale(0.3)
    sgn.y += 100
    sgn.x += 380

    pdfrw.PageMerge(pdf.pages[0]).add(sgn, prepend='underneath').render()

    pdf.Root.AcroForm.update(
        pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject('true')))
    pdfrw.PdfWriter().write(output_pdf_path, pdf)
def getLinks(filename, args, dirpath):

    links = []
    fullname = os.path.join(dirpath or '', filename)
    fil = os.path.basename(filename)
    href = 'Unknown error opening this file.'
    page = 'n/a'

    try:
        PDF = pdfrw.PdfReader(fullname)
        pages = PDF.Root.Pages.Kids
    except ValueError:
        # This might be an encrypted file. Try decrypting it.
        try:
            subprocess.call(['qpdf', '--decrypt', fullname, fullname + '.new'])
        except FileNotFoundError:
            print('qpdf is not installed. Could not attempt to decrypt ' +
                  filename)
            href = 'Could not open - possibly encrypted file.'
            return [{'filename': fil, 'href': href, 'page': page}]

        # Read in and then delete the new unencrypted file
        PDF = pdfrw.PdfReader(fullname + '.new')
        os.remove(fullname + '.new')

        if not PDF.Encrypt:
            pages = PDF.Root.Pages.Kids
            print('Temporarily decrypted ' + filename)

    except:
        print('Unknown error opening ' + os.path.basename(filename))
        return [{'filename': fil, 'href': href, 'page': page}]

    if PDF.Encrypt:
        print('Could not decrypt ' + filename)
        href = 'Cannot get URLs from encrypted file.'
        return [{'filename': fil, 'href': href, 'page': page}]

    for index, page in enumerate(pages):
        if '/Annots' in page:
            ann = page['/Annots']
            for a in ann:
                if '/A' in a:
                    if '/URI' in a['/A']:
                        if not PDF.Encrypt:
                            links.append({
                                'filename': os.path.basename(filename),
                                'href': a['/A']['/URI'][1:-1],
                                'page': (index + 1)
                            })
                        else:
                            links.append({
                                'filename': os.path.basename(filename),
                                'href': 'Cannot get URL from encrypted file.',
                                'page': (index + 1)
                            })

    # Return a list of dicts full of link info
    return links
Exemple #8
0
def overlayCanvas2Pdf(canvasBuffer, underneath, inFilePath):
    canvasBuffer.seek(0)
    pdfOverlay = pdfrw.PdfReader(canvasBuffer)
    overlayPage = pdfrw.PageMerge().add(pdfOverlay.pages[0])[0]
    pdfInput = pdfrw.PdfReader(inFilePath)
    for page in pdfInput.pages:
        pdfrw.PageMerge(page).add(overlayPage, prepend=underneath).render()
    #
    return pdfInput
Exemple #9
0
def combine_pdf(pptx_filename):
    pdf_filename = pptx_filename.replace(".pptx", ".pdf")
    pdf_report_pages = pdfrw.PdfReader(pdf_filename).pages
    pdf_template_pages = pdfrw.PdfReader('input_data/pdf_template.pdf').pages
    outdata = pdfrw.PdfWriter('output_data/plain_with_template.pdf')
    outdata.addpage(pdf_template_pages[0])
    outdata.addpages(pdf_report_pages)
    outdata.addpage(pdf_template_pages[1])
    outdata.write()
def merge(overlay_canvas: io.BytesIO, template_path: str) -> io.BytesIO:
    template_pdf = pdfrw.PdfReader(template_path)
    overlay_pdf = pdfrw.PdfReader(overlay_canvas)
    for page, data in zip(template_pdf.pages, overlay_pdf.pages):
        overlay = pdfrw.PageMerge().add(data)[0]
        pdfrw.PageMerge(page).add(overlay).render()
    form = io.BytesIO()
    pdfrw.PdfWriter().write(form, template_pdf)
    form.seek(0)
    return form
Exemple #11
0
 def merge(overlay_canvases, template_path):
     template_pdf = pdfrw.PdfReader(template_path)
     overlay_pdfs = [pdfrw.PdfReader(x) for x in overlay_canvases]
     for page, data in zip(template_pdf.pages, overlay_pdfs):
         overlay = pdfrw.PageMerge().add(data.pages[0])[0]
         pdfrw.PageMerge(page).add(overlay).render()
     form = io.BytesIO()
     pdfrw.PdfWriter().write(form, template_pdf)
     form.seek(0)
     return form
    def merge_pdfs(self, form_pdf, overlay_pdf, output):
        form = pdfrw.PdfReader(form_pdf)
        olay = pdfrw.PdfReader(overlay_pdf)

        for form_page, overlay_page in zip(form.pages, olay.pages):
            merge_obj = pdfrw.PageMerge()
            overlay = merge_obj.add(overlay_page)[0]
            pdfrw.PageMerge(form_page).add(overlay).render()

        writer = pdfrw.PdfWriter()
        writer.write(output, form)
Exemple #13
0
def test_merging(template_stream):
    obj_one = _PyPDFForm()
    obj_two = _PyPDFForm()

    obj_one.stream = template_stream
    obj_two.stream = template_stream

    result = pdfrw.PdfReader(fdata=(obj_one + obj_two).stream)

    assert len(
        result.pages) == len(pdfrw.PdfReader(fdata=template_stream).pages) * 2
Exemple #14
0
def merge(overlay_canvas: io.BytesIO, template_path: str, page) -> io.BytesIO:
    template_pdf = pdfrw.PdfReader(template_path)
    overlay_pdf = pdfrw.PdfReader(overlay_canvas)
    data = overlay_pdf.pages[0]
    for page in [template_pdf.pages[page], ]:
        overlay = pdfrw.PageMerge().add(data)[0]
        pdfrw.PageMerge(page).add(overlay).render()
    form = io.BytesIO()
    pdfrw.PdfWriter().write(form, template_pdf)
    form.seek(0)
    return form
Exemple #15
0
def signaturemerger(path, signature, output, data_dict):
    base_pdf = pdfrw.PdfReader(path)
    signature_pdf = pdfrw.PdfReader(signature)
    mark = signature_pdf.pages[0]

    merger = pdfrw.PageMerge(base_pdf.pages[2])
    merger.add(mark).render()

    annotate_pdf(base_pdf, data_dict)

    writer = pdfrw.PdfWriter()
    writer.write(output, base_pdf)
Exemple #16
0
 def merge_pdfs(self, form_pdf, output):
     """
     Merge the specified fillable form PDF with the 
     overlay PDF and save the output
     """
     form = pdfrw.PdfReader(form_pdf)
     olay = pdfrw.PdfReader(self.tmp)
     for form_page, overlay_page in zip(form.pages, olay.pages):
         merge_obj = pdfrw.PageMerge()
         overlay = merge_obj.add(overlay_page)[0]
         pdfrw.PageMerge(form_page).add(overlay).render()
     writer = pdfrw.PdfWriter()
     writer.write(output, form)
Exemple #17
0
def main(input_paths):
    if len(input_paths) > 2:
        raise ValueError('program only accepts 1 or 2 files')

    input_file_basename = os.path.basename(input_paths[0])
    output_path = '{}-sorted{}'.format(
        os.path.splitext(input_file_basename)[0],
        os.path.splitext(input_file_basename)[1])
    out_data = pdfrw.PdfWriter(output_path)

    if len(input_paths) == 2:
        odd_data = pdfrw.PdfReader(input_paths[0])
        even_data = pdfrw.PdfReader(input_paths[1])

        if len(odd_data.pages) != len(even_data.pages):
            raise RuntimeError(
                'The number of pages in the input files are unequal. '
                'Something probable went wrong during the scan. Please check the '
                'input files and try again.')

        current_even_page = list(range(0, len(even_data.pages)))
        for current_odd_page in range(0, len(odd_data.pages)):
            out_data.addpage(odd_data.pages[current_odd_page])
            out_data.addpage((even_data.pages[current_even_page.pop()]
                              ))  # in practice .pop() reverses the list

        out_data.write()
    elif len(input_paths) == 1:
        in_data = pdfrw.PdfReader(input_paths[0])

        if len(in_data.pages) % 2 != 0:
            raise RuntimeError(
                'There are an uneven number of pages in the PDF file. '
                'Something must have gone wrong during the scan. Please check the '
                'input file and try again.')

        all_pages = len(in_data.pages)
        half_pages = all_pages // 2
        odd_pages = list(range(0, half_pages))

        even_pages = list(reversed(range(half_pages, all_pages)))

        sorted_pages = []
        for page in range(0, half_pages):
            sorted_pages.append(odd_pages[page])
            sorted_pages.append(even_pages[page])

        for page in sorted_pages:
            out_data.addpage(in_data.pages[page])

        out_data.write()
Exemple #18
0
    def draw_image(self,
                   page_number,
                   image_file,
                   x,
                   y,
                   width,
                   height,
                   rotation=0):
        image_path = os.path.join(current.request.folder, "temp",
                                  uuid.uuid4().hex + ".jpg")
        with open(image_path, "wb+") as f:
            f.write(image_file.read())

        if rotation:
            image = Image.open(image_path)
            image.rotate(rotation, expand=True).save(image_path)

        layer_path = os.path.join(current.request.folder, "temp",
                                  uuid.uuid4().hex + ".pdf")

        canv = canvas.Canvas(layer_path,
                             pagesize=(self._LAYER_SIZE_X, self._LAYER_SIZE_Y))
        canv.drawImage(image_path, x, y, width=width, height=height)
        canv.save()

        layer = pdfrw.PdfReader(layer_path)
        output_file = pdfrw.PdfFileWriter()

        input_path = os.path.join(current.request.folder, "temp",
                                  uuid.uuid4().hex + ".pdf")
        with open(input_path, "wb+") as f:
            f.write(self.pdf_stream)

        input_file = pdfrw.PdfReader(input_path)

        for i in range(len(input_file.pages)):
            if i == page_number - 1:
                merger = pdfrw.PageMerge(input_file.pages[i])
                merger.add(layer.pages[0]).render()

        output_file.write(self._final_path_with_image, input_file)

        with open(self._final_path_with_image, "rb+") as f:
            self.pdf_stream = f.read()

        os.remove(image_path)
        os.remove(layer_path)
        os.remove(input_path)
        os.remove(self._final_path_with_image)

        return self
Exemple #19
0
def every_other(vouch_list: str, sign: io.BytesIO) -> io.BytesIO:
    v = pdfrw.PdfReader(vouch_list)
    pages = v.pages
    sign_page = pdfrw.PdfReader(sign).pages[0]
    writer = pdfrw.PdfWriter()

    for page in range(len(pages)):
        writer.addpage(pages[page])
        writer.addpage(sign_page)

    form = io.BytesIO()
    writer.write(form)
    form.seek(0)
    return form
Exemple #20
0
def print_annotation_values(input_pdf_path, data_dict):
    template_pdf = pdfrw.PdfReader(input_pdf_path)
    annotations = template_pdf.pages[0][ANNOT_KEY]

    for annotation in annotations:
        if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
            if annotation[ANNOT_FIELD_KEY]:
                key = annotation[ANNOT_FIELD_KEY][1:-1]

                if "box" not in annotation["/T"]:
                    print(annotation["/T"])
                    print(annotation["/V"])
                    print(annotation["/AP"])
                    print("#" * 30)

    for annotation in annotations:
        if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
            if annotation[ANNOT_FIELD_KEY]:
                key = annotation[ANNOT_FIELD_KEY][1:-1]

                if "box" in annotation["/T"]:
                    print(annotation["/T"])
                    print(annotation["/V"])
                    print(annotation["/AP"])
                    print("#" * 30)
Exemple #21
0
def create_1099(form, recipient_path, template_path):
    data_dict = {
        'payer_details':
        form[PAYER][NAME] + '\n' + form[PAYER][ADDRESS] + '\n' +
        form[PAYER][LOCATION],
        'recipient_name':
        form[RECIPIENT][NAME],
        'street_address':
        form[RECIPIENT][ADDRESS],
        'location_details':
        form[RECIPIENT][LOCATION],
        'field_3':
        str(form[USD_VALUE]),  # other income
        'field_18_a':
        '0',  # state income a
        'field_18_b':
        '0'  # statw income b
    }
    template_pdf = pdfrw.PdfReader(template_path[0])
    annotations = template_pdf.pages[0][ANNOT_KEY]
    for annotation in annotations:
        if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
            if annotation[ANNOT_FIELD_KEY]:
                key = annotation[ANNOT_FIELD_KEY][1:-1]
                if key in data_dict.keys():
                    annotation.update(
                        pdfrw.PdfDict(V='{}'.format(data_dict[key])))
    pdfrw.PdfWriter().write(os.path.join(recipient_path, template_path[1]),
                            template_pdf)
Exemple #22
0
    def _assign_uuid(self, output_stream: bytes, editable: bool) -> bytes:
        """Append UUIDs to all elements of the PDF form."""

        _uuid = self._uuid

        generated_pdf = pdfrw.PdfReader(fdata=output_stream)

        for element in self._iterate_elements(generated_pdf):
            if editable:
                update_obj = pdfrw.PdfDict(T="{}_{}".format(
                    element[self._ANNOT_FIELD_KEY][1:-1],
                    _uuid,
                ), )
            else:
                update_obj = pdfrw.PdfDict(
                    T="{}_{}".format(
                        element[self._ANNOT_FIELD_KEY][1:-1],
                        _uuid,
                    ),
                    Ff=pdfrw.PdfObject(1),
                )

            element.update(update_obj)

        result_stream = BytesIO()
        pdfrw.PdfWriter().write(result_stream, generated_pdf)
        result_stream.seek(0)

        result = result_stream.read()
        result_stream.close()

        return result
Exemple #23
0
    def build_elements(self, pdf_stream: bytes) -> "_PyPDFForm":
        """Builds an element list."""

        if not pdf_stream:
            return self

        self._validate_template(pdf_stream)

        element_type_mapping = {
            "/Btn": "checkbox",
            "/Tx": "text",
        }

        _pdf = pdfrw.PdfReader(fdata=pdf_stream)

        for element in self._iterate_elements(_pdf):
            key = element[self._ANNOT_FIELD_KEY][1:-1]

            self.elements[key] = Element(
                element_name=key,
                element_type=element_type_mapping.get(
                    str(element[self._ANNOT_TYPE_KEY])),
            )

        return self
Exemple #24
0
def dump_fields(fp):
    '''
    Helper function to print out different fields in a PDF.

    Useful for generating keyfiles, debugging, etc.
    '''

    template_pdf = pdfrw.PdfReader(fp)
    annotations = template_pdf.pages[0][ANNOT_KEY]
    
    for page in template_pdf.pages:
        annotations = page[ANNOT_KEY]
        for annotation in annotations:
            if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
                if annotation[ANNOT_FIELD_KEY]:
                    key = annotation[ANNOT_FIELD_KEY][1:-1]
                    type = annotation[ANNOT_FIELD_TYPE]
                    print (key, type)
                else:
                    print ('NOT ANNOT FIELD KEY')
                    if annotation['/AS']:
                        print ('Button', annotation['/AP']['/D'].keys(), annotation[PARENT_KEY][ANNOT_FIELD_KEY])
                    else:
                        print ('Text: ', annotation[PARENT_KEY][ANNOT_FIELD_KEY])
                        print (annotation[PARENT_KEY][ANNOT_VAL_KEY])
Exemple #25
0
def merge(overlay, basename):
    '''
    Merge the overlay with the original form, and return the result.
    '''

    input_pdf_path = os.path.join('templates', basename)

    template_pdf = pdfrw.PdfReader(input_pdf_path)
    overlay_pdf = pdfrw.PdfReader(overlay)
    for page, data in zip(template_pdf.pages, overlay_pdf.pages):
        overlay = pdfrw.PageMerge().add(data)[0]
        pdfrw.PageMerge(page).add(overlay).render()
    form = io.BytesIO()
    pdfrw.PdfWriter().write(form, template_pdf)
    form.seek(0)
    return form
Exemple #26
0
def do_buttons(basename, data_dict, keyfile):
    '''
    Some buttons are tricky because they're linked together
    by a single parent element that we need to update.
    
    Handle that case here.
    '''

    input_pdf_path = os.path.join('filled', basename)
    output_pdf_path = os.path.join('filled', basename)

    template_pdf = pdfrw.PdfReader(input_pdf_path)
    annotations = template_pdf.pages[0][ANNOT_KEY]
    
    value_to_readable = parse_keyfile(keyfile)

    for page in template_pdf.pages:
        annotations = page[ANNOT_KEY]
        for annotation in annotations:
            if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
                if not annotation[ANNOT_FIELD_KEY]:
                    parent_key = annotation[PARENT_KEY][ANNOT_FIELD_KEY]
                    if parent_key is None:
                        continue                            
                    parent_key = parent_key[1:-1]
                    if parent_key not in value_to_readable:
                        continue

                    if annotation['/AS']:
                        if 'BUTTONS' in data_dict:
                            for k, v in data_dict['BUTTONS']:
                                if k == value_to_readable[parent_key] and '/' + v in annotation['/AP']['/D'].keys():
                                    annotation[PARENT_KEY].update(pdfrw.PdfDict(V=v))

    pdfrw.PdfWriter().write(output_pdf_path, template_pdf)
    def write_fillable_pdf(self):
        template_pdf = pdfrw.PdfReader(self.conf["BLANK_CHAR_SHEET"])

        data_dict = self.create_character_data_dict()

        annotations = template_pdf.pages[0][self.conf["ANNOT_KEY"]]
        for annotation in annotations:
            if annotation["/Subtype"] == self.conf["WIDGET_SUBTYPE_KEY"]:
                if annotation[self.conf["ANNOT_KEY_field"]]:
                    key = annotation[
                        self.conf["ANNOT_KEY_field"]][1:-1].strip()
                    if key in data_dict.keys():
                        if (annotation[self.conf["ANNOT_FORM_type"]] ==
                                self.conf["ANNOT_FORM_button"]):
                            # button field i.e. a checkbox
                            annotation.update(
                                pdfrw.PdfDict(
                                    V=pdfrw.PdfName(data_dict[key]),
                                    AS=pdfrw.PdfName(data_dict[key]),
                                ))
                        elif (annotation[self.conf["ANNOT_FORM_type"]] ==
                              self.conf["ANNOT_FORM_text"]):
                            annotation.update(
                                pdfrw.PdfDict(V="{}".format(data_dict[key])))
        template_pdf.Root.AcroForm.update(
            pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject("true")))
        new_pdf_name = (
            f"{data_dict['CharacterName']}_{data_dict['Race'].replace(' ', '-')}"
            f"_{data_dict['ClassLevel'][:-3].replace(' ', '-')}"
            f"_{data_dict['Background'].replace(' ', '-')}")
        pdfrw.PdfWriter().write(
            f"pdfs/{new_pdf_name}.pdf",
            template_pdf,
        )
Exemple #28
0
def update_form(row_data, mapping, targetfile=None, template=None):
    '''
    Fills up form and returns a pdfrw PdfileWriter object. Works with an existing object if specified. If not, creates new
    :param row_data: Row data from excel file
    :param mapping: Dictionary that maps excel row with form field in pdf
    :param targetfile: Path to pdf file that needs to be filled
    :param template:
    :return:
    '''
    logger = logging.getLogger(__name__ + '.update_form')
    if template is None:
        if targetfile is not None:
            template = pdfrw.PdfReader(targetfile)
        else:
            raise Exception('Target file not included. Cannot create template')
    for page in range(len(template.pages)):
        annotations = template.pages[page]['/Annots']
        for item in annotations:
            if item['/Subtype'] == '/Widget':
                if item['/T']:
                    key = item['/T'][1:-1]
                    if key in mapping.keys():
                        if 'Check Box' in key:
                            if row_data[mapping[key]] == 'yes':
                                item.update(
                                    pdfrw.PdfDict(AS=pdfrw.PdfName('Yes')))
                            elif row_data[mapping[key]] == 'no':
                                item.update(
                                    pdfrw.PdfDict(AS=pdfrw.PdfName('No')))
                        else:
                            logger.debug('Textbox= {0}  Value= {1}'.format(
                                str(key), str(row_data[mapping[key]])))
                            item.update(
                                pdfrw.PdfDict(V=str(row_data[mapping[key]])))
    return template
Exemple #29
0
def fill_pdf_detached():
    global data_dict, FORM_KEYS_DETACHED, url_to_scrape
    pdf_template = pdfrw.PdfReader(
        'pdf/services/Contract_Template_Detached_V2.pdf')
    for page_pdf in pdf_template.pages:
        annotations = page_pdf['/Annots']
        if annotations is None:
            continue
        for annotation in annotations:
            if annotation['/Subtype'] == '/Widget':
                if annotation['/T']:
                    key = annotation['/T'][1:-1]
                    if re.search(r'.-[0-9]+', key):
                        key = key[:-2]
                    if key in data_dict:
                        if FORM_KEYS_DETACHED[key] == CHECKBOX_PDF_TYPE:
                            annotation.update(
                                pdfrw.PdfDict(AS=encode_pdf_string(
                                    data_dict[key], CHECKBOX_PDF_TYPE)))
                        else:
                            annotation.update(
                                pdfrw.PdfDict(V=encode_pdf_string(
                                    data_dict[key], STRING_PDF_TYPE)))
                    annotation.update(pdfrw.PdfDict(Ff=1))
    pdf_template.Root.AcroForm.update(
        pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject('true')))
    pdf_name = 'files/' + data_dict['property_details'] + '__' + data_dict['buyer_name'] \
               + '__' + date.today().strftime("%m-%d-%y") + '.pdf'
    pdfrw.PdfWriter().write(pdf_name, pdf_template)
    return pdf_name
Exemple #30
0
    def add_data_to_pdf(self, template_path, data):
        print('\nAdding data to pdf...')
        template = pdfrw.PdfReader(template_path)

        for page in template.pages:
            annotations = page['/Annots']
            if annotations is None:
                continue

            for annotation in annotations:
                #if annotation['/Subtype'] == ['/Widget']:
                if annotation['/T']:
                    key = annotation['/T'][1:-1]
                    print('Key: "{}"'.format(key))
                    if re.search(r'.-[0-9]+', key):
                        key = key[:-2]

                    if key in data:
                        print('Found Key: {}'.format(key))
                        annotation.update(
                            pdfrw.PdfDict(
                                V=self.encode_pdf_string(data[key], 'string')))
                    annotation.update(pdfrw.PdfDict(Ff=1))

        template.Root.AcroForm.update(
            pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject('true')))
        pdfrw.PdfWriter().write(self.temp_directory + "data.pdf", template)
        print('Pdf saved')

        return self.temp_directory + "data.pdf"