Karena penerbit yang berbeda menggunakan metode berbeda "menandai" PDF, Anda perlu memastikan Anda membandingkan tanpa memperhitungkan tanda.
Anda juga memerlukan metode yang efisien untuk membandingkan PDF baru dengan semua PDF yang sudah diunduh seandainya Anda berulang kali mengunduh PDF yang sama dan ditandai misalnya dengan IP dan / atau cap waktu-tanggal seperti yang Anda sarankan. Anda tidak ingin menggunakan mekanisme perbandingan yang memakan waktu yang membandingkan setiap PDF baru dengan banyak PDF yang sudah diunduh
Yang Anda butuhkan adalah utilitas yang menghapus setiap tanda yang mungkin dan menghasilkan hash dari data yang tersisa. Anda harus menyimpan hash → nama file peta, yang dapat berupa file sederhana, dan jika hash yang dihitung sudah ada dalam file Anda memiliki duplikat (dan menghapusnya atau melakukan apa pun yang diperlukan) dan jika hash belum di sana, Anda menambahkan hash dan nama file. File akan terlihat seperti:
6fcb6969835d2db7742e81267437c432 /home/anthon/Downloads/explanation.pdf
fa24fed8ca824976673a51803934d6b9 /home/anthon/orders/your_order_20150320.pdf
File itu sangat kecil dibandingkan dengan PDF asli. Jika Anda memiliki jutaan PDF, Anda mungkin mempertimbangkan untuk menyimpan data ini dalam database. Demi efisiensi Anda mungkin ingin memasukkan filesize dan jumlah halaman di sana ( pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*'
).
Di atas mendorong masalah untuk menghapus tanda dan menghasilkan hash. Jika Anda tahu dari mana PDF berasal ketika menjalankan rutin pembuatan hash (yaitu jika Anda melakukan unduhan secara terprogram), Anda dapat menyempurnakan generasi hash berdasarkan itu. Tetapi bahkan tanpa itu ada beberapa kemungkinan untuk generasi hash:
- jika metadata untuk judul dan penulis tidak kosong dan tidak termasuk string non-spesifik seperti "Acrobat" atau "PDF" Anda bisa membuat hash berdasarkan hanya pada informasi penulis dan judul. Gunakan
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
untuk mendapatkan hash. Anda dapat memasukkan jumlah halaman dalam menghitung hash juga (' Pages:
' dalam pdfinfo
output).
- jika aturan sebelumnya tidak berfungsi dan PDF berisi gambar, ekstrak gambar dan hasilkan hash pada data gambar gabungan. Jika gambar pernah berisi teks dalam footer atau header seperti "Berlisensi untuk Pengguna Joe", lepaskan sejumlah X garis dari atas atau bawah, sebelum menghitung hash. Jika tanda-tanda itu dalam beberapa teks latar belakang abu-abu berhuruf besar ini tentu saja tidak akan berfungsi, kecuali jika Anda memfilter piksel yang tidak sepenuhnya hitam (untuk itu Anda dapat menggunakan
imagemagick
). Anda dapat menggunakan pdfimages
untuk mengekstrak informasi gambar ke dalam file sementara.
- jika aturan sebelumnya tidak berfungsi (karena tidak ada gambar), Anda dapat menggunakan
pdftext
untuk mengekstrak teks, memfilter penandaan (jika Anda menyaring sedikit ke banyak, itu bukan masalah) dan kemudian menghasilkan hash berdasarkan bahwa.
Selain itu Anda dapat membandingkan apakah ukuran file dari file lama ditemukan melalui hash dan melihat apakah berada dalam margin tertentu dengan file baru. Kompresi dan ifferensi dalam string (IP / date-time-stamp) hanya menghasilkan perbedaan kurang dari satu persen.
Jika Anda mengetahui metode yang digunakan penerbit saat menentukan hash, Anda dapat langsung menerapkan metode "benar" di atas, tetapi bahkan tanpa itu Anda dapat memeriksa metadata dan menerapkan beberapa heuristik, atau menentukan jumlah gambar dalam file dan bandingkan dengan jumlah halaman (jika mereka dekat Anda mungkin memiliki dokumen yang terdiri dari pemindaian). pdftext
pada gambar yang dipindai, PDF juga memiliki keluaran yang dapat dikenali.
Sebagai dasar untuk bekerja dari saya membuat paket python yang ada di bitbucket dan / atau dapat diinstal dari PyPI menggunakan pip install ruamel.pdfdouble
. Ini memberi Anda pdfdbl
perintah yang melakukan pemindaian seperti yang dijelaskan di atas pada metadata, gambar yang diekstraksi atau pada teks.
Itu tidak melakukan penyaringan tanda (belum) , tetapi readme menggambarkan metode (dua) mana yang harus ditingkatkan untuk menambahkan itu.
Readme yang disertakan:
ruamel.pdfdouble
paket ini menyediakan pdfdbl
perintah:
pdfdbl scan dir1 dir2
Ini akan berjalan di direktori yang disediakan sebagai argumen dan untuk file PDF yang ditemukan, buat hash berdasarkan (dalam urutan):
- metadata jika unik
- gambar jika jumlah gambar
- teks
Ini mengasumsikan bahwa pdfinfo, pdfimages dan pdftotext` dari paket poppler-utils tersedia.
"Basis data" dibangun untuk ~/.config/pdfdbl/pdf.lst
menguji pemindaian lebih lanjut.
Menghapus tanda
Di ruamel/pdfdouble/pdfdouble.py
ada dua metode yang dapat ditingkatkan untuk menyaring tanda di PDF yang membuat mereka kurang unik dan membuat hampir file yang sama untuk memiliki hash yang berbeda.
Untuk teks metode PdfData.filter_for_marking
harus diperluas untuk menghapus dan menandai dari string yang merupakan argumennya dan mengembalikan hasilnya.
Untuk gambar yang dipindai metode PdfData.process_image_and_update
perlu ditingkatkan, misalnya dengan memotong gambar bagian bawah dan garis X atas, dan dengan menghapus teks latar abu-abu dengan mengatur semua piksel hitam menjadi putih. Fungsi ini perlu memperbarui hash yang diteruskan menggunakan .update()
metode meneruskan data yang difilter.
Batasan
"Database" saat ini tidak dapat menangani jalur yang berisi baris baru
Utilitas ini saat ini hanya Python 2.7.
Stringparts yang sesuai dengan IP dapat diganti dengan re
modul Python :
import re
IPre = re.compile("(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}"
"([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])")
x = IPre.sub(' ', 'abcd 132.234.0.2 ghi')
assert x == 'abcd ghi'