Python adalah bahasa yang sangat serbaguna, dan pengembang Python sering kali harus bekerja dengan berbagai file dan menyimpan informasi di dalamnya untuk diproses. Salah satu format file populer yang pasti Anda temui sebagai pengembang Python adalah Portable Document Format yang dikenal sebagai PDF
File PDF dapat berisi teks, gambar, dan link. Saat memproses data dalam program Python, Anda mungkin perlu mengekstrak data yang disimpan dalam dokumen PDF. Tidak seperti struktur data seperti tupel, daftar, dan kamus, menyimpan informasi dalam dokumen PDF mungkin tampak seperti hal yang sulit untuk dilakukan.
Untungnya, ada sejumlah perpustakaan yang memudahkan bekerja dengan PDF dan mengekstrak data yang disimpan dalam file PDF. Untuk mempelajari berbagai perpustakaan ini, mari kita lihat bagaimana Anda dapat mengekstrak teks, tautan, dan gambar dari file PDF. Untuk mengikutinya, unduh file PDF berikut dan simpan di direktori yang sama dengan file program Python Anda.
Untuk mengekstrak teks dari file PDF menggunakan Python, kita akan menggunakan PyPDF2 perpustakaan. PyPDF2 adalah pustaka Python sumber terbuka dan gratis yang dapat digunakan untuk menggabungkan, memotong, dan mengubah halaman file PDF. Itu dapat menambahkan data khusus, opsi tampilan, dan kata sandi ke file PDF. Namun yang penting, PyPDF2 dapat mengambil teks dari file PDF.
Untuk menggunakan PyPDF2 guna mengekstrak teks dari file PDF, instal menggunakan pip, yang merupakan penginstal paket untuk Python. pip memungkinkan Anda menginstal paket Python yang berbeda di mesin Anda:
1. Periksa apakah Anda sudah menginstal pip dengan menjalankan:
pip --version
Jika Anda tidak mendapatkan nomor versi, itu berarti pip belum diinstal.
2. Untuk menginstal pip, klik dapatkan pip untuk mengunduh skrip instalasinya.
Tautan tersebut membuka halaman dengan skrip untuk menginstal pip seperti yang ditunjukkan di bawah ini:
Klik kanan pada halaman tersebut dan klik Simpan sebagai untuk menyimpan file. Secara default, nama filenya adalah get-pip.py
Buka terminal dan arahkan ke direktori dengan file get-pip.py yang baru saja Anda unduh lalu jalankan perintah:
sudo python3 get-pip.py
Ini harus menginstal pip seperti yang ditunjukkan di bawah ini:
3. Periksa apakah pip berhasil diinstal dengan menjalankan:
pip --version
Jika berhasil, Anda akan mendapatkan nomor versi:
Dengan pip terinstal, sekarang kita dapat mulai bekerja dengan PyPDF2.
1. Instal PyPDF2 dengan menjalankan perintah berikut di terminal:
pip install PyPDF2
2. Buat file Python dan impor PdfReader dari PyPDF2 menggunakan baris berikut:
from PyPDF2 import PdfReader
Pustaka PyPDF2 menyediakan berbagai kelas untuk bekerja dengan file PDF. Salah satu kelas tersebut adalah PdfReader, yang antara lain dapat digunakan untuk membuka File PDF, membaca konten, mengekstrak teks dari file PDF.
3. Untuk mulai bekerja dengan file PDF, Anda harus membuka file tersebut terlebih dahulu. Untuk melakukan ini, buat sebuah instance dari kelas PdfReader dan teruskan file PDF yang ingin Anda kerjakan:
reader = PdfReader('games.pdf')
Baris di atas membuat instance PdfReader dan mempersiapkannya untuk mengakses konten file PDF yang Anda tentukan. Instance disimpan dalam variabel bernama reader, yang harus mengakses berbagai metode dan properti yang tersedia di kelas PdfReader.
4. Untuk melihat apakah semuanya berfungsi dengan baik, cetak jumlah halaman dalam PDF yang Anda kirimkan menggunakan kode berikut:
print(len(reader.pages))
Keluaran:
5
5. Karena file PDF kita memiliki 5 halaman, kita dapat mengakses setiap halaman yang tersedia di PDF. Namun, penghitungan dimulai dari 0, seperti konvensi pengindeksan Python. Oleh karena itu, halaman pertama dalam file pdf akan menjadi halaman nomor 0. Untuk mengambil halaman pertama PDF, tambahkan baris berikut ke kode Anda:
page1 = reader.pages[0]
Baris di atas mengambil halaman pertama dalam file PDF, dan menyimpannya dalam variabel bernama page1.
6. Untuk mengekstrak teks pada halaman pertama file PDF, tambahkan baris berikut:
textPage1 = page1.extract_text()
Ini mengekstrak teks pada halaman pertama PDF dan menyimpan konten dalam variabel bernama textPage1. Dengan demikian Anda memiliki akses ke teks pada halaman pertama file PDF melalui variabel textPage1.
7. Untuk mengonfirmasi teks berhasil diekstraksi, Anda dapat mencetak konten variabel textPage1. Seluruh kode kami, yang juga mencetak teks pada halaman pertama file PDF, ditunjukkan di bawah ini:
# import the PdfReader class from PyPDF2 from PyPDF2 import PdfReader # create an instance of the PdfReader class reader = PdfReader('games.pdf') # get the number of pages available in the pdf file print(len(reader.pages)) # access the first page in the pdf page1 = reader.pages[0] # extract the text in page 1 of the pdf file textPage1 = page1.extract_text() # print out the extracted text print(textPage1)
Keluaran:
Untuk mengekstrak tautan dari file PDF, kita akan membuka PyMuPDF yang merupakan pustaka Python untuk mengekstraksi, menganalisis, mengonversi, dan memanipulasi data yang disimpan dalam dokumen seperti PDF. Untuk menggunakan PyMuPDF, Anda harus memiliki Python 3.8 atau lebih baru. Untuk memulai:
1. Instal PyMuPDF dengan menjalankan baris berikut di terminal:
pip install PyMuPDF
2. Impor PyMuPDF ke file Python Anda menggunakan pernyataan berikut:
import fitz
3. Untuk mengakses PDF yang ingin Anda ekstrak tautannya, Anda harus membukanya terlebih dahulu. Untuk membukanya, masukkan baris berikut:
doc = fitz.open("games.pdf")
4. Setelah file PDF terbuka, cetak jumlah halaman dalam PDF menggunakan baris berikut:
print(doc.page_count)
Keluaran:
5
4. Untuk mengekstrak link dari suatu halaman dalam file PDF, kita perlu memuat halaman yang ingin kita ekstrak linknya. Untuk memuat halaman, masukkan baris berikut, di mana Anda memasukkan nomor halaman yang ingin Anda muat ke dalam fungsi yang disebut load_page()
page = doc.load_page(0)
Untuk mengekstrak link dari halaman pertama, kami memasukkan 0 (nol). Penghitungan halaman dimulai dari nol seperti pada struktur data seperti array dan kamus.
5. Ekstrak link dari halaman menggunakan baris berikut:
links = page.get_links()
Semua link di halaman yang Anda tentukan, dalam kasus kami, halaman 1, akan diekstraksi dan disimpan dalam variabel bernama link
6. Untuk melihat isi variabel link, cetaklah seperti ini:
print(links)
Keluaran:
Dari keluaran yang dicetak, perhatikan bahwa tautan variabel berisi daftar kamus dengan pasangan nilai kunci. Setiap link pada halaman diwakili oleh kamus, dengan link sebenarnya disimpan di bawah kunci “uri”
7. Untuk mendapatkan link dari daftar objek yang disimpan dengan nama variabel link, ulangi daftar tersebut menggunakan pernyataan for in dan cetak link spesifik yang disimpan di bawah kunci uri. Seluruh kode yang melakukan hal ini ditunjukkan di bawah ini:
import fitz # Open the PDF file doc = fitz.open("games.pdf") # Print out the number of pages print(doc.page_count) # load the first page from the PDF page = doc.load_page(0) # extract all links from the page and store it under - links links = page.get_links() # print the links object #print(links) # print the actual links stored under the key "uri" for obj in links: print(obj["uri"])
Keluaran:
5 https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/ https://sparkian.com/ https://www.codemonkey.com/
8. Untuk membuat kode kita lebih dapat digunakan kembali, kita dapat melakukan refaktorisasi dengan mendefinisikan fungsi untuk mengekstrak semua link dalam PDF dan fungsi untuk mencetak semua link yang ditemukan dalam PDF. Dengan cara ini, Anda dapat memanggil fungsi-fungsi tersebut dengan PDF apa pun, dan Anda akan mendapatkan kembali semua tautan dalam PDF. Kode yang melakukan hal ini ditunjukkan di bawah ini:
import fitz # Extract all the links in a PDF document def extract_link(path_to_pdf): links = [] doc = fitz.open(path_to_pdf) for page_num in range(doc.page_count): page = doc.load_page(page_num) page_links = page.get_links() links.extend(page_links) return links # print out all the links returned from the PDF document def print_all_links(links): for link in links: print(link["uri"]) # Call the function to extract all the links in a pdf # all the return links are stored under all_links all_links = extract_link("games.pdf") # call the function to print all links in the PDF print_all_links(all_links)
Keluaran:
https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/ https://sparkian.com/ https://www.codemonkey.com/ https://scratch.mit.edu/ https://www.tynker.com/ https://codecombat.com/ https://lightbot.com/ https://sparkian.com
Dari kode di atas, fungsi ekstrak_link() menerima file PDF, mengulangi semua halaman dalam PDF, mengekstrak semua tautan, dan mengembalikannya. Hasil dari fungsi ini disimpan dalam variabel bernama all_links
Fungsi print_all_links() mengambil hasil dari ekstrak_link(), mengulangi daftar, dan mencetak semua tautan sebenarnya yang ditemukan dalam PDF yang Anda masukkan ke dalam fungsi ekstrak_link().
Untuk mengekstrak Gambar dari PDF, kami masih akan menggunakan PyMuPDF. Untuk mengekstrak gambar dari file PDF:
1. Impor PyMuPDF, io, dan PIL. Python Imaging Library (PIL) menyediakan alat yang memudahkan pembuatan dan penyimpanan gambar, di antara fungsi-fungsi lainnya. io menyediakan kelas untuk penanganan data biner yang mudah dan efisien.
import fitz from io import BytesIO from PIL import Image
2. Buka file PDF yang gambarnya ingin Anda ekstrak:
doc = fitz.open("games.pdf")
3. Muat halaman tempat Anda ingin mengekstrak gambar:
page = doc.load_page(0)
4. PyMuPdf mengidentifikasi gambar pada file PDF menggunakan nomor referensi silang (xref), yang biasanya berupa bilangan bulat. Setiap gambar pada file PDF memiliki xref unik. Oleh karena itu, untuk mengekstrak gambar dari PDF, pertama-tama kita harus mendapatkan nomor xref yang mengidentifikasinya. Untuk mendapatkan nomor xref gambar pada suatu halaman, kami menggunakan fungsi get_images() seperti:
image_xref = page.get_images() print(image_xref)
Keluaran:
[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]
get_images() mengembalikan daftar tupel dengan informasi tentang gambar. Karena kita hanya punya satu gambar di halaman pertama, hanya ada satu tuple. Elemen pertama dalam tuple mewakili xref gambar pada halaman. Oleh karena itu, xref gambar di halaman pertama adalah 7.
5. Untuk mengekstrak nilai xref gambar dari daftar tupel, kita menggunakan kode di bawah ini:
# get xref value of the image xref_value = image_xref[0][0] print(xref_value)
Keluaran:
[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')] 7
6. Karena Anda sekarang memiliki xref yang mengidentifikasi gambar di PDF, Anda dapat mengekstrak gambar menggunakan fungsi ekstrak_gambar() seperti:
img_dictionary = doc.extract_image(xref_value)
Namun fungsi ini tidak mengembalikan gambar sebenarnya. Sebaliknya, ia mengembalikan kamus yang berisi data gambar biner dari gambar tersebut dan metadata tentang gambar tersebut, antara lain.
7. Dari kamus yang dikembalikan oleh fungsi ekstrak_gambar(), periksa ekstensi file dari gambar yang diekstraksi. Ekstensi file disimpan di bawah kunci “ext“:
# get file extenstion img_extension = img_dictionary["ext"] print(img_extension)
Keluaran:
png
8. Ekstrak biner gambar dari kamus yang disimpan di img_dictionary. Biner gambar disimpan di bawah kunci “gambar”
# get the actual image binary data img_binary = img_dictionary["image"]
9. Buat objek BytesIO dan inisialisasi dengan data gambar biner yang mewakili gambar tersebut. Ini menciptakan objek seperti file yang bisa diproses oleh pustaka Python seperti PIL sehingga Anda bisa menyimpan gambar.
# create a BytesIO object to work with the image bytes image_io = BytesIO(img_binary)
10. Buka dan parsing data gambar yang disimpan di objek BytesIO bernama image_io menggunakan perpustakaan PIL. Hal ini penting karena memungkinkan perpustakaan PIL untuk menentukan format gambar dari gambar yang Anda coba kerjakan, dalam hal ini, PNG. Setelah mendeteksi format gambar, PIL membuat objek gambar yang dapat dimanipulasi dengan fungsi dan metode PIL, seperti metode save(), untuk menyimpan gambar ke penyimpanan lokal.
# open the image using Pillow image = Image.open(image_io)
11. Tentukan jalur dimana Anda ingin menyimpan gambar.
output_path = "image_1.png"
Karena jalur di atas hanya berisi nama file dengan ekstensinya, gambar yang diekstraksi akan disimpan di direktori yang sama dengan file Python yang berisi program ini. Gambar akan disimpan sebagai image_1.png. Ekstensi PNG penting agar sesuai dengan ekstensi asli gambar.
12. Simpan gambar dan tutup objek ByteIO.
# save the image image.save(output_path) # Close the BytesIO object image_io.close()
Seluruh kode untuk mengekstrak gambar dari file PDF ditunjukkan di bawah ini:
import fitz from io import BytesIO from PIL import Image doc = fitz.open("games.pdf") page = doc.load_page(0) # get a cross reference(xref) to the image image_xref = page.get_images() # get the actual xref value of the image xref_value = image_xref[0][0] # extract the image img_dictionary = doc.extract_image(xref_value) # get file extenstion img_extension = img_dictionary["ext"] # get the actual image binary data img_binary = img_dictionary["image"] # create a BytesIO object to work with the image bytes image_io = BytesIO(img_binary) # open the image using PIL library image = Image.open(image_io) #specify the path where you want to save the image output_path = "image_1.png" # save the image image.save(output_path) # Close the BytesIO object image_io.close()
Jalankan kodenya dan buka folder yang berisi file Python Anda; Anda akan melihat gambar yang diekstrak bernama image_1.png, seperti yang ditunjukkan di bawah ini:
Kesimpulan
Untuk mendapatkan lebih banyak latihan dalam mengekstrak tautan, gambar, dan teks dari PDF, cobalah memfaktorkan ulang kode dalam contoh agar lebih dapat digunakan kembali, seperti yang ditunjukkan dalam contoh tautan. Dengan cara ini, Anda hanya perlu memasukkan file PDF, dan program Python Anda akan mengekstrak semua tautan, gambar, atau teks di seluruh PDF. Selamat Mengkode!
Anda juga dapat menjelajahi beberapa API PDF terbaik untuk setiap kebutuhan bisnis.