Farklı yayıncılar PDF'leri "işaretlemek" için farklı yöntemler kullandığından, işaretleri dikkate almadan karşılaştırdığınızdan emin olmanız gerekir.
Aynı PDF'yi tekrar tekrar indirmeniz ve önerdiğiniz gibi IP ve / veya tarih-zaman damgası ile işaretlenmesi durumunda, yeni bir PDF'yi önceden indirilmiş tüm PDF'lerle karşılaştırmak için etkili bir yönteme de ihtiyacınız vardır. Her yeni PDF'yi önceden indirilmiş birçok PDF ile karşılaştıran zaman alıcı bir karşılaştırma mekanizması kullanmak istemezsiniz
İhtiyacınız olan şey, olası işaretlerin her birini ayıran ve kalan verilerin bir karmasını üreten bir yardımcı programdır. Basit bir dosyada olabilen bir karma → dosya adı eşlemesini tutmanız gerekir ve hesaplanmış bir karma zaten dosyadaysa, yinelenir (ve silebilir veya ne gerekiyorsa yapın) ve karma henüz değilse orada, karma ve dosya adını eklersiniz. Dosya şuna benzer:
6fcb6969835d2db7742e81267437c432 /home/anthon/Downloads/explanation.pdf
fa24fed8ca824976673a51803934d6b9 /home/anthon/orders/your_order_20150320.pdf
Bu dosya orijinal PDF'lere kıyasla önemsiz derecede küçük. Milyonlarca PDF'niz varsa, bu verileri bir veritabanında depolamayı düşünebilirsiniz. Verimlilik için dosya boyutunu ve sayfa sayısını buraya eklemek isteyebilirsiniz ( pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*'
).
Yukarıdakiler, sorunu işaretlerin çıkarılması ve karma üretilmesine itmektedir. Karma oluşturma rutini çağrılırken PDF'nin nereden geldiğini biliyorsanız (yani, indirmeleri programlı olarak yaparsanız) buna göre karma oluşturma işleminde ince ayar yapabilirsiniz. Ancak bu olmadan bile, karma üretimi için birkaç olasılık vardır:
- başlık ve yazar için meta veriler boş değilse ve "Acrobat" veya "PDF" gibi spesifik olmayan dizeler içermiyorsa, karmayı yalnızca yazar ve başlık bilgilerine göre oluşturabilirsiniz.
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
Karma elde etmek için kullanın . Karma sayısını hesaplamak için sayfa sayısını da ekleyebilirsiniz ( çıktıda ' Pages:
' pdfinfo
).
- önceki kural işe yaramazsa ve PDF resim içeriyorsa, resimleri çıkarın ve birleştirilmiş resim verilerinde bir karma oluşturun. Görüntüler altbilgi veya üstbilgide "Joe Kullanıcısına Lisanslı" gibi bir metin içeriyorsa, karmayı hesaplamadan önce üst veya alt kısımdan X sayıda satır çekin. Bu işaretler büyük harfli gri arka plan metnindeyse, tamamen siyah olmayan pikselleri filtrelemediğiniz sürece (bunun için kullanabilirsiniz
imagemagick
) elbette işe yaramaz . pdfimages
Görüntü bilgilerini geçici bir dosyaya ayıklamak için kullanabilirsiniz .
- önceki kurallar işe yaramazsa (görüntü olmadığı için)
pdftext
metni ayıklamak, işaretlemeyi filtrelemek (biraz filtrelerseniz, bu bir sorun değildir) ve ardından hash söyledi.
Ek olarak, karma yoluyla bulunan eski dosyanın dosya boyutunun karşılaştırılıp yeni dosyayla belirli kenar boşluklarında olup olmadığını görebilirsiniz. Dizelerdeki sıkıştırma ve farklılıklar (IP / tarih-saat damgası) yalnızca yüzde birden az farkla sonuçlanmalıdır.
Yayıncının karmayı belirlerken kullandığı yöntemi biliyorsanız, doğrudan yukarıdakilerin "doğru" yöntemini uygulayabilirsiniz, ancak bu olmadan bile meta verileri kontrol edebilir ve bazı sezgisel yöntemler uygulayabilir veya bir dosyadaki görüntü sayısını belirleyebilirsiniz ve sayfa sayısıyla karşılaştırın (yakınlarsa muhtemelen taramalardan oluşan bir belgeniz vardır). pdftext
taranan görüntüde PDF'lerin de tanınabilir bir çıktısı vardır.
Çalışmak için temel olarak bitbucket üzerinde olan ve / veya PyPI kullanılarak kurulabilen bir python paketi oluşturdum pip install ruamel.pdfdouble
. Bu, pdfdbl
meta veri, çıkarılan görüntüler veya metin üzerinde yukarıda açıklandığı gibi taramayı yapan komutu sağlar .
İşaretlerin herhangi bir filtrelemesini yapmaz (henüz) , ancak benioku bunu eklemek için hangi (iki) yöntemi geliştireceğini açıklar.
Dahil benioku:
ruamel.pdfdouble
bu paket şu pdfdbl
komutu sağlar:
pdfdbl scan dir1 dir2
Bu, bağımsız değişken olarak sağlanan dizinleri yürütebilir ve bulunan PDF dosyaları için aşağıdakileri temel alan bir karma oluşturun:
- benzersiz ise meta veriler
- görüntü sayısı
- Metin
Bu, poppler-utils paketinden pdfinfo, pdfimages ve pdftotext’in kullanılabilir olduğunu varsayar.
Daha ~/.config/pdfdbl/pdf.lst
fazla taramanın test edildiği bir "veritabanı" oluşturulur .
İşaretleri kaldırma
Gelen ruamel/pdfdouble/pdfdouble.py
onları daha az benzersiz yapmak ve farklı karmaları var hemen hemen aynı dosyaları yapmak PDF işaretleri filtrelemek için geliştirilmiş olabilir iki yöntem vardır.
Metin için yöntem PdfData.filter_for_marking
, argümanları olan dizeden kaldırılacak ve işaretler çıkarılacak ve sonuç döndürülecek şekilde genişletilmelidir.
Taranan görüntüler için PdfData.process_image_and_update
, örneğin görüntülerin alt ve üst X çizgilerini keserek ve tüm siyah pikselleri beyaza ayarlayarak gri arka plan metnini kaldırarak yöntemin iyileştirilmesi gerekir. Bu işlevin .update()
, filtrelenmiş verilerden geçirilen yöntemi kullanarak geçirilen karmayı güncellemesi gerekir .
Kısıtlamalar
Geçerli "veritabanı", yeni satırlar içeren yolları işleyemiyor
Bu yardımcı program şu anda yalnızca Python 2.7'dir.
IP uyumlu dize parçaları Python re
modülü ile değiştirilebilir:
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'