เนื่องจากผู้เผยแพร่ที่แตกต่างกันใช้วิธีการ "ทำเครื่องหมาย" ที่แตกต่างกันคุณจำเป็นต้องตรวจสอบให้แน่ใจว่าคุณเปรียบเทียบโดยไม่คำนึงถึงการทำเครื่องหมาย
คุณต้องมีวิธีที่มีประสิทธิภาพในการเปรียบเทียบ PDF ใหม่กับ PDF ที่ดาวน์โหลดไปแล้วทั้งหมดในกรณีที่คุณดาวน์โหลด PDF ซ้ำ ๆ ซ้ำ ๆ และมันถูกทำเครื่องหมายด้วย IP และ / หรือประทับวันที่ตามเวลาที่คุณแนะนำ คุณไม่ต้องการใช้กลไกการเปรียบเทียบที่เสียเวลาซึ่งเปรียบเทียบแต่ละ PDF ใหม่กับ PDF ที่ดาวน์โหลดไปแล้วจำนวนมาก
สิ่งที่คุณต้องการคือยูทิลิตี้ที่แยกแต่ละเครื่องหมายที่เป็นไปได้และสร้างแฮชของข้อมูลที่เหลือ คุณจะต้องเก็บ hash →ชื่อไฟล์แม็พซึ่งสามารถอยู่ในไฟล์แบบง่ายและหากแฮชที่คำนวณอยู่แล้วในไฟล์ที่คุณมีซ้ำ (และลบหรือทำสิ่งที่จำเป็น) และหากแฮยังไม่ได้ คุณเพิ่มแฮชและชื่อไฟล์ที่นั่น ไฟล์จะมีลักษณะดังนี้:
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 / date-time-time) จะทำให้เกิดความแตกต่างน้อยกว่าหนึ่งเปอร์เซ็นต์เท่านั้น
หากคุณทราบวิธีการที่ผู้เผยแพร่โฆษณาใช้ในการพิจารณาแฮชคุณสามารถใช้วิธีการ "ถูกต้อง" ข้างต้นได้โดยตรง แต่ถึงแม้จะไม่มีคุณก็สามารถตรวจสอบข้อมูลเมตาและใช้การวิเคราะห์พฤติกรรมหรือกำหนดจำนวนภาพในไฟล์ และเปรียบเทียบกับจำนวนหน้า (ถ้าพวกเขาอยู่ใกล้คุณอาจมีเอกสารที่ประกอบด้วยการสแกน) pdftext
บนรูปภาพที่สแกน PDF ยังมีเอาต์พุตที่รู้จัก
เป็นพื้นฐานในการทำงานจากที่ผมสร้างแพคเกจหลามที่อยู่บนbitbucketและ / หรือสามารถติดตั้งจากPyPIpip install ruamel.pdfdouble
ใช้ สิ่งนี้ช่วยให้คุณมีpdfdbl
คำสั่งที่ทำการสแกนตามที่อธิบายไว้ด้านบนในเมทาดาทา, รูปภาพที่แตกแล้วหรือข้อความ
มันไม่ได้ทำการกรองเครื่องหมาย (แต่) readme อธิบายถึงวิธีการ (สอง) ในการปรับปรุงเพื่อเพิ่ม
รวม readme:
ruamel.pdfdouble
แพคเกจนี้ให้pdfdbl
คำสั่ง:
pdfdbl scan dir1 dir2
สิ่งนี้จะแสดงไดเรกทอรีที่มีให้เป็นอาร์กิวเมนต์และสำหรับไฟล์ PDF ที่พบให้สร้างแฮชตาม (ตามลำดับ):
- ข้อมูลเมตาถ้าไม่ซ้ำกัน
- ภาพถ้าจำนวนภาพ
- ข้อความ
สิ่งนี้ถือว่า pdfinfo, pdfimages และ pdftotext` จากแพ็คเกจ poppler-utils นั้นหาได้
"ฐานข้อมูล" ถูกสร้างขึ้น~/.config/pdfdbl/pdf.lst
เพื่อทดสอบการสแกนเพิ่มเติม
การลบเครื่องหมาย
ในruamel/pdfdouble/pdfdouble.py
มีสองวิธีที่สามารถปรับปรุงเพื่อกรองเครื่องหมายใน PDF ที่ทำให้พวกเขาไม่ซ้ำกันน้อยลงและทำให้ไฟล์เดียวกันแทบจะมีแฮชที่แตกต่างกัน
สำหรับข้อความPdfData.filter_for_marking
ควรขยายวิธีการเพื่อลบและทำเครื่องหมายจากสตริงที่เป็นอาร์กิวเมนต์และส่งคืนผลลัพธ์
สำหรับภาพที่สแกนPdfData.process_image_and_update
ต้องมีการปรับปรุงวิธีการเช่นตัดส่วนล่างของภาพและเส้นบนสุด X ออกและด้วยการลบข้อความพื้นหลังสีเทาโดยการตั้งค่าพิกเซลสีดำทั้งหมดเป็นสีขาว ฟังก์ชันนี้จำเป็นต้องอัพเดตแฮชที่ส่งผ่านโดยใช้.update()
วิธีการส่งผ่านข้อมูลที่กรอง
ข้อ จำกัด
"ฐานข้อมูล" ปัจจุบันไม่สามารถจัดการเส้นทางที่มีการขึ้นบรรทัดใหม่ได้
ยูทิลิตี้นี้ปัจจุบันคือ Python 2.7 เท่านั้น
IP ที่สอดคล้องกับ stringparts สามารถถูกแทนที่ด้วยre
โมดูลของ 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'