Beberapa jurnal menghasilkan PDF yang berbeda untuk setiap unduhan. APS misalnya menyimpan waktu dan alamat IP dalam PDF.
Atau ada versi kertas dengan tautan hyper dan satu dengan referensi teks.
Bagaimana mungkin menemukan unduhan duplikat kertas dengan 90% konten yang sama pada sistem linux dengan menggunakan perangkat lunak sumber terbuka?
Saya telah berpikir tentang mengkonversi file PDF ke teks biasa di direktori sementara dengan pdf2txt
. Lalu saya bisa memfilter semua nama file yang diff a b
menghasilkan lebih dari x baris. Tapi ini tidak elegan sama sekali dan akan gagal dengan publikasi yang dipindai. Jurnal sering tidak menyediakan teks OCR untuk publikasi lama.
Saya juga mencoba compare
di ImageMagick suite, tetapi saya tidak bisa menangani file PDF multi-halaman dengan alat ini.
diffpdf 2.1.1 melakukan pekerjaan yang baik dalam GUI pada dua file, tapi saya tidak tahu cara menerapkannya pada banyak file, dan versi terbaru tidak tersedia di bawah lisensi open source apa pun.
sumber
blah.pdf[1]
akan memanggil halaman yang diinginkan dari dokumen.Jawaban:
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:
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:
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
untuk mendapatkan hash. Anda dapat memasukkan jumlah halaman dalam menghitung hash juga ('Pages:
' dalampdfinfo
output).imagemagick
). Anda dapat menggunakanpdfimages
untuk mengekstrak informasi gambar ke dalam file sementara.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 Andapdfdbl
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:Ini akan berjalan di direktori yang disediakan sebagai argumen dan untuk file PDF yang ditemukan, buat hash berdasarkan (dalam urutan):
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 :sumber
pdfrw
untuk mengekstraksi metadata juga, tetapi itu tidak dapat menangani file pdf terenkripsi, di manapdfinfo
bisa.Saya akan memberikan
pdftotext
kesempatan lain, setidaknya untuk PDF dalam koleksi Anda yang benar-benar memiliki teks (jika tidak, Anda harus menjalankan OCR), menggunakan alat yang lebih baik untuk memproses output.Setelah Anda memiliki output teks (kotor), jalankan melalui program yang dirancang untuk menentukan kesamaan (bukan
diff
perbedaan baris demi baris, yang akan menjadi jalan cepat menuju kegilaan).Pertimbangkan sesuatu seperti String perl :: Similarity atau program simhash (yang tersedia di Debian tetapi tidak di Fedora / RHEL).
sumber
PDF berisi metadata dan saya baru saja memeriksa sejumlah makalah terkait fisika dari penerbit yang berbeda dan mereka semua setidaknya memiliki atribut "Judul". Bagi sebagian orang, judul tersebut adalah judul publikasi yang sebenarnya, untuk beberapa judul berisi DOI atau pengidentifikasi serupa. Bagaimanapun, setiap makalah yang saya periksa berisi judul, dan selalu merupakan sesuatu yang unik untuk publikasi yang diberikan.
Anda dapat menggunakan
pdftk
untuk mengakses metadata dari PDF dan membandingkannya. Untuk tujuan Anda, ini pasti sudah cukup dan jauh lebih cepat daripadapdftotext
jika kinerja adalah masalah. Jika kertas benar-benar tidak boleh memiliki judul metadata Anda masih bisa kembali kepdftotext
.Untuk membuang semua metadata ke file teks (atau stdout) untuk diproses lebih lanjut
atau lihat manual untuk opsi lebih lanjut.
Jika Anda ingin mencoba ImageMagick 's
compare
tetapi beberapa halaman penyebab masalah, Anda juga bisa menggunakanpdftk
untuk mengekstrak halaman tunggal dan membandingkan semua dari mereka secara terpisah (mungkin hanya membandingkan satu pun cukup, meskipun).Berikut ini adalah cuplikan kode yang menggunakan pendekatan ini untuk membuat
diff
output PDF seperti-untuk PDF multi-halaman: https://gist.github.com/mpg/3894692sumber
Sudahkah Anda melihat Pembanding Konten PDF ? Ada opsi baris perintah yang seharusnya memungkinkan Anda mengotomatiskan proses.
Anda bisa menjalankan semacam logika pada log perbedaan yang dibuatnya untuk melihat betapa miripnya mereka.
Gagal Anda mencoba memisahkan PDF ke dalam beberapa file sementara dan membandingkannya. Anda mungkin masih memiliki duplikat seperti itu. Satu PDF mungkin hanya memiliki halaman kosong tambahan atau sesuatu yang akan menyebabkan semua halaman berikutnya menjadi sangat berbeda.
sumber
Berikut kontribusi sederhana untuk diskusi (jawaban parsial):
Setelah dikonversi ke teks saya akan menggunakan yang berikut ini untuk menghitung smilarity file (berdasarkan perbedaan kata):
(1) menghasilkan hasil seperti
(2) = 93
sumber
Saya memiliki skrip yang melihat pdf dan pertama kali mencoba mengekstraksi teks menggunakan
pdftotext
, tetapi jika ini gagal (karena akan dengan dokumen yang dipindai), ia menggunakan ghostscript untuk mengubah pdf multi-halaman yang dipindai menjadi serangkaian file png dan kemudian menggunakan tesseract untuk mengubah seri ini menjadi satu file teks. Jika pemindaiannya berkualitas memadai, ia melakukan pekerjaan yang cukup bagus. Akan lebih mudah untuk menambahkan kode yang membandingkan teks antara file tetapi saya belum memiliki persyaratan ini.ghostscript dan tesseract keduanya open source dan bekerja dari baris perintah.
sumber
pdfimages
dari paket poppler tanpa kehilangan kualitas tambahan yang bisa Anda dapatkan dengan rendering melalui ghostscript (yang secara negatif mempengaruhi OCR yang ingin Anda lakukan).pdfimages
hanya melakukan hal yang sama dengan ghostscript (gs
) di sini yaitu mengekstraksi gambar dari pdf ke jpg / png. Mengapa ini lebih baik daripada inigs
?gs
/tesseract
(format menengah png) bekerja sedikit lebih baik daripadapdfimages
/tesseract
(format menengah pbm).pdfimages
lebih cepat.Saya akan menawarkan perl sebagai solusi. Ada modul bernama
CAM::PDF
yang memungkinkan Anda mengekstrak ... konten PDF.Kerjanya sedikit seperti ini:
Anda dapat mengekstrak teks dan membandingkannya.
Untuk hanya dokumen yang dipindai - jauh lebih sulit, tetapi dengan asumsi mereka menggunakan gambar dasar yang sama (mis. Belum dipindai secara terpisah) maka Anda mungkin dapat menggunakan:
Saya belum mengujinya dengan baik, karena saya tidak memiliki dokumen sumber Anda. Saya pikir pendekatan ini harus melakukan trik - Anda tidak membandingkan konten gambar yang sebenarnya, karena .... yah, itu sangat sulit. Tetapi Anda harus dapat mengenali gambar serupa dari metadata.
Untuk PDF identik dengan metadata berbeda, maka sesuatu yang sederhana seperti hashing konten teks dan metadata gambar harus melakukan trik.
sumber
Ada aplikasi Linux, yang disebut recoll . Itu dapat melakukan tugas, tetapi hanya untuk pdf dengan lapisan teks.
sumber
recoll
sepertinya mesin pencari desktop. Saya tidak bisa melihat, bagaimana menggunakannya untuk menemukan duplikat.recoll
gunakanpdftotext
untuk menangani PDF, yang ingin dihindari oleh OP di sini.