Niektóre czasopisma generują inny plik PDF dla każdego pobrania. Na przykład APS przechowuje czas i adres IP w pliku PDF.
Lub istnieje wersja papierowa z hiperłączami i wersja z referencjami tekstowymi.
Jak można znaleźć podwójne pliki do pobrania z 90% równej zawartości w systemie Linux przy użyciu oprogramowania typu open source?
Myślałem o konwersji plików PDF na zwykły tekst w katalogu tymczasowym za pomocą pdf2txt
. Następnie mógłbym filtrować wszystkie nazwy plików, co diff a b
daje więcej niż x linii. Ale to wcale nie jest eleganckie i nie powiedzie się w przypadku zeskanowanych publikacji. Czasopisma często nie zawierają tekstu OCR dla starych publikacji.
Próbowałem również compare
w pakiecie ImageMagick, ale nie mogłem obsługiwać wielostronicowych plików PDF za pomocą tego narzędzia.
diffpdf 2.1.1 działa dobrze w GUI na dwóch plikach, ale nie mogłem wymyślić, jak zastosować go do wielu plików, a ostatnie wersje nie są dostępne na żadnej licencji typu open source.
źródło
blah.pdf[1]
wywoła żądaną stronę z dokumentu.Odpowiedzi:
Ponieważ różni wydawcy używają różnych metod „oznaczania” plików PDF, musisz upewnić się, że porównujesz bez uwzględnienia oznaczeń.
Potrzebujesz także wydajnej metody porównania nowego pliku PDF ze wszystkimi już pobranymi plikami PDF, na wypadek, gdy wielokrotnie pobierasz ten sam plik PDF i jest on np. Oznaczony adresem IP i / lub datownikiem, jak sugerujesz. Nie chcesz używać czasochłonnego mechanizmu porównywania, który porównuje każdy nowy plik PDF z wieloma już pobranymi plikami PDF
Potrzebujesz narzędzia, które usuwa wszystkie możliwe oznaczenia i generuje skrót pozostałych danych. Musisz zachować mapę skrótów → nazwa pliku, która może znajdować się w prostym pliku, a jeśli obliczony skrót znajduje się już w pliku, masz duplikat (i usuń go lub zrób wszystko, co konieczne), a jeśli skrót nie jest jeszcze tam dodajesz skrót i nazwę pliku. Plik wyglądałby mniej więcej tak:
Ten plik jest pomijalnie mały w porównaniu do oryginalnych plików PDF. Jeśli masz miliony plików PDF, możesz rozważyć przechowywanie tych danych w bazie danych. Ze względu na wydajność możesz w nim podać rozmiar pliku i liczbę stron (
pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*'
).Powyższe popycha problem do usunięcia oznaczeń i wygenerowania skrótu. Jeśli wiesz, skąd pochodzi plik PDF podczas wywoływania procedury generowania skrótu (tj. Jeśli robisz pobieranie programowo), możesz dostosować generowanie skrótu na tej podstawie. Ale nawet bez tego istnieje kilka możliwości generowania skrótów:
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
aby uzyskać skrót. Możesz również uwzględnić liczbę stron przy obliczaniu wartości skrótu ('Pages:
' w danychpdfinfo
wyjściowych).imagemagick
). Możesz użyćpdfimages
do wyodrębnienia informacji o obrazie do pliku tymczasowego.pdftext
do wyodrębnienia tekstu, odfiltrowania oznaczenia (jeśli odfiltrujesz trochę za dużo, to nie jest problem), a następnie wygenerujesz skrót na podstawie że.Dodatkowo możesz porównać, czy rozmiar starego pliku znalezionego za pomocą skrótu i sprawdzić, czy mieści się w określonych granicach nowego pliku. Kompresja i iffereferencje w ciągach znaków (IP / data-znacznik czasu) powinny skutkować różnicą mniejszą niż jeden procent.
Jeśli znasz metodę, którą wydawca stosuje przy określaniu wartości skrótu, możesz bezpośrednio zastosować „właściwą” powyższą metodę, ale nawet bez niej możesz sprawdzić metadane i zastosować heurystykę lub określić liczbę obrazów w pliku i porównaj to z liczbą stron (jeśli są blisko, prawdopodobnie masz dokument zawierający skany).
pdftext
na zeskanowanym obrazie pliki PDF mają także rozpoznawalny wynik.Jako podstawę do pracy stworzyłem pakiet Pythona, który jest na bitbucket i / lub może być zainstalowany z PyPI przy użyciu
pip install ruamel.pdfdouble
. Zapewnia topdfdbl
polecenie, które wykonuje skanowanie zgodnie z powyższym opisem w przypadku metadanych, wyodrębnionych obrazów lub tekstu. Nie wykonuje jeszcze żadnego filtrowania oznaczeń (jeszcze) , ale readme opisuje, które (dwie) metody ulepszenia, aby to dodać.Dołączony plik Readme:
ruamel.pdfdouble
ten pakiet zawiera
pdfdbl
polecenie:Spowoduje to przejście do katalogów podanych jako argument, a dla znalezionych plików PDF utwórz skrót na podstawie (w kolejności):
Zakłada się, że pdfinfo, pdfimages i pdftotext` z pakietu poppler-utils są dostępne.
Tworzona jest „baza danych”, na
~/.config/pdfdbl/pdf.lst
podstawie której testowane są kolejne skany.Usuwanie oznaczeń
W
ruamel/pdfdouble/pdfdouble.py
istnieją dwie metody, które mogą być ulepszone, aby odfiltrować znaki w formacie PDF, które czynią je mniej wyjątkowy i uczynić praktycznie te same pliki mają różne skrótów.W przypadku tekstu
PdfData.filter_for_marking
należy rozszerzyć metodę, aby usunąć i oznaczenia z łańcucha będącego jej argumentami i zwrócić wynik.W przypadku skanowanych obrazów należy ulepszyć tę metodę
PdfData.process_image_and_update
, np. Odcinając dolne i górne linie X obrazów oraz usuwając szary tekst tła, ustawiając wszystkie czarne piksele na białe. Ta funkcja musi zaktualizować skrót przekazany przy użyciu.update()
metody przekazującej przefiltrowane dane.Ograniczenia
Obecna „baza danych” nie obsługuje ścieżek zawierających znaki nowej linii
To narzędzie jest obecnie tylko Python 2.7.
Ciągi znaków zgodne z IP można zastąpić
re
modułem Pythona :źródło
pdfrw
do wyodrębniania metadanych, ale nie jest to w stanie obsłużyć zakodowanych plików pdfpdfinfo
.Dałbym
pdftotext
kolejną szansę, przynajmniej dla plików PDF w Twojej kolekcji, które faktycznie zawierają tekst (w przeciwnym razie będziesz musiał uruchomić OCR), używając lepszego narzędzia do przetwarzania danych wyjściowych.Po uzyskaniu (brudnego) wyniku tekstowego uruchom go przez program zaprojektowany do określania podobieństw (zamiast
diff
różnic między wierszami, co byłoby szybką ścieżką do szaleństwa).Rozważmy coś takiego jak String :: podobieństwo perla lub program simhash (który jest dostępny w Debianie, ale nie w Fedorze / RHEL).
źródło
Pliki PDF zawierają metadane i właśnie sprawdziłem kilka artykułów związanych z fizyką od różnych wydawców i wszystkie mają przynajmniej atrybut „Tytuł”. Dla niektórych tytuł jest rzeczywistym tytułem publikacji, dla niektórych zawiera DOI lub podobne identyfikatory. W każdym razie każdy sprawdzony przeze mnie artykuł zawiera tytuł i zawsze jest czymś unikalnym dla danej publikacji.
Możesz użyć,
pdftk
aby uzyskać dostęp do metadanych plików PDF i porównać je. Dla twojego celu powinno to zdecydowanie wystarczyć i jest znacznie szybsze niż wpdftotext
przypadku problemów z wydajnością. W przypadku, gdy artykuł naprawdę nie powinien mieć metadanych tytułu, do którego nadal możesz wrócićpdftotext
.Aby zrzucić wszystkie metadane do pliku tekstowego (lub standardowego) w celu dalszego przetwarzania, użyj
lub zapoznaj się z instrukcją, aby uzyskać dodatkowe opcje.
Jeśli chcesz wypróbować ImageMagick ,
compare
ale wiele stron powoduje problem, możesz również użyćpdftk
do wyodrębnienia pojedynczych stron i porównania ich wszystkich osobno (może jednak wystarczy porównanie jednej strony).Oto fragment kodu, który wykorzystuje to podejście do tworzenia
diff
podobnego wyjścia PDF dla wielostronicowych plików PDF: https://gist.github.com/mpg/3894692źródło
Czy przejrzałeś narzędzie do porównywania treści PDF ? Istnieją opcje wiersza poleceń, które powinny umożliwić zautomatyzowanie procesu.
Możesz uruchomić logikę w dzienniku różnic, który tworzy, aby zobaczyć, jak są one podobne.
W przeciwnym razie możesz spróbować tymczasowo podzielić pliki PDF na wiele plików i porównać je w ten sposób. Prawdopodobnie nadal będziesz mieć duplikaty w ten sposób. Jeden plik PDF może zawierać dodatkową pustą stronę lub coś, co sprawi, że wszystkie kolejne strony będą porównywane jako zupełnie inne.
źródło
Po skromnym udziale w dyskusji (częściowa odpowiedź):
Po przekonwertowaniu na tekst użyłbym następującego do obliczenia podobieństwa pliku (na podstawie różnicy słów):
(1) daje wynik podobny do
(2) = 93
źródło
Mam skrypt, który przegląda pdf i najpierw próbuje wyodrębnić tekst
pdftotext
, ale jeśli to się nie powiedzie (tak jak w przypadku zeskanowanego dokumentu), używa ghostscript do zamiany wielostronicowego zeskanowanego pliku pdf na serię plików png, a następnie używa tesseract do przekształcenia tej serii w pojedynczy plik tekstowy. Jeśli skan ma wystarczającą jakość, robi całkiem dobrą robotę. Łatwo byłoby dodać kod porównujący tekst między plikami, ale nie miałem tego wymagania.ghostscript i tesseract są zarówno open source, jak i działają z poziomu wiersza poleceń.
źródło
pdfimages
pakietu poppler bez dodatkowej utraty jakości, którą można uzyskać dzięki renderowaniu za pomocą ghostscript (co negatywnie wpływa na dowolny OCR, który chcesz zrobić).pdfimages
robi to samo co ghostscript (gs
), tzn. Wypakowuje obrazy z pdf do jpg / png. Dlaczego jest w tym lepszy niżgs
?gs
/tesseract
(format pośredni png) działa nieco lepiej niżpdfimages
/tesseract
(format pośredni pbm).pdfimages
jest jednak szybszy.Jako rozwiązanie zaoferowałbym perla. Istnieje moduł o nazwie,
CAM::PDF
który pozwala wyodrębnić ... treść PDF.Działa trochę tak:
Możesz wyodrębnić tekst i porównać go.
W przypadku tylko zeskanowanych dokumentów - jest to znacznie trudniejsze, ale zakładając, że używają tych samych obrazów podstawowych (np. Nie skanowały ich osobno), prawdopodobnie możesz użyć:
Nie przetestowałem tego szczególnie dobrze, ponieważ nie mam twoich dokumentów źródłowych. Myślę, że to podejście powinno załatwić sprawę - nie porównujesz rzeczywistej zawartości obrazu, ponieważ ... cóż, to naprawdę trudne. Ale powinieneś być w stanie rozpoznać podobne obrazy z metadanych.
W przypadku identycznych plików PDF z różnymi metadanymi, wystarczy coś prostego, np. Mieszanie zawartości tekstu i metadanych obrazu.
źródło
Istnieje aplikacja Linux, zwana recoll . Może wykonać to zadanie, ale tylko w przypadku plików pdf z warstwą tekstową.
źródło
recoll
Wydaje mi się, że to wyszukiwarka na komputery. Nie widziałem, jak go użyć, aby znaleźć duplikaty.recoll
używapdftotext
do obsługi plików PDF, czego OP stara się tutaj unikać.