Vì các nhà xuất bản khác nhau sử dụng các phương pháp "đánh dấu" các tệp PDF khác nhau mà bạn cần đảm bảo rằng bạn so sánh mà không cần đánh dấu vào tài khoản.
Bạn cũng cần một phương pháp hiệu quả để so sánh một tệp PDF mới với tất cả các tệp PDF đã tải xuống trong trường hợp bạn liên tục tải xuống cùng một tệp PDF và nó được đánh dấu bằng IP và / hoặc dấu thời gian như bạn đề xuất. Bạn không muốn sử dụng cơ chế so sánh tốn thời gian để so sánh từng tệp PDF mới với nhiều tệp PDF đã tải xuống
Những gì bạn cần là một tiện ích loại bỏ từng dấu hiệu có thể và tạo ra một hàm băm của dữ liệu còn lại. Bạn sẽ cần giữ một bản đồ băm → tên tệp, có thể ở trong một tệp đơn giản và nếu một hàm băm được tính toán đã có trong tệp bạn có một bản sao (và xóa nó hoặc làm bất cứ điều gì cần thiết) và nếu chưa băm Ở đó, bạn thêm tên băm và tên tập tin. Các tập tin sẽ trông giống như:
6fcb6969835d2db7742e81267437c432 /home/anthon/Downloads/explanation.pdf
fa24fed8ca824976673a51803934d6b9 /home/anthon/orders/your_order_20150320.pdf
Tập tin đó nhỏ một cách sơ suất so với các tệp PDF gốc. Nếu bạn có hàng triệu tệp PDF, bạn có thể cân nhắc lưu trữ dữ liệu này trong cơ sở dữ liệu. Để hiệu quả, bạn có thể muốn bao gồm kích thước tệp và số lượng trang trong đó ( pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*'
).
Ở trên đẩy vấn đề để loại bỏ các đánh dấu và tạo ra hàm băm. Nếu bạn biết PDF đến từ đâu khi gọi thói quen tạo băm (nghĩa là nếu bạn thực hiện tải xuống theo chương trình), bạn có thể tinh chỉnh việc tạo băm dựa trên đó. Nhưng ngay cả khi không có điều đó, có một số khả năng để tạo ra hàm băm:
- nếu siêu dữ liệu cho tiêu đề và tác giả không trống và không bao gồm các chuỗi không cụ thể như "Acrobat" hoặc "PDF", bạn có thể tạo băm dựa trên chỉ thông tin về tác giả và tiêu đề. Sử dụng
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
để có được hàm băm. Bạn cũng có thể bao gồm số lượng trang để tính băm (' Pages:
' trong pdfinfo
đầu ra).
- nếu quy tắc trước không hoạt động và PDF chứa hình ảnh, hãy trích xuất hình ảnh và tạo hàm băm trên dữ liệu hình ảnh kết hợp. Nếu hình ảnh từng chứa văn bản ở chân trang hoặc tiêu đề như "Được cấp phép cho người dùng Joe", hãy tước một số dòng X tạo thành trên cùng hoặc dưới cùng, trước khi tính toán hàm băm. Nếu các dấu đó nằm trong một số văn bản nền có chữ lớn màu xám thì điều này tất nhiên sẽ không hoạt động, trừ khi bạn lọc ra các pixel không hoàn toàn màu đen (mà bạn có thể sử dụng
imagemagick
). Bạn có thể sử dụng pdfimages
để trích xuất thông tin hình ảnh thành một tập tin tạm thời.
- nếu các quy tắc trước không hoạt động (vì không có hình ảnh), bạn có thể sử dụng
pdftext
để trích xuất văn bản, lọc ra đánh dấu (nếu bạn lọc ra một chút đến nhiều, đó không phải là vấn đề) và sau đó tạo ra hàm băm dựa trên cái đó.
Ngoài ra, bạn có thể so sánh nếu kích thước tệp của tệp cũ được tìm thấy qua hàm băm và xem liệu có nằm trong lề nhất định với tệp mới không. Nén và ifferences trong chuỗi (IP / ngày-tem-tem) chỉ nên dẫn đến chênh lệch ít hơn một phần trăm.
Nếu bạn biết phương pháp mà nhà xuất bản sử dụng khi xác định hàm băm, bạn có thể trực tiếp áp dụng phương pháp "đúng" ở trên, nhưng ngay cả khi không có, bạn có thể kiểm tra siêu dữ liệu và áp dụng một số phương pháp phỏng đoán hoặc xác định số lượng hình ảnh trong một tệp và so sánh với số lượng trang (nếu chúng ở gần bạn có thể có một tài liệu bao gồm các lần quét). pdftext
trên các hình ảnh PDF được quét cũng có một đầu ra dễ nhận biết.
Là cơ sở để làm việc từ tôi đã tạo ra một gói python trên bitbucket và / hoặc có thể được cài đặt từ PyPI bằng cách sử dụng pip install ruamel.pdfdouble
. Điều này cung cấp cho bạn pdfdbl
lệnh thực hiện quét như được mô tả ở trên trên siêu dữ liệu, trích xuất hình ảnh hoặc trên văn bản.
Nó không thực hiện bất kỳ bộ lọc đánh dấu nào (nhưng) , nhưng readme mô tả phương thức nào (hai) cần tăng cường để thêm vào đó.
Các readme bao gồm:
ruamel.pdfdouble
gói này cung cấp pdfdbl
lệnh:
pdfdbl scan dir1 dir2
Điều này sẽ đi xuống các thư mục được cung cấp dưới dạng đối số và cho các tệp PDF được tìm thấy, tạo một hàm băm dựa trên (theo thứ tự):
- siêu dữ liệu nếu là duy nhất
- hình ảnh nếu số lượng hình ảnh
- bản văn
Điều này giả định rằng pdfinfo, pdfimages và pdftotext` từ gói poppler-utils là có thể sử dụng được.
Một "cơ sở dữ liệu" được xây dựng để ~/.config/pdfdbl/pdf.lst
dựa vào đó các bản quét tiếp theo được kiểm tra.
Xóa dấu
Trong ruamel/pdfdouble/pdfdouble.py
đó có hai phương pháp có thể được tăng cường để lọc các dấu trong tệp PDF khiến chúng trở nên ít độc đáo hơn và làm cho hầu như các tệp giống nhau có các giá trị băm khác nhau.
Đối với văn bản, phương thức PdfData.filter_for_marking
nên được mở rộng để loại bỏ và đánh dấu từ chuỗi đó là đối số của nó và trả về kết quả.
Đối với hình ảnh được quét, phương pháp PdfData.process_image_and_update
cần được tăng cường, ví dụ: bằng cách cắt các dòng X dưới cùng và trên cùng của hình ảnh, và bằng cách xóa bất kỳ văn bản nền màu xám nào bằng cách đặt tất cả các pixel đen thành màu trắng. Hàm này cần cập nhật hàm băm được truyền vào bằng cách sử dụng .update()
phương thức truyền vào dữ liệu được lọc.
Những hạn chế
"Cơ sở dữ liệu" hiện tại không thể xử lý các đường dẫn có chứa dòng mới
Tiện ích này hiện chỉ là Python 2.7.
Chuỗi chuỗi phù hợp IP có thể được thay thế bằng re
mô-đun của 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'