def decrypt_pdf(update, context):
    result = check_back_user_data(update, context)
    if result is not None:
        return result

    _ = set_lang(update, context)
    message = update.effective_message
    message.reply_text(
        _("Decrypting your PDF file"), reply_markup=ReplyKeyboardRemove()
    )

    with tempfile.NamedTemporaryFile() as tf:
        # Download file
        user_data = context.user_data
        file_id, file_name = user_data[PDF_INFO]
        pdf_file = context.bot.get_file(file_id)
        pdf_file.download(custom_path=tf.name)
        pdf_reader = None

        try:
            pdf_reader = PdfFileReader(open(tf.name, "rb"))
        except PdfReadError:
            message.reply_text(
                _("Your PDF file seems to be invalid and I couldn't open and read it")
            )

        if pdf_reader is not None:
            if not pdf_reader.isEncrypted:
                message.reply_text(_("Your PDF file is not encrypted"))
            else:
                try:
                    if pdf_reader.decrypt(message.text) == 0:
                        message.reply_text(
                            _(
                                "The decryption password is incorrect, try to send it again"
                            )
                        )

                        return WAIT_DECRYPT_PW

                    pdf_writer = PdfFileWriter()
                    for page in pdf_reader.pages:
                        pdf_writer.addPage(page)

                    write_send_pdf(update, context, pdf_writer, file_name, "decrypted")
                except NotImplementedError:
                    message.reply_text(
                        _(
                            "Your PDF file is encrypted with a method that I cannot decrypt"
                        )
                    )

    # Clean up memory
    if user_data[PDF_INFO] == file_id:
        del user_data[PDF_INFO]

    return ConversationHandler.END
Example #2
0
def merge_pdf(update, context):
    _ = set_lang(update, context)
    update.effective_message.reply_text(_("Merging your PDF files"),
                                        reply_markup=ReplyKeyboardRemove())

    # Setup temporary files
    user_data = context.user_data
    file_ids = user_data[MERGE_IDS]
    file_names = user_data[MERGE_NAMES]
    temp_files = [tempfile.NamedTemporaryFile() for _ in range(len(file_ids))]
    merger = PdfFileMerger()

    # Merge PDF files
    for i, file_id in enumerate(file_ids):
        file_name = temp_files[i].name
        file = context.bot.get_file(file_id)
        file.download(custom_path=file_name)

        try:
            merger.append(open(file_name, "rb"))
        except PdfReadError:
            update.effective_message.reply_text(
                _("I can't merge your PDF files as I couldn't open and read \"{}\". "
                  "Ensure that it is not encrypted").format(file_names[i]))

            return ConversationHandler.END

    # Send result file
    write_send_pdf(update, context, merger, "files.pdf", "merged")

    # Clean up memory and files
    if user_data[MERGE_IDS] == file_ids:
        del user_data[MERGE_IDS]
    if user_data[MERGE_NAMES] == file_names:
        del user_data[MERGE_NAMES]
    for tf in temp_files:
        tf.close()

    return ConversationHandler.END
Example #3
0
def add_wmk(update, context):
    if not check_user_data(update, context, WMK_ID):
        return ConversationHandler.END

    _ = set_lang(update, context)
    update.effective_message.reply_text(
        _("Adding the watermark onto your PDF file"),
        reply_markup=ReplyKeyboardRemove())

    # Setup temporary files
    temp_files = [tempfile.NamedTemporaryFile() for _ in range(2)]
    src_fn, wmk_fn = [x.name for x in temp_files]

    user_data = context.user_data
    src_file_id = user_data[WMK_ID]
    wmk_file_id = update.effective_message.document.file_id
    src_reader = open_pdf(update, context, src_file_id, src_fn)

    if src_reader is not None:
        wmk_reader = open_pdf(update, context, wmk_file_id, wmk_fn,
                              _("watermark"))
        if wmk_reader is not None:
            # Add watermark
            pdf_writer = PdfFileWriter()
            for page in src_reader.pages:
                page.mergePage(wmk_reader.getPage(0))
                pdf_writer.addPage(page)

            # Send result file
            write_send_pdf(update, context, pdf_writer, "file.pdf",
                           "watermarked")

    # Clean up memory and files
    if user_data[WMK_ID] == src_file_id:
        del user_data[WMK_ID]
    for tf in temp_files:
        tf.close()

    return ConversationHandler.END
Example #4
0
def split_pdf(update: Update, context: CallbackContext) -> int:
    result = check_back_user_data(update, context)
    if result is not None:
        return result

    _ = set_lang(update, context)
    message = update.effective_message
    split_range = message.text

    if not PageRange.valid(split_range):
        message.reply_text(
            _(
                "The range is invalid. Try again",
                reply_markup=get_back_markup(update, context),
            ))

        return WAIT_SPLIT_RANGE

    message.reply_text(_("Splitting your PDF file"),
                       reply_markup=ReplyKeyboardRemove())

    with tempfile.NamedTemporaryFile() as tf:
        user_data = context.user_data
        file_id, file_name = user_data[PDF_INFO]
        pdf_reader = open_pdf(update, context, file_id, tf.name)

        if pdf_reader is not None:
            merger = PdfFileMerger()
            merger.append(pdf_reader, pages=PageRange(split_range))
            write_send_pdf(update, context, merger, file_name, "split")

    # Clean up memory
    if user_data[PDF_INFO] == file_id:
        del user_data[PDF_INFO]

    return ConversationHandler.END