Ejemplo n.º 1
0
def solve_problems(pdf_file, pages, student_ids, problems, solve, copies_per_student):
    if solve < 0.01:
        # nothing to solve
        return

    with NamedTemporaryFile() as sol_file:
        pdf = canvas.Canvas(sol_file.name, pagesize=A4)

        for id, number_of_copies in zip(student_ids, copies_per_student):
            for _ in range(number_of_copies):
                generate_solution(pdf, pages, id, [p for p in problems if random.random() < solve])

                if pages % 2 == 1:
                    # for an odd number of pages, zesje adds a blank page at the end
                    pdf.showPage()

        pdf.save()

        exam_pdf = PdfReader(pdf_file)
        overlay_pdf = PdfReader(sol_file)

        for page_idx, exam_page in enumerate(exam_pdf.pages):
            overlay_merge = PageMerge().add(overlay_pdf.pages[page_idx])[0]
            exam_merge = PageMerge(exam_page).add(overlay_merge)
            exam_merge.render()

        PdfWriter(pdf_file.name, trailer=exam_pdf).write()
Ejemplo n.º 2
0
def makeA3(ipath, opath, onesided=False):
    """Take the first 4 (A4) pages of the input file and place them in
    "booklet" order on an A3 sheet (double-sided, short-side join).
    If <onesided> is <True>, or there are only two pages in the input file,
    place the first two (A4) pages on one side of an A3 sheet, the first
    page on the right-hand side.
    Note that the input pages do not have to be A4, the output will simply
    be twice as wide (as the first page). All input pages should have the same size.
    """
    ipages = PdfReader(ipath).pages
    # Make sure we have an even number of pages
    if len(ipages) & 1:
        ipages.append(None)
    fpage = PageMerge()
    fpage.add(ipages[0])
    width = fpage[0].w
    opages = []
    if onesided or len(ipages) == 2:
        p4 = ipages[1]
    else:
        p4 = ipages[3]
        bpage = PageMerge()
        bpage.add(ipages[1])
        bpage.add(ipages[2], prepend=True)
        bpage[0].x = width
        opages.append(bpage.render())
    if p4:
        fpage.add(p4)
    fpage[0].x = width
    opages.insert(0, fpage.render())
    PdfWriter().addpages(opages).write(opath)
Ejemplo n.º 3
0
def makeDraft(pdffile, folder=None, printername=None):
    """Make a "draft" version of the given pdf file by adding a watermark.
    Print this file and then delete it. The '.pdf' suffix may be omitted
    in <pdffile>, but the file itself must have this suffix.
    If <folder> is given, <pdffile> is the name of a (pdf-)file within that
    folder. Otherwise <pdffile> is the complete file path.
    If <printername> is given, it must be the name of a known printer.
    If no <printername> is given, the system default printer is used.
    """
    pdffile, filepath = _filecheck(pdffile, folder)
    if not filepath:
        return False

    wmarkfn = Configuration.getFormsDir('Draft.pdf')
    wmark = PageMerge().add(PdfReader(wmarkfn).pages[0])[0]
    underneath = True
    opath = os.path.join(os.path.dirname(filepath), "Entwurf.pdf")
    reader = PdfReader(filepath)
    for page in reader.pages:
        PageMerge(page).add(wmark, prepend=underneath).render()
    PdfWriter().write(opath, reader)
    rc = toPrinter(opath, printername=printername)
    if rc:
        # delete the draft file
        os.remove(opath)
    return rc
Ejemplo n.º 4
0
def main():
    selection, start_page_num, sb_or_count = io_check()
    print(u"稼動中...\n")
    print(u"AddText2PDF by WEN")

    assert path.exists('conf.ini')
    ini_file = 'conf.ini'
    ini_object = IniInfo(ini_file)

    # IO
    input_folder = ini_object.get_input_folder()
    input_file_list = [x for x in listdir(input_folder) if x.endswith('.pdf')]
    input_file = input_file_list[0]
    input_path = path.join(input_folder, input_file)

    output_folder = ini_object.get_output_folder()
    output_file = u'編集済み-' + input_file
    output_path = path.join(output_folder, output_file)

    source_pdf = PdfReader(input_path)
    total_page_num = int(source_pdf.Root.Pages.Count)
    for page_num in range(total_page_num):
        canvas_data = get_canvas_data(selection, sb_or_count,
                                      page_num + int(start_page_num),
                                      ini_object)
        wm_pdf = PdfReader(canvas_data)
        wm_obj = PageMerge().add(wm_pdf.pages[0])[0]
        PageMerge(source_pdf.pages[page_num]).add(wm_obj).render()
    output_data = BytesIO()
    PdfWriter().write(output_data, source_pdf)
    output_data.seek(0)

    save2pdf(output_data, output_path)
Ejemplo n.º 5
0
def adjust(page, margin=36, scale=4.8):
    info = PageMerge().add(page)
    x1, y1, x2, y2 = info.xobj_box
    viewrect = (margin, margin, x2 - x1 - 2 * margin, y2 - y1 - 2 * margin)
    page = PageMerge().add(page, viewrect=viewrect)
    page[0].scale(scale)
    return page.render()
Ejemplo n.º 6
0
 def _pdfrw_adjust(self, page):
     info = PageMerge().add(page)
     x1, y1, x2, y2 = info.xobj_box
     viewrect = (self.margin_x, self.margin_y, x2 - x1 - 2 * self.margin_x,
                 y2 - y1 - 2 * self.margin_y)
     page = PageMerge().add(page, viewrect=viewrect)
     page[0].scale(self.scale)
     return page.render()
Ejemplo n.º 7
0
    def watermark(self):
        ipdf = PdfReader('1.pdf')
        wpdf = PdfReader('watermark.pdf')
        wmark = PageMerge().add(wpdf.pages[0])[0]

        for page in ipdf.pages:
            PageMerge(page).add(wmark).render()

        PdfWriter().write('merged.pdf', ipdf)
Ejemplo n.º 8
0
 def splitPage(page):
     '''
     Split a page into two (left and right)
     '''
     # return two half of the page
     leftHalf = PageMerge().add(page, viewrect=(0, 0, 0.5, 1)).render()
     rightHalf = PageMerge().add(page, viewrect=(0.5, 0, 0.5, 1)).render()
     # page=[leftHalf, rightHalf]
     return leftHalf, rightHalf
Ejemplo n.º 9
0
def merge(overlay_canvas: io.BytesIO, template_path: str) -> io.BytesIO:
    template_pdf = PdfReader(template_path)
    overlay_pdf = PdfReader(overlay_canvas)
    for page, data in zip(template_pdf.pages, overlay_pdf.pages):
        overlay = PageMerge().add(data)[0]
        PageMerge(page).add(overlay).render()
    form = io.BytesIO()
    PdfWriter().write(form, template_pdf)
    form.seek(0)
    return form
Ejemplo n.º 10
0
    def sign(self, event):

        #save signature biometric data in meta headers and draw signature image to pdf
        try:
            #clear tkinter signature canvas
            self.tkinter_signature_canvas.delete("all")

            templete_bytes = BytesIO()
            templete_bytes.write(self.pdf_to_sign)

            templete_bytes.seek(0)

            # open templete,write biometric data and save to new virual file
            trailer = PdfReader(templete_bytes)
            #
            #
            #
            trailer.Info.biometric_date = str(self.biometric_data)
            PdfWriter(templete_bytes, trailer=trailer).write()

            # signature_canvas.drawPath()
            self.signature_canvas.save()

            #set position to 0
            self.singature_bytes.seek(0)
            templete_bytes.seek(0)

            #merge signature and templete dpf bytes
            signature = PageMerge().add(
                PdfReader(self.singature_bytes).pages[0])[0]
            # trailer = PdfReader(templete_bytes)

            #add signature to all pages
            for page in trailer.pages:
                PageMerge(page).add(signature).render()

            #save merged result to new res.pdf file

            res_bytes = BytesIO()
            # PdfWriter('res.pdf', trailer=trailer).write()
            PdfWriter(res_bytes, trailer=trailer).write()
            res_bytes.seek(0)
            self.bytes = res_bytes.getvalue()
            res_bytes.close()

        except Exception as e:
            print(e)
        finally:

            #clear global variables and define again
            self.singature_bytes.close()
            templete_bytes.close()
            self.reinit_global_var()

            self.localstatus = False
Ejemplo n.º 11
0
def adjust(page, params):
    scale, margin, is_vertical = params
    info = PageMerge().add(page)
    x1, y1, x2, y2 = info.xobj_box
    if is_vertical == 1:
        viewrect = (0, margin / scale, x2, y2 - 2 * margin / scale)
    else:
        viewrect = (margin / scale, 0, x2 - 2 * margin / scale, y2)
    page = PageMerge().add(page, viewrect=viewrect)
    page[0].scale(scale)
    return page.render()
Ejemplo n.º 12
0
def pdfWaterMark(files_folder):
    water_mark = PageMerge().add(
        PdfReader('%s/wtmrk.pdf' % files_folder).pages[0]
    )[0]

    trailer = PdfReader('%s/mergedPDF.pdf' % files_folder)

    for page in trailer.pages:
        PageMerge(page).add(water_mark, prepend='-u').render()

    PdfWriter("%s/resultPDF.pdf" % (files_folder), trailer=trailer).write()
Ejemplo n.º 13
0
def add_page_number(target_file):
    """Helper function to add page numbers to a pdf-file.

    Writes a pdf file containing page numbers.
    """

    from PyPDF2 import PdfFileReader
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import A4
    from pdfrw import PdfReader, PdfWriter, PageMerge

    tmp_pagenum = 'wmark_' + target_file

    # Create object for page numbers
    c = canvas.Canvas(
        tmp_pagenum,
        pagesize=A4,
    )

    # Read the target file
    input_pdf = PdfFileReader(open(target_file, 'rb'))

    # Count number of pages in the target file
    number_of_pages = input_pdf.getNumPages()

    # Loop through all pages in the target file and create a page number
    # in a new file. Not using
    for i in range(input_pdf.getNumPages()):
        text = '- Committee Pack, page ' + str(
            (i + 1)) + ' / ' + str(number_of_pages) + ' -'

        c.setFont("Helvetica", 7)
        c.drawString(
            20,
            8,
            text,
        )
        c.showPage()

    c.save()

    # Open the watermark file
    trailer = PdfReader(target_file)

    # Loop through the target file and append the page number
    for i, page in enumerate(trailer.pages):
        wmark = PageMerge().add(PdfReader(tmp_pagenum).pages[i])[0]

        PageMerge(page).add(wmark, prepend=True).render()
    PdfWriter(target_file, trailer=trailer).write()

    # Cleanup
    os.unlink(tmp_pagenum)
def merge_pdfs(form_pdf, overlay_pdf, output):
    """
    Merge the specified fillable form PDF with the  overlay PDF
    and save the output.
    """
    form = PdfReader(form_pdf)
    olay = PdfReader(overlay_pdf)
    for form_page, overlay_page in zip(form.pages, olay.pages):
        merge_obj = PageMerge()
        overlay = merge_obj.add(overlay_page)[0]
        PageMerge(form_page).add(overlay).render()
    writer = PdfWriter()
    writer.write(output, form)
Ejemplo n.º 15
0
def adicionaBackground(dadosFormatados):

    ipdf = PdfReader('resources/pdfs/sample.pdf')
    wpdf = PdfReader('resources/pdfs/cracha.pdf')

    wmark = PageMerge().add(wpdf.pages[0])[0]
    writer = PdfWriter()
    blank = wpdf.pages[0]
    PageMerge(ipdf.pages[0]).add(wmark).render()

    for i in range(len(dadosFormatados) - 1):
        writer.addpage(blank)

    writer.write('resources/pdfs/newfile.pdf')
Ejemplo n.º 16
0
 def _merge_overlay(self, overlay):
     """Merge the overlay into the template"""
     # open a copy of the template form to merge in
     self.form.seek(0)
     template = PdfReader(self.form)
     # merge the overlay and template
     overlay_pdf = PdfReader(overlay)
     for t_page, o_page in zip(template.pages, overlay_pdf.pages):
         overlay = PageMerge().add(o_page)[0]
         PageMerge(t_page).add(overlay).render()
     final_form = StringIO()
     PdfWriter().write(final_form, template)
     final_form.seek(0)
     return final_form
Ejemplo n.º 17
0
def create_match_sheet(match_num, blue_team=None, red_team=None, male=False,
        female=False, a_team=False, b_team=False, c_team=False):
    teams_canvas = canvas.Canvas("teams.pdf", pagesize=letter)
    teams_canvas.setLineWidth(3)
    xoffset, yoffset = 0, 0
    if male:
        teams_canvas.ellipse(
                3.2*inch + xoffset, 9.5*inch + yoffset,
                2.4*inch + xoffset, 9.1*inch + yoffset)
    xoffset = 4.23 * inch
    if female:
        teams_canvas.ellipse(
                3.2*inch + xoffset, 9.5*inch + yoffset,
                2.4*inch + xoffset, 9.1*inch + yoffset)
    yoffset = -.3 * inch
    if c_team:
        teams_canvas.ellipse(
                3.2*inch + xoffset, 9.5*inch + yoffset,
                2.4*inch + xoffset, 9.1*inch + yoffset)
    xoffset = 0
    if a_team:
        teams_canvas.ellipse(
                3.2*inch + xoffset, 9.5*inch + yoffset,
                2.4*inch + xoffset, 9.1*inch + yoffset)
    xoffset = 4.23/ 2 * inch
    if b_team:
        teams_canvas.ellipse(
                3.2*inch + xoffset, 9.5*inch + yoffset,
                2.4*inch + xoffset, 9.1*inch + yoffset)
    teams_canvas.setFont('Helvetica', 24)
    teams_canvas.drawString(1.7*inch, 7.8*inch, str(match_num))
    teams_canvas.setFont('Helvetica', 18)
    if blue_team:
        teams_canvas.drawString(.65*inch, 6.65*inch, blue_team)
    xoffset = 3.75*inch
    if red_team:
        teams_canvas.drawString(.65*inch + xoffset, 6.65*inch, red_team)
    teams_canvas.save()

    match_sheet_fn = '/home/user/dev/match_sheet/match_sheet.pdf'
    teams_fn = 'teams.pdf'
    output_fn = os.path.join(match_sheet_dir, 'match_%d.pdf' %(match_num))
    output_canvas = PageMerge().add(PdfReader(match_sheet_fn).pages[0])[0]
    trailer = PdfReader(teams_fn)

    for page in trailer.pages:
        PageMerge(page).add(output_canvas, prepend=True).render()
    PdfWriter().write(output_fn, trailer)
    return output_fn
Ejemplo n.º 18
0
def mark_pdf(clean_path, marked_path):
    """Draw rectangles around the boxes, lines, and characters in a document."""
    try:
        with open(os.path.join(clean_path)) as fp:
            parser = PDFParser(fp)
            pdf = PDFDocument(parser)
            parser.set_document(pdf)

            rsrcmgr = PDFResourceManager()
            laparams = LAParams()
            device = PDFPageAggregator(rsrcmgr, laparams=laparams)
            interpreter = PDFPageInterpreter(rsrcmgr, device)

            marked_dir, marked_fn = os.path.split(marked_path)
            rect_file = os.path.join(marked_dir, ".rects." + marked_fn)

            c = canvas.Canvas(rect_file)

            for i, page in enumerate(PDFPage.create_pages(pdf)):
                interpreter.process_page(page)
                layout = device.get_result()
                boxes = [obj for obj in layout if isinstance(obj, LTTextBox)]
                for box in boxes:
                    c.setLineWidth(1)
                    c.setStrokeColorRGB(1, 0, 0)
                    make_rectangle(c, box.bbox)
                    lines = [obj for obj in box if isinstance(obj, LTTextLine)]
                    for line in lines:
                        c.setLineWidth(0.5)
                        c.setStrokeColorRGB(0, 1, 0)
                        make_rectangle(c, line.bbox)
                        for char in line:
                            if isinstance(char, LTChar):
                                c.setLineWidth(0.3)
                                c.setStrokeColorRGB(0, 0, 1)
                                make_rectangle(c, char.bbox)
                c.showPage()
            c.save()

        pdf_content = PdfReader(clean_path)
        for i, page in enumerate(pdf_content.pages):
            rects = PageMerge().add(PdfReader(rect_file).pages[i])[0]
            PageMerge(page).add(rects).render()

        PdfWriter().write(marked_path, pdf_content)
        os.remove(rect_file)
    except Exception as e:
        print(e)
Ejemplo n.º 19
0
def filigrana(input_file,
              output_file="output.pdf",
              path_filigrana_ver="",
              path_filigrana_or=""):
    reader_input = PdfReader(input_file)
    writer_output = PdfWriter()
    page = reader_input.pages[0]
    w, h = sizepage(page)
    watermark_input = None
    watermark = None
    if int(w) > int(h):
        if path_filigrana_or == "":
            print(
                "Non hai fornito la corretta filigrana o hai dimenticato di fornirla."
            )
        else:
            watermark_input = PdfReader(path_filigrana_or)
            watermark = fixpage(watermark_input.pages[0], int(w), int(h))
    else:
        if path_filigrana_ver == "":
            print(
                "Non hai fornito la corretta filigrana o hai dimenticato di fornirla."
            )
        else:
            watermark_input = PdfReader(path_filigrana_ver)
            watermark = fixpage(watermark_input.pages[0], int(w), int(h))

    for current_page in range(len(reader_input.pages)):
        merger = PageMerge(reader_input.pages[current_page])
        merger.add(watermark).render()
    writer_output.write(output_file, reader_input)
Ejemplo n.º 20
0
def split(page):
    x, y, width, height = page.MediaBox
    if width > height:
        for x_pos in (0, 0.5):
            yield PageMerge().add(page, viewrect=(x_pos, 0, 0.5, 1)).render()
    else:
        yield page
Ejemplo n.º 21
0
def get_single_side_quire_page(pages):
    number_of_pages = len(pages)

    assert number_of_pages == round(QUIRE_SIZE / 2)

    half_index = round(number_of_pages / 2)

    rotate_all(180, pages[half_index:])

    result = PageMerge() + (x for x in pages if x is not None)

    width = result[0].w
    height = result[0].h

    for i in range(half_index):
        dx = i * width
        dy = height
        result[i].x += dx
        result[i].y += dy

    for i in range(half_index, number_of_pages):
        dx = (i - half_index) * width
        dy = 0
        result[i].x += dx
        result[i].y += dy

    return result.render()
Ejemplo n.º 22
0
def resize(outpages: List, output_size: List[int]) -> List:
    current_size = get_media_box_size(outpages)
    o = list(outpages)

    # rotate output_size if outpages would fit better
    out_ratio = output_size[0] / output_size[1]
    cur_ratio = current_size[0] / current_size[1]
    if out_ratio > 1 and cur_ratio <= 1 or out_ratio <= 1 and cur_ratio > 1:
        output_size = list(reversed(output_size))

    scale, x_margin, y_margin = calculate_margins(output_size, current_size)

    for idx, page in enumerate(outpages):
        page = PageMerge().add(page)

        # scale page
        page[0].scale(scale)
        page[0].x += x_margin
        page[0].y += y_margin

        # set new mediabox size
        page.mbox = [0, 0] + output_size

        # replace original with resized page
        o[idx] = page.render()

    return o
Ejemplo n.º 23
0
def create_watermark(waterpath, watermarkcontent):
    """创建PDF水印模板
    """
    # 使用reportlab来创建一个PDF文件来作为一个水印文件
    pdfmetrics.registerFont(TTFont('song', APILOG_PATH['pdfwaterfontPath']))
    if not isinstance(watermarkcontent, list):
        watermarkcontent = []
    while len(watermarkcontent) < 3:
        watermarkcontent.append(u'多维海拓')
    c = canvas.Canvas(waterpath, A1)
    c.rotate(45)
    fontsize = 20     # 水印字体大小
    fontAlpha = 0.05  # 水印字体透明度
    space = 80        # 水印间距
    c.setFont("song", fontsize)
    c.translate(0, -A1[1] * 0.5)
    width0 = c.stringWidth(text=watermarkcontent[0], fontName='song', fontSize=fontsize)
    width1 = c.stringWidth(text=watermarkcontent[1], fontName='song', fontSize=fontsize)
    width2 = c.stringWidth(text=watermarkcontent[2].replace('@', '[at]'), fontName='song', fontSize=fontsize)
    y = 0
    while y < A1[1]:
        x = 100
        while x < A1[0]:
            c.setFillAlpha(fontAlpha)
            c.drawString(x, y, watermarkcontent[0])
            x = x + width0 + space
            c.drawString(x, y, watermarkcontent[1])
            x = x + width1 + space
            c.drawString(x, y, watermarkcontent[2].replace('@', '[at]'))
            x = x + width2 + space
        y += 60
    c.save()
    pdf_watermark = PageMerge().add(PdfReader(waterpath).pages[0])[0]
    return pdf_watermark
Ejemplo n.º 24
0
def splitpage(page):
    """Splits a page in two
    """
    # We define half the page
    for x in (0, 0.5):
        # We return (yield) a generator, which in turn generates a collection later
        yield PageMerge().add(page, viewrect=(x, 0, 0.5, 1)).render()
Ejemplo n.º 25
0
def fixpage(*pages):
    """ Taken from example project in pdfrw.
    Puts two pages together into one
    """
    result = PageMerge() + (x for x in pages if x is not None)
    result[-1].x += result[0].w
    return result.render()
def splitpage(src):
    ''' Split a page into two (top and bottom)
    '''
    # Yield a result for each half of the page
    for y_pos in (0, 0.5):

        # Create a blank, unsized destination page.
        page = PageMerge()

        # add a portion of the source page to it as
        # a Form XObject.
        page.add(src, viewrect=(0, y_pos, 1, 0.5))

        # By default, the object we created will be
        # at coordinates (0, 0), which is the lower
        # left corner.  To move it up on the page
        # to the top, we simply use its height
        # (which is half the source page height) as
        # its y value.
        page[0].y = page[0].h

        # When we render the page, the media box will
        # encompass (0, 0) and all the objects we have
        # placed on the page, which means the output
        # page will be the same size as the input page.
        yield page.render()
Ejemplo n.º 27
0
    def add_date(self, xy, page, page_w, page_h):

        print('calling date_scale_and_locate')
        date_pdf = self.signature.date_scale_and_locate(xy, page_w, page_h)

        for date in date_pdf:
            PageMerge(page).add(date, prepend=False).render()
Ejemplo n.º 28
0
def filigrana(tipo, opacita, input_file, output_file):
    reader_input = PdfReader(input_file)
    writer_output = PdfWriter()

    page = reader_input.pages[0]
    w, h = sizepage(page)

    if tipo == "logo":
        if int(w) > int(h):
            watermark_input = PdfReader("filigrane/fil_" + str(opacita) +
                                        "_logo_or.pdf")
            watermark = fixpage(watermark_input.pages[0], int(w), int(h))
        else:
            watermark_input = PdfReader("filigrane/fil_" + str(opacita) +
                                        "_logo_ver.pdf")
            watermark = fixpage(watermark_input.pages[0], int(w), int(h))
    else:
        if int(w) > int(h):
            watermark_input = PdfReader("filigrane/fil_" + str(opacita) +
                                        "_or.pdf")
            watermark = fixpage(watermark_input.pages[0], int(w), int(h))
        else:
            watermark_input = PdfReader("filigrane/fil_" + str(opacita) +
                                        "_ver.pdf")
            watermark = fixpage(watermark_input.pages[0], int(w), int(h))

    for current_page in range(len(reader_input.pages)):
        merger = PageMerge(reader_input.pages[current_page])
        merger.add(watermark).render()
    writer_output.write(output_file, reader_input)
Ejemplo n.º 29
0
def addWaterMarkToPdfFiles(pdfpaths, watermarkcontent=None):
    try:
        if len(pdfpaths) == 0:
            return
        watermarkpath = pdfpaths[0].split('.')[0] + '-water' + '.pdf'
        watermark = create_watermark(watermarkpath, watermarkcontent)
    except Exception:
        now = datetime.datetime.now()
        print('制作水印pdf--%s'%now)
        filepath = APILOG_PATH['excptionlogpath'] + '/' + now.strftime('%Y-%m-%d')
        f = open(filepath, 'a')
        f.writelines(now.strftime('%H:%M:%S') + '\n' + traceback.format_exc() + '\n\n')
        f.close()
        return
    # Get our files ready
    for path in pdfpaths:
        now = datetime.datetime.now()
        try:
            print('覆盖水印pdf--%s--源文件%s' % (now, path))
            out_path = path.split('.')[0] + '-out' + '.pdf'
            input_file = PdfReader(path)
            for page in input_file.pages:
                PageMerge(page).add(watermark, prepend=False).render()
            PdfWriter(out_path, trailer=input_file).write()
            os.remove(path)
            os.rename(out_path, path)
        except Exception as err:
            print('覆盖水印pdf失败--%s--源文件%s' % (now, path))
            filepath = APILOG_PATH['excptionlogpath'] + '/' + now.strftime('%Y-%m-%d')
            f = open(filepath, 'a')
            f.writelines(now.strftime('%H:%M:%S') + '\n' + traceback.format_exc() + '\n\n')
            f.close()
    if os.path.exists(watermarkpath):
        os.remove(watermarkpath)
    return
Ejemplo n.º 30
0
def save_with_even_pages(exam_id, exam_pdf_file):
    """Save a finalized exam pdf with evem number of pages.

    The exam is saved in the path returned by `get_exam_dir(exam_id)` with the name `exam.pdf`.

    If the pdf has an odd number of pages, an extra blank page is added at the end,
    this is specially usefull for printing and contatenating multiple copies at once.

    Parameters
    ----------
    exam_id : int
        The exam identifier
    exam_pdf_file : str or File like object
        The exam pdf to be saved inthe data directory
    """
    os.makedirs(exam_dir(exam_id), exist_ok=True)
    pdf_path = exam_pdf_path(exam_id)

    exam_pdf = PdfReader(exam_pdf_file)
    pagecount = len(exam_pdf.pages)

    if (pagecount % 2 == 0):
        exam_pdf_file.seek(0)
        exam_pdf_file.save(pdf_path)
        return

    new = PdfWriter()
    new.addpages(exam_pdf.pages)
    blank = PageMerge()
    box = exam_pdf.pages[0].MediaBox
    blank.mbox = box
    blank = blank.render()
    new.addpage(blank)

    new.write(pdf_path)