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
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
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
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
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