วาง PDF เพื่อดูข้อมูลโดยละเอียดเกี่ยวกับอักขระข้อความ สี่เหลี่ยม และบรรทัดแต่ละตัว บวก: การแยกตารางและการดีบักภาพ
ทำงานได้ดีที่สุดกับไฟล์ PDF ที่สร้างด้วยเครื่อง แทนที่จะสแกน สร้างขึ้นบน pdfminer.six
ทดสอบในปัจจุบันบน Python 3.8, 3.9, 3.10, 3.11
มีคำแปลของเอกสารนี้เป็นภาษา: จีน (โดย @hbh112233abc)
หากต้องการรายงานจุดบกพร่อง หรือขอคุณลักษณะ โปรดแจ้งปัญหา หากต้องการถามคำถาม หรือขอความช่วยเหลือเกี่ยวกับ PDF ที่เฉพาะเจาะจง โปรดใช้ฟอรั่มการสนทนา
pip install pdfplumber
curl " https://raw.githubusercontent.com/jsvine/pdfplumber/stable/examples/pdfs/background-checks.pdf " > background-checks.pdf
pdfplumber < background-checks.pdf > background-checks.csv
ผลลัพธ์จะเป็น CSV ที่มีข้อมูลเกี่ยวกับอักขระ ทุกบรรทัด และสี่เหลี่ยมใน PDF
การโต้แย้ง | คำอธิบาย |
---|---|
--format [format] | csv หรือ json รูปแบบ json ส่งคืนข้อมูลเพิ่มเติม ประกอบด้วยข้อมูลเมตาระดับ PDF และระดับหน้า รวมถึงแอตทริบิวต์ที่ซ้อนพจนานุกรม |
--pages [list of pages] | รายการเพจที่คั่นด้วยช่องว่าง 1 หรือช่วงหน้าที่ใส่เครื่องหมายยัติภังค์ เช่น 1, 11-15 ซึ่งจะส่งคืนข้อมูลสำหรับหน้า 1, 11, 12, 13, 14 และ 15 |
--types [list of object types to extract] | ตัวเลือกได้แก่ char , rect , line , curve , image , annot และอื่นๆ ค่าเริ่มต้นคือทั้งหมดที่มีอยู่ |
--laparams | สตริงที่จัดรูปแบบ JSON (เช่น '{"detect_vertical": true}' ) ที่จะส่งผ่านไปยัง pdfplumber.open(..., laparams=...) |
--precision [integer] | จำนวนตำแหน่งทศนิยมเพื่อปัดเศษตัวเลขทศนิยม ค่าเริ่มต้นคือการไม่มีการปัดเศษ |
import pdfplumber
with pdfplumber . open ( "path/to/file.pdf" ) as pdf :
first_page = pdf . pages [ 0 ]
print ( first_page . chars [ 0 ])
หากต้องการเริ่มทำงานกับ PDF ให้โทร pdfplumber.open(x)
โดยที่ x
สามารถเป็น:
วิธี open
ส่งคืนอินสแตนซ์ของคลาส pdfplumber.PDF
หากต้องการโหลด PDF ที่ป้องกันด้วยรหัสผ่าน ให้ส่งอาร์กิวเมนต์คำหลักของ password
เช่น pdfplumber.open("file.pdf", password = "test")
หากต้องการตั้งค่าพารามิเตอร์การวิเคราะห์เลย์เอาต์ให้กับเอ็นจิ้นเลย์เอาต์ของ pdfminer.six
ให้ส่งอาร์กิวเมนต์คำหลัก laparams
เช่น pdfplumber.open("file.pdf", laparams = { "line_overlap": 0.7 })
หากต้องการปรับมาตรฐานข้อความ Unicode ล่วงหน้า ให้ส่ง unicode_norm=...
โดยที่ ...
เป็นหนึ่งในสี่รูปแบบการปรับมาตรฐาน Unicode: "NFC"
, "NFD"
, "NFKC"
หรือ "NFKD"
ค่าข้อมูลเมตาที่ไม่ถูกต้องจะถือว่าเป็นคำเตือนตามค่าเริ่มต้น หากไม่ได้ตั้งใจ ให้ส่ง strict_metadata=True
ไปยังวิธี open
และ pdfplumber.open
จะสร้างข้อยกเว้นหากไม่สามารถแยกวิเคราะห์ข้อมูลเมตาได้
pdfplumber.PDF
คลาส pdfplumber.PDF
ระดับบนสุดแสดงถึง PDF เดียวและมีคุณสมบัติหลักสองประการ:
คุณสมบัติ | คำอธิบาย |
---|---|
.metadata | พจนานุกรมคู่คีย์/ค่าข้อมูลเมตา ที่ดึงมาจากตัวอย่าง Info ของ PDF โดยทั่วไปจะรวมถึง "CreationDate," "ModDate," "Producer" และอื่นๆ |
.pages | รายการที่มีอิน pdfplumber.Page หนึ่งรายการต่อหน้าที่โหลด |
... และยังมีวิธีการดังต่อไปนี้:
วิธี | คำอธิบาย |
---|---|
.close() | การเรียกเมธอดนี้เรียก Page.close() ในแต่ละเพจ และยังปิดสตรีมไฟล์ด้วย (ยกเว้นในกรณีที่สตรีมเป็นแบบภายนอก เช่น เปิดแล้วและส่งผ่านไปยัง pdfplumber โดยตรง) |
pdfplumber.Page
คลาส pdfplumber.Page
เป็นหัวใจสำคัญของ pdfplumber
สิ่งที่คุณจะทำกับ pdfplumber
ส่วนใหญ่จะเกี่ยวกับชั้นเรียนนี้ มีคุณสมบัติหลักดังนี้:
คุณสมบัติ | คำอธิบาย |
---|---|
.page_number | หมายเลขหน้าตามลำดับ เริ่มต้นด้วย 1 สำหรับหน้าแรก 2 สำหรับหน้าที่สอง และอื่นๆ |
.width | ความกว้างของหน้า |
.height | ความสูงของหน้า |
.objects / .chars / .lines / .rects / .curves / .images | คุณสมบัติแต่ละรายการเหล่านี้คือรายการ และแต่ละรายการจะมีพจนานุกรมหนึ่งรายการสำหรับแต่ละออบเจ็กต์ที่ฝังอยู่บนเพจ สำหรับรายละเอียดเพิ่มเติม โปรดดู "วัตถุ" ด้านล่าง |
... และวิธีการหลักเหล่านี้:
วิธี | คำอธิบาย |
---|---|
.crop(bounding_box, relative=False, strict=True) | ส่งกลับเวอร์ชันของหน้าที่ครอบตัดไปที่กรอบขอบ ซึ่งควรแสดงเป็น 4 สิ่งอันดับพร้อมค่า (x0, top, x1, bottom) หน้าที่ครอบตัดจะเก็บวัตถุที่อยู่ภายในกล่องขอบเขตอย่างน้อยบางส่วน หากวัตถุตกลงไปภายในกล่องเพียงบางส่วน ขนาดของวัตถุจะถูกแบ่งส่วนให้พอดีกับกล่องขอบเขต หาก relative=True กล่องขอบเขตจะคำนวณเป็นออฟเซ็ตจากด้านซ้ายบนของกล่องขอบเขตของหน้า แทนที่จะเป็นตำแหน่งที่แน่นอน (ดูตัวอย่างและคำอธิบายในฉบับที่ 245) เมื่อ strict=True (ค่าเริ่มต้น) กรอบขอบของการครอบตัดจะต้องอยู่ภายในกล่องขอบของหน้าทั้งหมด |
.within_bbox(bounding_box, relative=False, strict=True) | คล้ายกับ .crop แต่เก็บเฉพาะวัตถุที่อยู่ ทั้งหมดภายใน กรอบขอบเขตเท่านั้น |
.outside_bbox(bounding_box, relative=False, strict=True) | คล้ายกับ .crop และ .within_bbox แต่เก็บเฉพาะวัตถุที่อยู่ นอก กรอบขอบเขตเท่านั้น |
.filter(test_function) | ส่งคืนเวอร์ชันของเพจที่มีเฉพาะ .objects objects ซึ่ง test_function(obj) ส่งคืน True |
... และยังมีวิธีการดังต่อไปนี้:
วิธี | คำอธิบาย |
---|---|
.close() | ตามค่าเริ่มต้น ออบเจ็กต์ Page จะแคชข้อมูลเค้าโครงและออบเจ็กต์เพื่อหลีกเลี่ยงการประมวลผลใหม่ อย่างไรก็ตาม เมื่อแยกวิเคราะห์ PDF ขนาดใหญ่ คุณสมบัติที่แคชไว้เหล่านี้อาจต้องใช้หน่วยความจำจำนวนมาก คุณสามารถใช้วิธีนี้เพื่อล้างแคชและปล่อยหน่วยความจำ |
วิธีการเพิ่มเติมอธิบายไว้ในส่วนด้านล่าง:
แต่ละอินสแตนซ์ของ pdfplumber.PDF
และ pdfplumber.Page
ให้การเข้าถึงออบเจ็กต์ PDF หลายประเภท ซึ่งทั้งหมดได้มาจากการแยกวิเคราะห์ PDF pdfminer.six
คุณสมบัติต่อไปนี้แต่ละรายการส่งคืนรายการ Python ของออบเจ็กต์ที่ตรงกัน:
.chars
แต่ละตัวแทนอักขระข้อความตัวเดียว.lines
แต่ละเส้นแทนเส้น 1 มิติเส้นเดียว.rects
แต่ละอันเป็นตัวแทนของสี่เหลี่ยม 2 มิติอันเดียว.curves
แต่ละจุดแสดงถึงชุดของจุดเชื่อมต่อที่ pdfminer.six
ไม่รู้จักว่าเป็นเส้นหรือสี่เหลี่ยมผืนผ้า.images
แต่ละอันเป็นตัวแทนของรูปภาพ.annots
แต่ละอันแสดงถึงคำอธิบายประกอบ PDF เดียว (อ้างอิงส่วนที่ 8.4 ของข้อกำหนด PDF อย่างเป็นทางการสำหรับรายละเอียด).hyperlinks
แต่ละอันแสดงถึงคำอธิบายประกอบ PDF เดียวของ Link
ประเภทย่อยและมีแอตทริบิวต์การดำเนินการ URI
แต่ละอ็อบเจ็กต์จะแสดงเป็น Python dict
แบบง่าย โดยมีคุณสมบัติดังต่อไปนี้:
char
คุณสมบัติ | คำอธิบาย |
---|---|
page_number | หมายเลขหน้าที่พบอักขระนี้ |
text | เช่น "z" หรือ "Z" หรือ " " |
fontname | ชื่อแบบอักษรของตัวละคร |
size | ขนาดตัวอักษร |
adv | เท่ากับความกว้างของข้อความ * ขนาดตัวอักษร * ตัวคูณมาตราส่วน |
upright | ไม่ว่าตัวละครจะตั้งตรงก็ตาม |
height | ความสูงของตัวละคร |
width | ความกว้างของตัวอักษร |
x0 | ระยะห่างด้านซ้ายของอักขระจากด้านซ้ายของหน้า |
x1 | ระยะห่างระหว่างด้านขวาของอักขระจากด้านซ้ายของหน้า |
y0 | ระยะห่างระหว่างด้านล่างของอักขระจากด้านล่างของหน้า |
y1 | ระยะห่างระหว่างด้านบนของอักขระจากด้านล่างของหน้า |
top | ระยะห่างระหว่างด้านบนของอักขระจากด้านบนของหน้า |
bottom | ระยะห่างระหว่างด้านล่างของอักขระจากด้านบนของหน้า |
doctop | ระยะห่างระหว่างด้านบนของอักขระจากด้านบนของเอกสาร |
matrix | "เมทริกซ์การแปลงปัจจุบัน" สำหรับอักขระนี้ (ดูรายละเอียดด้านล่าง) |
mcid | รหัสส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับอักขระนี้ หากมี (มิฉะนั้น None ) คุณลักษณะการทดลอง |
tag | แท็กส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับอักขระนี้ ถ้ามี (มิฉะนั้น None ) คุณลักษณะการทดลอง |
ncs | ทีเคทีเค |
stroking_pattern | ทีเคทีเค |
non_stroking_pattern | ทีเคทีเค |
stroking_color | สีของโครงร่างของตัวละคร (เช่น เส้นขีด) ดูเอกสาร/colors.mdสำหรับรายละเอียด |
non_stroking_color | สีภายในของตัวละคร ดูเอกสาร/colors.mdสำหรับรายละเอียด |
object_type | "ถ่าน" |
หมายเหตุ : คุณสมบัติ matrix
ของอักขระแสดงถึง "เมทริกซ์การแปลงปัจจุบัน" ตามที่อธิบายไว้ในส่วนที่ 4.2.2 ของการอ้างอิง PDF (ฉบับที่ 6) เมทริกซ์จะควบคุมขนาด การเอียง และการแปลตำแหน่งของอักขระ การหมุนเป็นการผสมผสานระหว่างสเกลและความเบ้ แต่ในกรณีส่วนใหญ่ถือได้ว่าเท่ากับความเบ้ของแกน x โมดูลย่อย pdfplumber.ctm
กำหนดคลาส CTM
ที่ช่วยในการคำนวณเหล่านี้ ตัวอย่างเช่น:
from pdfplumber . ctm import CTM
my_char = pdf . pages [ 0 ]. chars [ 3 ]
my_char_ctm = CTM ( * my_char [ "matrix" ])
my_char_rotation = my_char_ctm . skew_x
line
คุณสมบัติ | คำอธิบาย |
---|---|
page_number | หมายเลขหน้าที่พบบรรทัดนี้ |
height | ความสูงของเส้น. |
width | ความกว้างของเส้น. |
x0 | ระยะห่างของส่วนปลายด้านซ้ายจากด้านซ้ายของหน้า |
x1 | ระยะห่างของส่วนปลายด้านขวาจากด้านซ้ายของหน้า |
y0 | ระยะห่างจากส่วนล่างสุดของหน้า |
y1 | ระยะห่างจากส่วนบนสุดด้านล่างของหน้า |
top | ระยะห่างของบรรทัดบนสุดจากด้านบนของหน้า |
bottom | ระยะห่างจากด้านล่างสุดของบรรทัดจากด้านบนของหน้า |
doctop | ระยะห่างระหว่างด้านบนของบรรทัดจากด้านบนของเอกสาร |
linewidth | ความหนาของเส้น |
stroking_color | สีของเส้น ดูเอกสาร/colors.mdสำหรับรายละเอียด |
non_stroking_color | สีที่ไม่ลากเส้นที่ระบุสำหรับเส้นทางของเส้น ดูเอกสาร/colors.mdสำหรับรายละเอียด |
mcid | รหัสส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับบรรทัดนี้ ถ้ามี (มิฉะนั้น None ) คุณลักษณะการทดลอง |
tag | แท็กส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับบรรทัดนี้ ถ้ามี (มิฉะนั้น None ) คุณลักษณะการทดลอง |
object_type | "เส้น" |
rect
คุณสมบัติ | คำอธิบาย |
---|---|
page_number | หมายเลขหน้าที่พบสี่เหลี่ยมนี้ |
height | ความสูงของสี่เหลี่ยม. |
width | ความกว้างของสี่เหลี่ยมผืนผ้า |
x0 | ระยะห่างด้านซ้ายของรูปสี่เหลี่ยมผืนผ้าจากด้านซ้ายของหน้า |
x1 | ระยะห่างด้านขวาของสี่เหลี่ยมผืนผ้าจากด้านซ้ายของหน้า |
y0 | ระยะห่างด้านล่างของสี่เหลี่ยมผืนผ้าจากด้านล่างของหน้า |
y1 | ระยะห่างระหว่างด้านบนของสี่เหลี่ยมผืนผ้าจากด้านล่างของหน้า |
top | ระยะห่างระหว่างด้านบนของสี่เหลี่ยมผืนผ้าจากด้านบนของหน้า |
bottom | ระยะห่างระหว่างด้านล่างของสี่เหลี่ยมผืนผ้าจากด้านบนของหน้า |
doctop | ระยะห่างระหว่างด้านบนของสี่เหลี่ยมผืนผ้าจากด้านบนของเอกสาร |
linewidth | ความหนาของเส้น |
stroking_color | สีของโครงร่างของสี่เหลี่ยม ดูเอกสาร/colors.mdสำหรับรายละเอียด |
non_stroking_color | สีเติมของสี่เหลี่ยม ดูเอกสาร/colors.mdสำหรับรายละเอียด |
mcid | รหัสส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับการแก้ไขนี้ หากมี (มิฉะนั้น None ) คุณลักษณะการทดลอง |
tag | แท็กส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับการแก้ไขนี้ ถ้ามี (มิฉะนั้น None ) คุณลักษณะการทดลอง |
object_type | "ถูกต้อง" |
curve
คุณสมบัติ | คำอธิบาย |
---|---|
page_number | หมายเลขหน้าที่พบเส้นโค้งนี้ |
pts | รายการสิ่งอันดับ (x, top) ที่ระบุ จุดบนเส้นโค้ง |
path | รายการสิ่งอันดับ (cmd, *(x, top)) ที่อธิบายคำอธิบายเส้นทางแบบเต็ม รวมถึง (ตัวอย่าง) จุดควบคุมที่ใช้ในเส้นโค้ง Bezier |
height | ความสูงของกรอบขอบเขตของเส้นโค้ง |
width | ความกว้างของกรอบขอบของเส้นโค้ง |
x0 | ระยะห่างของจุดซ้ายสุดของเส้นโค้งจากด้านซ้ายของหน้า |
x1 | ระยะห่างของจุดขวาสุดของเส้นโค้งจากด้านซ้ายของหน้า |
y0 | ระยะห่างของจุดต่ำสุดของเส้นโค้งจากด้านล่างสุดของหน้า |
y1 | ระยะห่างของจุดสูงสุดของเส้นโค้งจากด้านล่างสุดของหน้า |
top | ระยะทางจุดสูงสุดของเส้นโค้งจากด้านบนของหน้า |
bottom | ระยะห่างของจุดต่ำสุดของเส้นโค้งจากด้านบนของหน้า |
doctop | ระยะห่างของจุดสูงสุดของเส้นโค้งจากด้านบนของเอกสาร |
linewidth | ความหนาของเส้น |
fill | เติมรูปร่างที่กำหนดโดยเส้นทางของเส้นโค้งหรือไม่ |
stroking_color | สีของโครงร่างของเส้นโค้ง ดูเอกสาร/colors.mdสำหรับรายละเอียด |
non_stroking_color | สีเติมของเส้นโค้ง ดูเอกสาร/colors.mdสำหรับรายละเอียด |
dash | สิ่งอันดับ ([dash_array], dash_phase) อธิบายลักษณะเส้นประของเส้นโค้ง ดูตาราง 4.6 ของข้อกำหนด PDF สำหรับรายละเอียด |
mcid | รหัสส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับเส้นโค้งนี้ (ถ้ามี) (มิฉะนั้น None ) คุณลักษณะการทดลอง |
tag | แท็กส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับเส้นโค้งนี้ ถ้ามี (มิฉะนั้น None ) คุณลักษณะการทดลอง |
object_type | "โค้ง" |
นอกจากนี้ ทั้ง pdfplumber.PDF
และ pdfplumber.Page
ยังให้การเข้าถึงรายการวัตถุที่ได้รับมาหลายรายการ: .rect_edges
(ซึ่งแยกแต่ละสี่เหลี่ยมผืนผ้าออกเป็นสี่บรรทัด), .curve_edges
(ซึ่งทำเช่นเดียวกันสำหรับวัตถุ curve
) และ .edges
(ซึ่งรวมเข้าด้วยกัน .rect_edges
, .curve_edges
และ .lines
)
image
หมายเหตุ: แม้ว่าตำแหน่งและคุณลักษณะของออบเจ็กต์ image
จะพร้อมใช้งานผ่าน pdfplumber
แต่ไลบรารีนี้ไม่ได้ให้การสนับสนุนโดยตรงสำหรับการสร้างเนื้อหารูปภาพใหม่ โปรดดูคำแนะนำนี้
คุณสมบัติ | คำอธิบาย |
---|---|
page_number | หมายเลขหน้าที่พบรูปภาพ |
height | ความสูงของภาพ |
width | ความกว้างของภาพ |
x0 | ระยะห่างด้านซ้ายของภาพจากด้านซ้ายของหน้า |
x1 | ระยะห่างระหว่างด้านขวาของภาพจากด้านซ้ายของหน้า |
y0 | ระยะห่างระหว่างด้านล่างของภาพจากด้านล่างของหน้า |
y1 | ระยะห่างระหว่างด้านบนของภาพจากด้านล่างของหน้า |
top | ระยะห่างระหว่างด้านบนของภาพจากด้านบนของหน้า |
bottom | ระยะห่างระหว่างด้านล่างของภาพจากด้านบนของหน้า |
doctop | ระยะห่างระหว่างด้านบนของสี่เหลี่ยมผืนผ้าจากด้านบนของเอกสาร |
srcsize | ขนาดดั้งเดิมของรูปภาพเป็นแบบทูเพิล (width, height) |
colorspace | โดเมนสีของรูปภาพ (เช่น RGB) |
bits | จำนวนบิตต่อส่วนประกอบสี เช่น 8 สอดคล้องกับค่าที่เป็นไปได้ 255 ค่าสำหรับแต่ละองค์ประกอบสี (R, G และ B ในพื้นที่สี RGB) |
stream | ค่าพิกเซลของรูปภาพเป็นวัตถุ pdfminer.pdftypes.PDFStream |
imagemask | บูลีนที่เป็นโมฆะ; ถ้าเป็น True "ระบุว่าข้อมูลรูปภาพจะถูกใช้เป็นมาสก์ลายฉลุสำหรับการวาดภาพด้วยสีปัจจุบัน" |
mcid | รหัสส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับรูปภาพนี้ หากมี (มิฉะนั้น None ) คุณลักษณะการทดลอง |
tag | แท็กส่วนเนื้อหาที่ทำเครื่องหมายไว้สำหรับรูปภาพนี้ ถ้ามี (มิฉะนั้น None ) คุณลักษณะการทดลอง |
object_type | "ภาพ" |
pdfminer.six
หากคุณส่งพารามิเตอร์ pdfminer.six
-handling laparams
ไปที่ pdfplumber.open(...)
พจนานุกรม .objects
ของแต่ละหน้าก็จะมีออบเจ็กต์เค้าโครงระดับสูงกว่าของ pdfminer.six
เช่น "textboxhorizontal"
เครื่องมือแก้ไขข้อบกพร่องด้วยภาพของ pdfplumber
มีประโยชน์ในการทำความเข้าใจโครงสร้างของ PDF และออบเจ็กต์ที่ถูกแยกออกมา
PageImage
ด้วย .to_image()
หากต้องการเปลี่ยนหน้าใดๆ (รวมถึงหน้าที่ครอบตัด) ให้เป็นออบเจ็กต์ PageImage
ให้โทร my_page.to_image()
คุณสามารถเลือกที่จะส่ง หนึ่ง ในอาร์กิวเมนต์คำหลักต่อไปนี้:
resolution
: จำนวนพิกเซลที่ต้องการต่อนิ้ว ค่าเริ่มต้น: 72
ประเภท: int
.width
: ความกว้างของภาพที่ต้องการเป็นพิกเซล ค่าเริ่มต้น: ไม่ได้ตั้งค่า กำหนดโดย resolution
ประเภท: int
.height
: ความกว้างของภาพที่ต้องการเป็นพิกเซล ค่าเริ่มต้น: ไม่ได้ตั้งค่า กำหนดโดย resolution
ประเภท: int
.antialias
: จะใช้การลดรอยหยักเมื่อสร้างภาพหรือไม่ การตั้งค่าเป็น True
จะสร้างภาพที่มีข้อความและกราฟิกที่มีรอยหยักน้อยลง แต่มีขนาดไฟล์ใหญ่กว่า ค่าเริ่มต้น: False
ประเภท: bool
.force_mediabox
: ใช้ขนาด .mediabox
ของหน้า แทนขนาด .cropbox
ค่าเริ่มต้น: False
ประเภท: bool
.ตัวอย่างเช่น:
im = my_pdf . pages [ 0 ]. to_image ( resolution = 150 )
จากสคริปต์หรือ REPL im.show()
จะเปิดภาพในโปรแกรมดูรูปภาพในเครื่องของคุณ แต่ออบเจ็กต์ PageImage
ยังเล่นได้ดีกับสมุดบันทึก Jupyter พวกมันจะเรนเดอร์เป็นเซลล์เอาท์พุตโดยอัตโนมัติ ตัวอย่างเช่น:
หมายเหตุ : .to_image(...)
ทำงานตามที่คาดไว้กับอินสแตนซ์ Page.crop(...)
/ CroppedPage
แต่ไม่สามารถรวมการเปลี่ยนแปลงที่ทำผ่านอินสแตนซ์ Page.filter(...)
/ FilteredPage
ได้
PageImage
พื้นฐานวิธี | คำอธิบาย |
---|---|
im.reset() | ล้างสิ่งที่คุณวาดจนถึงตอนนี้ |
im.copy() | คัดลอกรูปภาพไปยังวัตถุ PageImage ใหม่ |
im.show() | เปิดภาพในโปรแกรมดูรูปภาพในเครื่องของคุณ |
im.save(path_or_fileobject, format="PNG", quantize=True, colors=256, bits=8) | บันทึกภาพที่มีคำอธิบายประกอบเป็นไฟล์ PNG อาร์กิวเมนต์เริ่มต้นกำหนดปริมาณรูปภาพเป็นจานสี 256 สี บันทึก PNG ด้วยความลึกของสี 8 บิต คุณสามารถปิดใช้งานการหาปริมาณได้โดยส่ง quantize=False หรือปรับขนาดของจานสีโดยส่งผ่าน colors=N |
คุณสามารถส่งพิกัดที่ชัดเจนหรือวัตถุ pdfplumber
PDF ใดๆ (เช่น ถ่าน เส้น สี่เหลี่ยม) ไปยังวิธีการเหล่านี้ได้
วิธีการวัตถุเดียว | วิธีการเป็นกลุ่ม | คำอธิบาย |
---|---|---|
im.draw_line(line, stroke={color}, stroke_width=1) | im.draw_lines(list_of_lines, **kwargs) | ลากเส้นจาก line , curve หรือ 2 สิ่งอันดับจาก 2 สิ่งอันดับ (เช่น ((x, y), (x, y)) ) |
im.draw_vline(location, stroke={color}, stroke_width=1) | im.draw_vlines(list_of_locations, **kwargs) | วาดเส้นแนวตั้งที่พิกัด x ที่ระบุโดย location |
im.draw_hline(location, stroke={color}, stroke_width=1) | im.draw_hlines(list_of_locations, **kwargs) | วาดเส้นแนวนอนที่พิกัด y ที่ระบุโดย location |
im.draw_rect(bbox_or_obj, fill={color}, stroke={color}, stroke_width=1) | im.draw_rects(list_of_rects, **kwargs) | วาดรูปสี่เหลี่ยมผืนผ้าจาก rect , char ฯลฯ หรือกล่องที่มีขอบเขต 4 สิ่งอันดับ |
im.draw_circle(center_or_obj, radius=5, fill={color}, stroke={color}) | im.draw_circles(list_of_circles, **kwargs) | วาดวงกลมที่พิกัด (x, y) หรือที่จุดศูนย์กลางของ char , rect ฯลฯ |
หมายเหตุ: วิธีการข้างต้นสร้างขึ้นจากวิธี ImageDraw
ของ Pillow แต่พารามิเตอร์ได้รับการปรับแต่งเพื่อให้สอดคล้องกับระบบการตั้งชื่อ fill
/ stroke
/ stroke_width
ของ SVG
im.debug_tablefinder(table_settings={})
จะส่งคืนเวอร์ชันของ PageImage โดยมีเส้นที่ตรวจพบ (สีแดง) จุดตัด (วงกลม) และตาราง (สีฟ้าอ่อน) ซ้อนทับ
pdfplumber
สามารถแยกข้อความจากหน้าใดก็ได้ (รวมถึงหน้าที่ครอบตัดและหน้าที่รับมา) นอกจากนี้ยังสามารถพยายามรักษาเค้าโครงของข้อความนั้น ตลอดจนระบุพิกัดของคำและข้อความค้นหา วัตถุ Page
สามารถเรียกใช้วิธีการแยกข้อความต่อไปนี้:
วิธี | คำอธิบาย |
---|---|
.extract_text(x_tolerance=3, x_tolerance_ratio=None, y_tolerance=3, layout=False, x_density=7.25, y_density=13, line_dir_render=None, char_dir_render=None, **kwargs) | เรียงอ็อบเจ็กต์อักขระทั้งหมดของเพจให้เป็นสตริงเดียว
|
.extract_text_simple(x_tolerance=3, y_tolerance=3) | .extract_text(...) เวอร์ชันที่เร็วกว่าเล็กน้อยแต่มีความยืดหยุ่นน้อยกว่า โดยใช้ตรรกะที่ง่ายกว่า |
.extract_words(x_tolerance=3, x_tolerance_ratio=None, y_tolerance=3, keep_blank_chars=False, use_text_flow=False, line_dir="ttb", char_dir="ltr", line_dir_rotated="ttb", char_dir_rotated="ltr", extra_attrs=[], split_at_punctuation=False, expand_ligatures=True, return_chars=False) | ส่งกลับรายการสิ่งที่มีลักษณะเป็นคำทั้งหมดและกรอบล้อมรอบ คำต่างๆ ถือเป็นลำดับของอักขระโดยที่ (สำหรับอักขระ "ตรง") ความแตกต่างระหว่าง x1 ของอักขระหนึ่งตัวและ x0 ของอักขระถัดไปน้อยกว่าหรือเท่ากับ x_tolerance และ ตำแหน่งที่ doctop ของอักขระหนึ่งตัวและ doctop ของอักขระถัดไป น้อยกว่าหรือเท่ากับ y_tolerance (หาก x_tolerance_ratio ไม่ใช่ None ตัวแยกจะใช้ x_tolerance แบบไดนามิกเท่ากับ x_tolerance_ratio * previous_character["size"] ) วิธีการที่คล้ายกันนี้ใช้สำหรับอักขระที่ไม่ตั้งตรง แต่แทนที่จะวัดระยะห่างในแนวตั้ง แทนที่จะเป็นแนวนอน การเปลี่ยน keep_blank_chars เป็น True หมายความว่าอักขระว่างจะถือว่าเป็นส่วนหนึ่งของคำ ไม่ใช่ช่องว่างระหว่างคำ การเปลี่ยน use_text_flow เป็น True จะใช้ลำดับอักขระพื้นฐานของ PDF เพื่อเป็นแนวทางในการเรียงลำดับและแบ่งกลุ่มคำ แทนที่จะจัดเรียงอักขระล่วงหน้าตามตำแหน่ง x/y (สิ่งนี้เลียนแบบวิธีการลากเคอร์เซอร์เพื่อเน้นข้อความใน PDF เช่นเดียวกับที่ลำดับนั้นดูเหมือนจะไม่เป็นตรรกะเสมอไป) อาร์กิวเมนต์ line_dir และ char_dir บอกวิธีการนี้ถึงทิศทางที่บรรทัด/อักขระที่คาดว่าจะอ่าน ตัวเลือกที่ถูกต้องคือ "ttb" (บนลงล่าง), "btt" (ล่างขึ้นบน), "ltr" (ซ้ายไปขวา) และ "rtl" (ขวาไปซ้าย) อาร์กิวเมนต์ line_dir_rotated และ char_dir_rotated คล้ายกัน แต่สำหรับข้อความที่ถูกหมุน การส่งผ่านรายการ extra_attrs (เช่น ["fontname", "size"] จะจำกัดแต่ละคำไว้เฉพาะอักขระที่มีค่าเท่ากันทุกประการสำหรับคุณลักษณะแต่ละรายการเหล่านั้น และผลลัพธ์ของคำ dicts จะระบุคุณลักษณะเหล่านั้น การตั้งค่า split_at_punctuation เป็น True จะ บังคับใช้การทำลายโทเค็นที่เครื่องหมายวรรคตอนที่ระบุโดย string.punctuation หรือคุณสามารถระบุรายการการแยกเครื่องหมายวรรคตอนด้วยการส่งสตริง เช่น split_at_punctuation='!"&'()*+,.:;<=>?@[]^`{|}~' เว้นแต่คุณจะตั้ง expand_ligatures=False การผูกเช่น fi จะถูกขยายเป็นตัวอักษรที่เป็นส่วนประกอบ (เช่น , fi ) การส่ง return_chars=True จะเพิ่มรายการอักขระที่เป็นส่วนประกอบลงในพจนานุกรมแต่ละคำ เป็นรายการในฟิลด์ "chars" |
.extract_text_lines(layout=False, strip=True, return_chars=True, **kwargs) | คุณลักษณะทดลอง ที่ส่งคืนรายการพจนานุกรมที่แสดงถึงบรรทัดข้อความบนหน้า พารามิเตอร์ strip ทำงานคล้ายคลึงกับเมธอด str.strip() ของ Python และส่งกลับแอตทริบิวต์ text โดยไม่มีช่องว่างล้อมรอบ (เกี่ยวข้องเฉพาะเมื่อ layout = True เท่านั้น) การตั้งค่า return_chars เป็น False จะแยกอ็อบเจ็กต์อักขระแต่ละตัวออกจาก dicts บรรทัดข้อความที่ส่งคืน **kwargs ที่เหลือคือสิ่งที่คุณจะส่งต่อไปยัง .extract_text(layout=True, ...) |
.search(pattern, regex=True, case=True, main_group=0, return_groups=True, return_chars=True, layout=False, **kwargs) | คุณลักษณะทดลอง ที่ช่วยให้คุณสามารถค้นหาข้อความของหน้าเว็บ โดยแสดงรายการอินสแตนซ์ทั้งหมดที่ตรงกับข้อความค้นหา สำหรับแต่ละอินสแตนซ์ ออบเจ็กต์พจนานุกรมการตอบสนองประกอบด้วยข้อความที่ตรงกัน กลุ่ม regex ที่ตรงกัน พิกัดของกรอบขอบเขต และตัวอ็อบเจ็กต์ถ่านเอง pattern อาจเป็นนิพจน์ทั่วไปที่คอมไพล์แล้ว นิพจน์ทั่วไปที่ยังไม่ได้คอมไพล์ หรือสตริงที่ไม่ใช่ regex หาก regex เป็น False รูปแบบจะถือเป็นสตริงที่ไม่ใช่ regex หาก case เป็น False การค้นหาจะดำเนินการในลักษณะที่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ การตั้งค่า main_group จะจำกัดผลลัพธ์ไว้เฉพาะกลุ่ม regex ภายใน pattern (ค่าเริ่มต้นคือ 0 หมายถึงการจับคู่ทั้งหมด) การตั้งค่า return_groups และ/หรือ return_chars เป็น False จะยกเว้นรายการของกลุ่ม regex ที่ตรงกันและ/หรืออักขระจากการเพิ่ม (เป็น "groups" และ "chars" ลงใน return dicts) พารามิเตอร์ layout ทำงานเหมือนกับที่ทำกับ .extract_text(...) **kwargs ที่เหลือคือสิ่งที่คุณจะส่งต่อไปยัง .extract_text(layout=True, ...) หมายเหตุ : การจับคู่ความกว้างเป็นศูนย์และช่องว่างทั้งหมดจะถูกยกเลิก เนื่องจาก (โดยทั่วไป) ไม่มีตำแหน่งที่ชัดเจนในเพจ |
.dedupe_chars(tolerance=1, extra_attrs=("fontname", "size")) | ส่งกลับเวอร์ชันของหน้าที่มีอักขระที่ซ้ำกัน — อักขระที่ใช้ข้อความเดียวกันร่วมกัน, ตำแหน่ง (ภายใน tolerance x/y) และ extra_attrs เหมือนกับอักขระอื่นๆ — ถูกลบออก (ดูฉบับที่ 71 เพื่อทำความเข้าใจแรงจูงใจ) |
วิธีการตรวจจับตารางของ pdfplumber
ยืมมาจากวิทยานิพนธ์ระดับปริญญาโทของ Anssi Nurminen และได้รับแรงบันดาลใจจาก Tabula มันทำงานเช่นนี้:
วัตถุ pdfplumber.Page
สามารถเรียกวิธีการตารางต่อไปนี้:
วิธี | คำอธิบาย |
---|---|
.find_tables(table_settings={}) | ส่งคืนรายการวัตถุ Table อ็อบเจ็กต์ Table ให้การเข้าถึงคุณสมบัติ .cells , .rows , .columns และ .bbox รวมถึงเมธอด .extract(x_tolerance=3, y_tolerance=3) |
.find_table(table_settings={}) | คล้ายกับ .find_tables(...) แต่ส่งคืนตาราง ที่ใหญ่ที่สุด บนเพจเป็นวัตถุ Table หากหลายตารางมีขนาดเท่ากัน โดยวัดจากจำนวนเซลล์ วิธีนี้จะส่งคืนตารางที่ใกล้กับด้านบนสุดของหน้ามากที่สุด |
.extract_tables(table_settings={}) | ส่งคืนข้อความที่แยกจากตาราง ทั้งหมด ที่พบในหน้า ซึ่งแสดงเป็นรายการรายการ โดยมีโครงสร้าง table -> row -> cell |
.extract_table(table_settings={}) | ส่งกลับข้อความที่แยกมาจากตาราง ที่ใหญ่ที่สุด บนหน้า (ดู .find_table(...) ด้านบน) ซึ่งแสดงเป็นรายการรายการ โดยมี row -> cell |
.debug_tablefinder(table_settings={}) | ส่งคืนอินสแตนซ์ของคลาส TableFinder พร้อมการเข้าถึงคุณสมบัติ . .edges , .intersections , .cells และ .tables |
ตัวอย่างเช่น:
pdf = pdfplumber . open ( "path/to/my.pdf" )
page = pdf . pages [ 0 ]
page . extract_table ()
คลิกที่นี่เพื่อดูตัวอย่างโดยละเอียดเพิ่มเติม
ตามค่าเริ่มต้น extract_tables
จะใช้เส้นแนวตั้งและแนวนอนของหน้า (หรือขอบสี่เหลี่ยมผืนผ้า) เป็นตัวคั่นเซลล์ แต่วิธีนี้สามารถปรับแต่งได้สูงผ่านอาร์กิวเมนต์ table_settings
การตั้งค่าที่เป็นไปได้และค่าเริ่มต้น:
{
"vertical_strategy" : "lines" ,
"horizontal_strategy" : "lines" ,
"explicit_vertical_lines" : [],
"explicit_horizontal_lines" : [],
"snap_tolerance" : 3 ,
"snap_x_tolerance" : 3 ,
"snap_y_tolerance" : 3 ,
"join_tolerance" : 3 ,
"join_x_tolerance" : 3 ,
"join_y_tolerance" : 3 ,
"edge_min_length" : 3 ,
"min_words_vertical" : 3 ,
"min_words_horizontal" : 1 ,
"intersection_tolerance" : 3 ,
"intersection_x_tolerance" : 3 ,
"intersection_y_tolerance" : 3 ,
"text_tolerance" : 3 ,
"text_x_tolerance" : 3 ,
"text_y_tolerance" : 3 ,
"text_*" : …, # See below
}
การตั้งค่า | คำอธิบาย |
---|---|
"vertical_strategy" | ไม่ว่าจะเป็น "lines" , "lines_strict" , "text" หรือ "explicit" ดูคำอธิบายด้านล่าง |
"horizontal_strategy" | ไม่ว่าจะเป็น "lines" , "lines_strict" , "text" หรือ "explicit" ดูคำอธิบายด้านล่าง |
"explicit_vertical_lines" | รายการเส้นแนวตั้งที่แบ่งเขตเซลล์ในตารางอย่างชัดเจน สามารถใช้ร่วมกับกลยุทธ์ใดๆ ข้างต้นได้ รายการในรายการควรเป็นตัวเลขอย่างใดอย่างหนึ่ง โดยระบุพิกัด x ของบรรทัดที่ความสูงเต็มหน้า หรือวัตถุ line / rect / curve |
"explicit_horizontal_lines" | รายการเส้นแนวนอนที่แบ่งเขตเซลล์ในตารางอย่างชัดเจน สามารถใช้ร่วมกับกลยุทธ์ใดๆ ข้างต้นได้ รายการในรายการควรเป็นตัวเลขอย่างใดอย่างหนึ่ง โดยระบุพิกัด y ของบรรทัดที่ความสูงเต็มหน้า หรือวัตถุ line / rect / curve |
"snap_tolerance" , "snap_x_tolerance" , "snap_y_tolerance" | เส้นขนานภายในจุด snap_tolerance จะถูก "จัดชิด" ไปยังตำแหน่งแนวนอนหรือแนวตั้งเดียวกัน |
"join_tolerance" , "join_x_tolerance" , "join_y_tolerance" | ส่วนของเส้นตรงบนเส้นอนันต์เดียวกันและปลายอยู่ในขอบเขต join_tolerance ต่อกัน จะถูก "รวม" ให้เป็นส่วนของเส้นตรงเส้นเดียว |
"edge_min_length" | ขอบที่สั้นกว่า edge_min_length จะถูกละทิ้งก่อนที่จะพยายามสร้างตารางใหม่ |
"min_words_vertical" | เมื่อใช้ "vertical_strategy": "text" อย่างน้อยคำ min_words_vertical จะต้องอยู่ในแนวเดียวกัน |
"min_words_horizontal" | เมื่อใช้ "horizontal_strategy": "text" อย่างน้อยคำ min_words_horizontal จะต้องอยู่ในแนวเดียวกัน |
"intersection_tolerance" , "intersection_x_tolerance" , "intersection_y_tolerance" | เมื่อรวมขอบเข้ากับเซลล์ ขอบตั้งฉากต้องอยู่ภายในจุด intersection_tolerance จึงจะถือว่าตัดกัน |
"text_*" | การตั้งค่าทั้งหมดที่นำหน้าด้วย text_ จะถูกนำมาใช้เมื่อแยกข้อความจากแต่ละตารางที่ค้นพบ อาร์กิวเมนต์ที่เป็นไปได้ทั้งหมดของ Page.extract_text(...) ก็ใช้ได้ที่นี่เช่นกัน |
"text_x_tolerance" , "text_y_tolerance" | การตั้งค่า text_ -prefixed เหล่านี้ ยัง นำไปใช้กับอัลกอริธึมการระบุตาราง เมื่อใช้กลยุทธ์ text กล่าวคือ เมื่ออัลกอริทึมนั้นค้นหาคำ จะคาดหวังว่าตัวอักษรแต่ละตัวในแต่ละคำจะอยู่ห่างกันไม่เกิน text_x_tolerance / text_y_tolerance |
ทั้ง vertical_strategy
และ horizontal_strategy
ยอมรับตัวเลือกต่อไปนี้:
กลยุทธ์ | คำอธิบาย |
---|---|
"lines" | ใช้เส้นกราฟิกของหน้า รวมถึงด้านข้างของวัตถุสี่เหลี่ยมผืนผ้า เป็นเส้นขอบของเซลล์ตารางที่เป็นไปได้ |
"lines_strict" | ใช้เส้นกราฟิกของหน้า — แต่ ไม่ใช่ ด้านข้างของวัตถุสี่เหลี่ยมผืนผ้า — เป็นเส้นขอบของเซลล์ตารางที่เป็นไปได้ |
"text" | สำหรับ vertical_strategy : สรุปบรรทัด (จินตภาพ) ที่เชื่อมต่อด้านซ้าย ขวา หรือกึ่งกลางของคำบนหน้า และใช้เส้นเหล่านั้นเป็นเส้นขอบของเซลล์ตารางที่เป็นไปได้ สำหรับ horizontal_strategy เหมือนกันแต่ใช้คำนำหน้า |
"explicit" | ใช้เฉพาะบรรทัดที่กำหนดไว้อย่างชัดเจนใน explicit_vertical_lines / explicit_horizontal_lines เท่านั้น |
บ่อยครั้งที่การครอบตัดหน้า — Page.crop(bounding_box)
— ก่อนที่จะพยายามแยกตารางจะเป็นประโยชน์
การแยกตารางสำหรับ pdfplumber
ได้รับการออกแบบใหม่อย่างรุนแรงสำหรับ v0.5.0
และนำเสนอการเปลี่ยนแปลงที่ไม่สมบูรณ์
บางครั้งไฟล์ PDF อาจมีแบบฟอร์มที่มีการป้อนข้อมูลที่ผู้ใช้สามารถกรอกและบันทึกได้ แม้ว่าค่าในช่องแบบฟอร์มจะปรากฏเหมือนกับข้อความอื่นๆ ในไฟล์ PDF แต่ข้อมูลในแบบฟอร์มจะได้รับการจัดการแตกต่างออกไป หากคุณต้องการรายละเอียดที่เต็มไปด้วยเลือด โปรดดูหน้า 671 ของข้อกำหนดนี้
pdfplumber
ไม่มีอินเทอร์เฟซสำหรับการทำงานกับข้อมูลในแบบฟอร์ม แต่คุณสามารถเข้าถึงได้โดยใช้ wrappers ของ pdfplumber
รอบ ๆ pdfminer
ตัวอย่างเช่น ตัวอย่างนี้จะดึงชื่อและค่าของฟิลด์แบบฟอร์มและจัดเก็บไว้ในพจนานุกรม
import pdfplumber
from pdfplumber . utils . pdfinternals import resolve_and_decode , resolve
pdf = pdfplumber . open ( "document_with_form.pdf" )
def parse_field_helper ( form_data , field , prefix = None ):
""" appends any PDF AcroForm field/value pairs in `field` to provided `form_data` list
if `field` has child fields, those will be parsed recursively.
"""
resolved_field = field . resolve ()
field_name = '.' . join ( filter ( lambda x : x , [ prefix , resolve_and_decode ( resolved_field . get ( "T" ))]))
if "Kids" in resolved_field :
for kid_field in resolved_field [ "Kids" ]:
parse_field_helper ( form_data , kid_field , prefix = field_name )
if "T" in resolved_field or "TU" in resolved_field :
# "T" is a field-name, but it's sometimes absent.
# "TU" is the "alternate field name" and is often more human-readable
# your PDF may have one, the other, or both.
alternate_field_name = resolve_and_decode ( resolved_field . get ( "TU" )) if resolved_field . get ( "TU" ) else None
field_value = resolve_and_decode ( resolved_field [ "V" ]) if 'V' in resolved_field else None
form_data . append ([ field_name , alternate_field_name , field_value ])
form_data = []
fields = resolve ( resolve ( pdf . doc . catalog [ "AcroForm" ])[ "Fields" ])
for field in fields :
parse_field_helper ( form_data , field )
เมื่อคุณรันสคริปต์นี้ form_data
จะเป็นรายการที่มีทูเปิลสามองค์ประกอบสำหรับแต่ละองค์ประกอบของฟอร์ม ตัวอย่างเช่น แบบฟอร์ม PDF ที่มีฟิลด์เมืองและรัฐอาจมีลักษณะเช่นนี้
[
['STATE.0', 'enter STATE', 'CA'],
['section 2 accident infoRmation.1.0',
'enter city of accident',
'SAN FRANCISCO']
]
ขอบคุณ @jeremybmerrill ที่ช่วยรักษาโค้ดแยกวิเคราะห์แบบฟอร์มด้านบน
extract_table
ในรายงานการแจ้งเตือนการปรับปรุงและฝึกอบรมพนักงานของรัฐแคลิฟอร์เนีย (WARN) สาธิตการแก้ไขจุดบกพร่องด้วยภาพขั้นพื้นฐานและการแยกตารางextract_table
บนไฟล์ PDF ของระบบตรวจสอบประวัติอาชญากรรมทันทีแห่งชาติของ FBI สาธิตวิธีใช้การแก้ไขข้อบกพร่องด้วยภาพเพื่อค้นหาการตั้งค่าการแยกตารางที่เหมาะสมที่สุด ยังสาธิต Page.crop(...)
และ Page.extract_text(...).
curve
Page.extract_text(...)
ไลบรารี Python อื่นๆ อีกหลายแห่งช่วยให้ผู้ใช้ดึงข้อมูลจาก PDF ได้ จากภาพรวมโดยกว้าง pdfplumber
มีความโดดเด่นจากไลบรารีการประมวลผล PDF อื่นๆ ด้วยการรวมคุณสมบัติเหล่านี้:
การทราบว่าฟีเจอร์ใดที่ pdfplumber
ไม่มี ให้ก็มีประโยชน์เช่นกัน:
pdfminer.six
เป็นรากฐานสำหรับ pdfplumber
โดยเน้นที่การแยกวิเคราะห์ PDF เป็นหลัก การวิเคราะห์เค้าโครง PDF และการวางตำแหน่งวัตถุ และการแยกข้อความ ไม่มีเครื่องมือสำหรับการแยกตารางหรือการดีบักด้วยภาพ
PyPDF2
เป็นไลบรารี Python ล้วนๆ "ที่สามารถแยก ผสาน ครอบตัด และแปลงหน้าของไฟล์ PDF ได้ นอกจากนี้ยังสามารถเพิ่มข้อมูลที่กำหนดเอง ตัวเลือกการดู และรหัสผ่านลงในไฟล์ PDF" สามารถแยกข้อความในหน้าได้ แต่ไม่ได้ช่วยให้เข้าถึงวัตถุรูปร่าง (สี่เหลี่ยม เส้น ฯลฯ) การแยกตาราง หรือเครื่องมือแก้ไขจุดบกพร่องทางสายตาได้ง่าย
pymupdf
นั้นเร็วกว่า pdfminer.six
อย่างมาก (และด้วย pdfplumber
) และสามารถสร้างและแก้ไข PDF ได้ แต่ไลบรารีจำเป็นต้องติดตั้งซอฟต์แวร์ที่ไม่ใช่ Python (MuPDF) นอกจากนี้ยังไม่ได้ช่วยให้เข้าถึงวัตถุรูปร่างได้ง่าย (สี่เหลี่ยม เส้น ฯลฯ) และไม่มีเครื่องมือแยกตารางหรือแก้ไขจุดบกพร่องด้วยภาพ
camelot
, tabula-py
และ pdftables
ทั้งหมดมุ่งเน้นไปที่การแยกตารางเป็นหลัก ในบางกรณี อาจเหมาะสมกับตารางที่คุณพยายามแยกมากกว่า
ขอขอบคุณผู้ใช้ต่อไปนี้ที่ได้ร่วมเสนอแนวคิด คุณลักษณะ และการแก้ไข:
เรายินดีรับคำขอดึงข้อมูล แต่โปรดส่งประเด็นข้อเสนอก่อน เนื่องจากห้องสมุดอยู่ในระหว่างการพัฒนา
ผู้ดูแลปัจจุบัน: