From 9ce3ea7a38f92365725c7276885174e9f7c596d3 Mon Sep 17 00:00:00 2001 From: Krisha Joshi <92749776+KJ173@users.noreply.github.com> Date: Mon, 13 May 2024 12:36:02 +0530 Subject: [PATCH 1/3] GSSOC'24 Issue #979 - Adding PDF Utility Tool to Python in Basics in Desktop Applications --- .../Python/PDF Utility Tool/PDFToolkit.py | 128 ++++++++++++++++++ .../PDF Utility Tool/icons/encrypt_icon.png | Bin 0 -> 910 bytes .../PDF Utility Tool/icons/merge_icon.png | Bin 0 -> 388 bytes .../icons/pdf_to_docx_icon.png | Bin 0 -> 807 bytes .../PDF Utility Tool/icons/split_icon.png | Bin 0 -> 440 bytes .../image/readme/GUI Interface.png | Bin 0 -> 31858 bytes .../Basic/Python/PDF Utility Tool/readme.md | 38 ++++++ .../Python/PDF Utility Tool/requirements.txt | Bin 0 -> 98 bytes 8 files changed, 166 insertions(+) create mode 100644 Desktop Application/Basic/Python/PDF Utility Tool/PDFToolkit.py create mode 100644 Desktop Application/Basic/Python/PDF Utility Tool/icons/encrypt_icon.png create mode 100644 Desktop Application/Basic/Python/PDF Utility Tool/icons/merge_icon.png create mode 100644 Desktop Application/Basic/Python/PDF Utility Tool/icons/pdf_to_docx_icon.png create mode 100644 Desktop Application/Basic/Python/PDF Utility Tool/icons/split_icon.png create mode 100644 Desktop Application/Basic/Python/PDF Utility Tool/image/readme/GUI Interface.png create mode 100644 Desktop Application/Basic/Python/PDF Utility Tool/readme.md create mode 100644 Desktop Application/Basic/Python/PDF Utility Tool/requirements.txt diff --git a/Desktop Application/Basic/Python/PDF Utility Tool/PDFToolkit.py b/Desktop Application/Basic/Python/PDF Utility Tool/PDFToolkit.py new file mode 100644 index 000000000..0008a3eb7 --- /dev/null +++ b/Desktop Application/Basic/Python/PDF Utility Tool/PDFToolkit.py @@ -0,0 +1,128 @@ +import tkinter as tk +from tkinter import filedialog, messagebox, simpledialog +from PIL import Image, ImageTk +import PyPDF2 +from pdf2docx import Converter +import os + +class Application(tk.Tk): + def __init__(self): + tk.Tk.__init__(self) + self.resizable(1, 1) + self.geometry("600x400") + self.title("PDF Toolkit") + self.create_widgets() + def create_widgets(self): + button_width = 160 + button_height = 120 + font_family = "Roboto" + font_size = 14 + text_color = "#333333" + button_bg = "#F7E98D" + image_size = (64, 64) + + self.merge_img = Image.open("./icons/merge_icon.png").resize(image_size) + self.merge_icon = ImageTk.PhotoImage(self.merge_img) + self.merge_btn = tk.Button(self, text="Merge PDF", font=(font_family, font_size), width=button_width,height=button_height,padx=30, pady=30, compound=tk.TOP, command=self.merge, fg=text_color, bg=button_bg, image=self.merge_icon) + self.merge_btn.grid(row = 2, column = 2, padx = 10, pady = 20) + + self.pdf_to_docx_img = Image.open("./icons/pdf_to_docx_icon.png").resize(image_size) + self.pdf_to_docx_icon = ImageTk.PhotoImage(self.pdf_to_docx_img) + self.pdf_to_docx_btn = tk.Button(self, text="PDF to DOCX", font=(font_family, font_size), width=button_width,height=button_height, padx=25, pady=30, compound=tk.TOP, command=self.convert_pdf_to_docx, fg=text_color, bg=button_bg, image=self.pdf_to_docx_icon) + self.pdf_to_docx_btn.grid(row = 2, column = 4, padx = 10, pady = 20) + + self.encrypt_img = Image.open("./icons/encrypt_icon.png") + self.encrypt_icon = ImageTk.PhotoImage(self.encrypt_img) + self.encrypt_btn = tk.Button(self, text="Encrypt PDF", font=(font_family, font_size), width=button_width,height=button_height, padx=40, pady=30, compound=tk.TOP, command=self.encrypt_pdf, fg=text_color, bg=button_bg, image=self.encrypt_icon) + self.encrypt_btn.grid(row = 4, column = 2, padx = 10, pady = 20) + + self.split_img = Image.open("./icons/split_icon.png").resize(image_size) + self.split_icon = ImageTk.PhotoImage(self.split_img) + self.split_btn = tk.Button(self, text="Split PDF", font=(font_family, font_size), width=button_width,height=button_height, padx=25, pady=30, compound=tk.TOP, command=self.split_pdf, fg=text_color, bg=button_bg, image=self.split_icon) + self.split_btn.grid(row = 4, column = 4, padx = 10, pady = 20) + + + def merge(self): + pdf_files = filedialog.askopenfilenames(title="Select PDF files to merge") + if pdf_files: + merged_pdf = PyPDF2.PdfFileMerger() + for pdf_file in pdf_files: + merged_pdf.append(pdf_file) + + save_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF files", "*.pdf")]) + if save_path: + merged_pdf.write(save_path) + merged_pdf.close() + messagebox.showinfo("Success", "PDFs merged successfully.") + else: + messagebox.showwarning("Warning", "Save path not provided.") + else: + messagebox.showwarning("Warning", "No PDF files selected.") + + def convert_pdf_to_docx(self): + pdf_file = filedialog.askopenfilename(title="Select PDF file to convert") + if pdf_file: + save_path = filedialog.asksaveasfilename(defaultextension=".docx", filetypes=[("Word files", "*.docx")]) + if save_path: + cv = Converter(pdf_file) + cv.convert(save_path) + cv.close() + messagebox.showinfo("Success", "PDF converted to DOCX successfully.") + else: + messagebox.showwarning("Warning", "Save path not provided.") + else: + messagebox.showwarning("Warning", "No PDF file selected.") + + def encrypt_pdf(self): + pdf_file = filedialog.askopenfilename(title="Select PDF file to encrypt") + if pdf_file: + password = simpledialog.askstring("Password", "Enter password for encryption:", show='*') + if password: + save_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF files", "*.pdf")]) + if save_path: + with open(pdf_file, 'rb') as file: + pdf_reader = PyPDF2.PdfReader(file) + pdf_writer = PyPDF2.PdfWriter() + for page in pdf_reader.pages: + pdf_writer.add_page(page) + pdf_writer.encrypt(password) + with open(save_path, 'wb') as output_file: + pdf_writer.write(output_file) + messagebox.showinfo("Success", "PDF encrypted successfully.") + else: + messagebox.showwarning("Warning", "Save path not provided.") + else: + messagebox.showwarning("Warning", "Password not provided.") + else: + messagebox.showwarning("Warning", "No PDF file selected.") + + def split_pdf(self): + pdf_file = filedialog.askopenfilename(title="Select PDF file to split") + if pdf_file: + split_point = simpledialog.askinteger("Split Point", "Enter page number to split from:") + if split_point: + save_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF files", "*.pdf")]) + if save_path: + pdf_reader = PyPDF2.PdfReader(pdf_file) + pdf_writer1 = PyPDF2.PdfWriter() + pdf_writer2 = PyPDF2.PdfWriter() + for page_num in range(len(pdf_reader.pages)): + if page_num < split_point: + pdf_writer1.add_page(pdf_reader.pages[page_num]) + else: + pdf_writer2.add_page(pdf_reader.pages[page_num]) + with open(save_path, 'wb') as output_file: + pdf_writer1.write(output_file) + with open(os.path.splitext(save_path)[0] + "_split.pdf", 'wb') as output_file2: + pdf_writer2.write(output_file2) + messagebox.showinfo("Success", "PDF split successfully.") + else: + messagebox.showwarning("Warning", "Save path not provided.") + else: + messagebox.showwarning("Warning", "Split point not provided.") + else: + messagebox.showwarning("Warning", "No PDF file selected.") + + +root = Application() +root.mainloop() diff --git a/Desktop Application/Basic/Python/PDF Utility Tool/icons/encrypt_icon.png b/Desktop Application/Basic/Python/PDF Utility Tool/icons/encrypt_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4c4226a004dac7c261579bd412af62a17b0fc6 GIT binary patch literal 910 zcmV;919AL`P)*Ij4twb$MkJUrsYBw#hL1=uNKKChBz!xFQAgFqMX8_0!-dG-=G0L)|4q9q>5N$5o($gkv1=Fz}1lm(X7W@LBcuKpdP%j0A2gW4i`vA~SP9x9az1o{`;a*i;=fR@ovWjYB_1xOtnFI*%j#wf zMep=F5-^Zbr4txkj03i*PVUHVFHLe+*>8^C3dR`~N{O$>TTr21-P6T%kdembbSJII zma<{Wcn9DkAm?8J{2Y)az3`JDeigtkgZMlEp9oO|GCmPvz(mMgjA#bx@;J$90yY8V z5qe`qrzww~2lUGe7Y=x1G1zuD=)6VGgn1B~EqbPH5Hl=# zuU$BxIbg(%h@(^b literal 0 HcmV?d00001 diff --git a/Desktop Application/Basic/Python/PDF Utility Tool/icons/merge_icon.png b/Desktop Application/Basic/Python/PDF Utility Tool/icons/merge_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2bea9c00fbb7065984c50941a9bd3a4f1dcea93d GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|TR( zr;B4q#hkaZ4gC%qNVvuKGfdZ^W6FmWj#m`21WY@mTzD6;&3t_FL0~hIkkRqU z2N$!w^k|-bAn(z~yBpORb{}fK^HJePxDum<2-A%(ED81>m-l^LIepmzhGX(uSE+C^ zq&t*xCh(sybKK&v=x&6a$aAl|Dj<5(I#c5Tb+uSP0HPOAi9@3PO|;0B;~fDFW~ULXB)WVmw3_0T=-8HMw~kZa!Dzn8+Y7rln}ZUGQ-of1xp^bGJ*e0k|CF+nzhO z_W+7I`AD0i-6<41fOabYVEzg?0IX1Zuh}EE0Grhw)L7T8fVFy*?N|R5a8B*Jz_i-u zHI^EHAz%`?1oRnyy?hrtjo+tZC-vDzE5JS#vOq@dRSM*}vD5%$^-Vc%gYhTK?mlJw zjiyjpQ#0X?-2^N04jXUU0C0s#RXKT2>rA*~0hHujG0XfN@CA4Q{8A-{j*0Y{MgTI( z?`j&11H)>MDx9_h`8xA-=etHi0CMum>Tgp2A#h#oeHtsPpKAgjtIchX`cKS_mJGnW zxo&CzhUEPOmIFuBcbnZYwJ!k6fFJ6w>!uWNdLw_A`PL5t+thvl>{k0N^VRVHZpkkw z@2k6fKkyOw3Y^g~H@gu)!Q{RB``nD(H(nJ|GXMiBc&Zg&$!vTR3gng2-UFO=)V$f< zU``in#@w;30B|YgbXwsRfPUbUxkN3e+$oSK0H-^^2gO$AwA%RY7`hd} zQWOC2?+S2Fkk<<+gvK@2bt@oKQwrz*Qwk6JPzv{C3e2=QItIX~UOwvG!22ZtD4XZJ z*8tM`$H-z801#FHAq7Y{=Zg5FkOG7hAfx~Z=UkBB>siW#`wdDR^m5s lJV^jSK|w)5K|yq+{sP!E^7Rwf)WZM(002ovPDHLkV1kgIW$OR{ literal 0 HcmV?d00001 diff --git a/Desktop Application/Basic/Python/PDF Utility Tool/icons/split_icon.png b/Desktop Application/Basic/Python/PDF Utility Tool/icons/split_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f58ff5a0c8dc43c63634d8d3612842c88aed3932 GIT binary patch literal 440 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 literal 0 HcmV?d00001 diff --git a/Desktop Application/Basic/Python/PDF Utility Tool/readme.md b/Desktop Application/Basic/Python/PDF Utility Tool/readme.md new file mode 100644 index 000000000..30846bfbd --- /dev/null +++ b/Desktop Application/Basic/Python/PDF Utility Tool/readme.md @@ -0,0 +1,38 @@ +# PDF Utility Tool + +The PDF Toolkit is a Python application designed to provide various PDF manipulation functionalities offline. It allows users to merge multiple PDF files into one, convert PDF files to DOCX format, encrypt PDF files with passwords, and split PDF files into separate documents. The application offers a user-friendly graphical interface built using the Tkinter library. + +## Installation + +1. Clone the repository + + ```bash + git clone https://github.com/your_username/pdf-toolkit.git + ``` +2. Navigate to the project directory + + ```bash + cd pdf-toolkit + ``` +3. Install Dependencies + + ```bash + pip install -r requirements.txt + ``` +4. Run PDFToolkit.py + + ```bash + python PDFToolkit.py + ``` + +## Dependencies + +The PDF Toolkit uses the following Python packages: + +* Pillow (PIL): Image processing library used for handling images. +* PyPDF2: Library for working with PDF files, providing functionalities for merging, splitting, and encrypting PDFs. +* pdf2docx: Converter library used to convert PDF files to DOCX format. + +## GUI + +![1715583384233](image/readme/1715583384233.png "GUI Interface") diff --git a/Desktop Application/Basic/Python/PDF Utility Tool/requirements.txt b/Desktop Application/Basic/Python/PDF Utility Tool/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..9401c88fbade7985342fb810680de7355ec220ac GIT binary patch literal 98 zcmezWFMuJFAqNQa8Oj-KfzX0MkHG|p4H$SCxEKN$DuLLA!HvNPENcjqF=8--%NH=D WFr)!RQh@rC87jbP41ltxa1{VQhYlqG literal 0 HcmV?d00001 From 81de358e2345fb306b1e12f36e2648282db8b139 Mon Sep 17 00:00:00 2001 From: Krisha Joshi <92749776+KJ173@users.noreply.github.com> Date: Sun, 26 May 2024 16:13:35 +0530 Subject: [PATCH 2/3] Update readme.md Solved issue of image not displaying and added brief description of the functionalities --- .../Basic/Python/PDF Utility Tool/readme.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Desktop Application/Basic/Python/PDF Utility Tool/readme.md b/Desktop Application/Basic/Python/PDF Utility Tool/readme.md index 30846bfbd..10dcdf9b0 100644 --- a/Desktop Application/Basic/Python/PDF Utility Tool/readme.md +++ b/Desktop Application/Basic/Python/PDF Utility Tool/readme.md @@ -2,6 +2,12 @@ The PDF Toolkit is a Python application designed to provide various PDF manipulation functionalities offline. It allows users to merge multiple PDF files into one, convert PDF files to DOCX format, encrypt PDF files with passwords, and split PDF files into separate documents. The application offers a user-friendly graphical interface built using the Tkinter library. +## Features +1. **Merge PDF** allows you to select multiple files through file explorer window and merge them into one pdf. +2. **PDF to .docx** allows you to select a pdf file and convert it into an editable MS-Word Document. +3. **Encrypt PDF** allows you to select a file that you wish to lock and set a password for that file. +4. **Split PDF** allows you to input a page number from which the pdf is split into 2 pdfs. + ## Installation 1. Clone the repository @@ -34,5 +40,4 @@ The PDF Toolkit uses the following Python packages: * pdf2docx: Converter library used to convert PDF files to DOCX format. ## GUI - -![1715583384233](image/readme/1715583384233.png "GUI Interface") +![GUI Interface](https://github.com/KJ173/Project-Guidance/assets/92749776/b3105e57-cdcd-4cad-9f6b-f235db4d2770) From 37e76d0ffbbd7b38fb99e1bf527680c73b7b3314 Mon Sep 17 00:00:00 2001 From: Krisha Joshi <92749776+KJ173@users.noreply.github.com> Date: Wed, 29 May 2024 17:25:24 +0530 Subject: [PATCH 3/3] Added project to index on Desktop Application Readme.md Have added the PDF Utility Tool under Basics column in Readme.md The link will work once the issue is merged ! --- Desktop Application/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Desktop Application/README.md b/Desktop Application/README.md index 7a4be5963..9517bbd10 100644 --- a/Desktop Application/README.md +++ b/Desktop Application/README.md @@ -71,7 +71,7 @@ | 27. | [Internet Speed Meter](https://github.com/Kushal997-das/Project-Guidance/tree/main/Desktop%20Application/Basic/Python/Internet%20Speed%20Meter) | | 28. | [Live News App](https://github.com/Kushal997-das/Project-Guidance/tree/main/Desktop%20Application/Basic/Python/Live%20News%20App) | | 29. | [Screen Recorder](https://github.com/Kushal997-das/Project-Guidance/tree/main/Desktop%20Application/Basic/Python/Screen-Recorder) | - +| 30. | [PDF Utility Tool](https://github.com/Kushal997-das/Project-Guidance/tree/main/Desktop%20Application/Basic/Python/PDF%20Utility%20Tool) |
## Java 🚀