예제 #1
0
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
예제 #2
0
def encrypt_pdf(update, context):
    result = check_back_user_data(update, context)
    if result is not None:
        return result

    _ = set_lang(update, context)
    update.effective_message.reply_text(
        _("Encrypting your PDF file"), reply_markup=ReplyKeyboardRemove()
    )
    process_pdf(update, context, "encrypted", encrypt_pw=update.effective_message.text)

    return ConversationHandler.END
예제 #3
0
def rename_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
    text = re.sub(r"\.pdf$", "", message.text)
    invalid_chars = r"\/*?:\'<>|"

    if set(text) & set(invalid_chars):
        message.reply_text(
            _(
                "File names can't contain any of the following characters:\n{}\n"
                "Send me another file name"
            ).format(invalid_chars)
        )

        return WAIT_FILE_NAME

    new_fn = "{}.pdf".format(text)
    message.reply_text(
        _("Renaming your PDF file into <b>{}</b>").format(new_fn),
        parse_mode=ParseMode.HTML,
        reply_markup=ReplyKeyboardRemove(),
    )

    # Download PDF file
    user_data = context.user_data
    file_id, _ = user_data[PDF_INFO]
    tf = tempfile.NamedTemporaryFile()
    pdf_file = context.bot.get_file(file_id)
    pdf_file.download(custom_path=tf.name)

    # Rename PDF file
    with tempfile.TemporaryDirectory() as dir_name:
        out_fn = os.path.join(dir_name, new_fn)
        shutil.move(tf.name, out_fn)
        send_result_file(update, context, out_fn, "rename")

    # Clean up memory and files
    if user_data[PDF_INFO] == file_id:
        del user_data[PDF_INFO]
    try:
        tf.close()
    except FileNotFoundError:
        pass

    return ConversationHandler.END
예제 #4
0
def get_pdf_preview(update, context):
    result = check_back_user_data(update, context)
    if result is not None:
        return result

    _ = set_lang(update, context)
    update.effective_message.reply_text(
        _("Extracting a preview for your PDF file"),
        reply_markup=ReplyKeyboardRemove())

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

        if pdf_reader:
            # Get first page of PDF file
            pdf_writer = PdfFileWriter()
            pdf_writer.addPage(pdf_reader.getPage(0))

            with tempfile.NamedTemporaryFile() as tf2:
                # Write cover preview PDF file
                with open(tf2.name, "wb") as f:
                    pdf_writer.write(f)

                with tempfile.TemporaryDirectory() as dir_name:
                    # Convert cover preview to JPEG
                    out_fn = os.path.join(
                        dir_name,
                        f"Preview_{os.path.splitext(file_name)[0]}.png")
                    imgs = pdf2image.convert_from_path(tf2.name, fmt="png")
                    imgs[0].save(out_fn)

                    # Send result file
                    send_result_file(update, context, out_fn, "preview")

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

    return ConversationHandler.END
예제 #5
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