출판사마다 다른 PDF 표시 방법을 사용하므로 표시를 고려하지 않고 비교해야합니다.
동일한 PDF를 반복적으로 다운로드하고 제안한대로 IP 및 / 또는 날짜-시간 스탬프가 표시된 경우 새 PDF를 이미 다운로드 한 모든 PDF와 비교할 수있는 효율적인 방법이 필요합니다. 각각의 새 PDF를 이미 다운로드 한 많은 PDF와 비교하는 시간 소모적 인 비교 메커니즘을 사용하고 싶지 않습니다.
필요한 것은 각각의 가능한 표시를 제거하고 나머지 데이터의 해시를 생성하는 유틸리티입니다. 간단한 파일에있을 수있는 해시 → 파일 이름 맵을 유지해야하며 계산 된 해시가 이미 파일에 있으면 복제본이 있고 (삭제하거나 필요에 따라 수행) 해시가 아직없는 경우 거기에 해시와 파일 이름을 추가합니다. 파일은 다음과 같습니다.
6fcb6969835d2db7742e81267437c432 /home/anthon/Downloads/explanation.pdf
fa24fed8ca824976673a51803934d6b9 /home/anthon/orders/your_order_20150320.pdf
이 파일은 원본 PDF에 비해 무시할 정도로 작습니다. 수백만 개의 PDF가있는 경우이 데이터를 데이터베이스에 저장하는 것이 좋습니다. 효율성을 위해 파일 크기와 페이지 수를 포함시킬 수 있습니다 ( pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*'
).
위의 내용은 표시를 제거하고 해시를 생성하는 문제를 해결합니다. 해시 생성 루틴을 호출 할 때 (예 : 프로그래밍 방식으로 다운로드를 수행하는 경우) PDF가 어디에서 오는지 알면이를 기반으로 해시 생성을 미세 조정할 수 있습니다. 그러나 그것 없이도 해시 생성에는 몇 가지 가능성이 있습니다.
- 제목 및 작성자의 메타 데이터가 비어 있지 않고 "Acrobat"또는 "PDF"와 같은 비 특정 문자열을 포함하지 않는 경우 저자 및 제목 정보만으로 해시를 생성 할 수 있습니다.
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
해시를 얻는 데 사용 합니다. 해시 계산에 페이지 수를 포함시킬 수도 있습니다 ( 출력에 ' Pages:
' pdfinfo
).
- 이전 규칙이 작동하지 않고 PDF에 이미지가 포함 된 경우 이미지를 추출하고 결합 된 이미지 데이터에 해시를 생성하십시오. 이미지에 바닥 글이나 머리글에 "Joe 사용자에게 라이센스 부여"와 같은 텍스트가 포함 된 경우 해시를 계산하기 전에 맨 위 또는 맨 아래에있는 X 개의 줄을 제거하십시오. 그 표시가 큰 글자로 된 회색 배경 텍스트에 있으면 완전히 검은 색이 아닌 픽셀을 걸러 내지 않는 한 작동하지 않습니다
imagemagick
. pdfimages
이미지 정보를 임시 파일로 추출하는 데 사용할 수 있습니다 .
- 이전 규칙이 작동하지 않는 경우 (이미지가 없기 때문에)
pdftext
텍스트를 추출하고 표시를 걸러 내고 (작은 정도 필터링하면 문제가되지 않음) 해시를 기반으로 해시를 생성 할 수 있습니다 그.
또한 이전 파일의 파일 크기가 해시를 통해 발견되었는지 비교하고 새 파일의 특정 여백 내에 있는지 확인할 수 있습니다. 문자열의 압축 및 차이 (IP / 날짜-시간 스탬프)는 1 % 미만의 차이 만 가져야합니다.
해시를 결정할 때 게시자가 사용하는 방법을 알고있는 경우 위의 "올바른"방법을 직접 적용 할 수 있지만 메타 데이터를 확인하고 일부 휴리스틱을 적용하거나 파일의 이미지 수를 결정할 수 있습니다 페이지 수와 비교하십시오 (가까운 경우 스캔으로 구성된 문서가있을 수 있습니다). pdftext
스캔 이미지에서 PDF는 또한 인식 가능한 출력을 가지고 있습니다.
I에서 작업을 기초로하는 파이썬 패키지 생성 의 bitbucket 및 / 또는에서 설치할 수 있습니다 PyPI 사용하여 pip install ruamel.pdfdouble
. pdfdbl
메타 데이터, 추출 된 이미지 또는 텍스트에 대해 위에서 설명한대로 스캔 하는 명령을 제공합니다 .
마킹을 필터링하지는 않지만 (아직) readme는 그것을 추가하기 위해 향상시킬 두 가지 방법을 설명합니다.
포함 된 추가 정보 :
ruamel.pdfdouble
이 패키지는 다음 pdfdbl
명령을 제공합니다 .
pdfdbl scan dir1 dir2
그러면 인수로 제공된 디렉토리가 표시되고 발견 된 PDF 파일에 대해 (순서대로) 해시를 만듭니다.
- 고유 한 경우 메타 데이터
- 이미지 수가 이미지 인 경우
- 본문
이것은 poppler-utils 패키지의 pdfinfo, pdfimages 및 pdftotext`를 사용할 수 있다고 가정합니다.
~/.config/pdfdbl/pdf.lst
추가 스캔이 테스트되는 "데이터베이스"가 구축됩니다 .
표시 제거
에서 ruamel/pdfdouble/pdfdouble.py
그들을 덜 독특하고 서로 다른 해시를 가지고 거의 동일한 파일을 PDF에 표시를 필터링 강화 될 수있는 두 가지 방법이있다.
텍스트의 경우 PdfData.filter_for_marking
인수 인 문자열에서 메소드 를 표시하고 제거하여 결과를 리턴하도록 메소드 를 확장해야합니다.
스캔 된 이미지의 PdfData.process_image_and_update
경우 이미지 하단 및 상단 X 라인을 잘라 내고 모든 검은 색 픽셀을 흰색으로 설정하여 회색 배경 텍스트를 제거 하여 방법 을 향상시켜야합니다. 이 함수 .update()
는 필터링 된 데이터를 전달 하는 메소드를 사용하여 전달 된 해시를 업데이트해야합니다 .
제한 사항
현재 "데이터베이스"는 줄 바꿈이 포함 된 경로를 처리 할 수 없습니다
이 유틸리티는 현재 Python 2.7입니다.
IP 준수 문자열 부분은 Python의 re
모듈 로 대체 할 수 있습니다 .
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'