Tại sao PDF hai cột được trích xuất nối tiếp? Giữ tọa độ trước rồi nói về thứ tự đọc
Giải thích rằng việc tuần tự hóa văn bản PDF hai cột bắt nguồn từ việc định dạng thiếu cấu trúc ngữ nghĩa, làm rõ rằng tham số sắp xếp chỉ là sắp xếp hình học. Một ví dụ Python tổng hợp dựa trên phân vùng tọa độ được cung cấp để thể hiện logic sắp xếp lại trình tự, làm rõ các ranh giới áp dụng và các đường màu đỏ xem xét thủ công, đồng thời cung cấp đường dẫn chấp nhận thực tế kết nối quy trình dịch thuật OmniDoc.
Các chuỗi văn bản được trích xuất từ các tệp PDF hai cột thường không được nhận dạng chính xác mà được đọc sai thứ tự. Bài viết này dành cho những độc giả cần trích xuất văn bản từ các tệp PDF hai cột như giấy tờ và báo cáo, sau đó dịch hoặc sắp xếp chúng.
Người đọc thường gặp phải tình trạng này: qua nửa cột bên trái, câu tiếp theo lại có phần giải thích công thức ở cột bên phải. Tất cả các ký tự có thể được nhận dạng chính xác nhưng thứ tự bị gián đoạn. Bài viết này trước tiên giải thích lý do xảy ra quá trình xê-ri hóa, sau đó sử dụng một ví dụ tổng hợp để minh họa cách sắp xếp lại thứ tự bằng cách phân vùng theo tọa độ. Cuối cùng, nó đưa ra các ranh giới áp dụng và danh sách chấp nhận để tạo điều kiện thuận lợi cho bạn đánh giá xem liệu nó có thể được sử dụng trong các tệp của riêng bạn hay không.
Tại sao PDF hai cột được trích xuất nối tiếp? Một câu kết luận
Giữ tọa độ và trang nguồn trước, sau đó sắp xếp theo quy tắc khu vực. Không trực tiếp nén toàn bộ trang thành một chuỗi dài.
| hoàn cảnh của bạn | Các phương pháp được đề xuất | lý do |
|---|---|---|
| Giấy hai cột thông thường, tuần tự hóa văn bản | Đọc cột bên trái của phần trước, sau đó đọc cột bên phải | Việc ghép nối từng dòng xen kẽ sẽ làm hỏng đoạn văn |
| Chỉ muốn thử nhanh thôi | So sánh kết quả bật và tắt sort | sort chỉ thực hiện sắp xếp hình học, phù hợp với các trang quy tắc |
| Các trang có tiêu đề cột chéo, ghi chú bên cạnh và chú thích cuối trang | Xử lý riêng theo khu vực và kiểm tra mối quan hệ khu vực | Chỉ riêng việc sắp xếp hình học không thể xác định được sự phân bổ của những nội dung này. |
| Cần bàn giao cho người mẫu dịch | Giữ tọa độ và số trang, sắp xếp thứ tự trước rồi mới dịch | Những bối cảnh không đúng thứ tự rất khó khắc phục ngay cả khi thay đổi mô hình. |
##Tại sao thứ tự lại bị lộn xộn?
PDF ghi lại vị trí của từng đoạn văn bản chứ không phải "đây là đoạn văn nào và thuộc cột nào?" Khi công cụ trích xuất xuất ra theo tọa độ, nếu không có quy tắc diện tích thì văn bản ở cột bên trái và bên phải có thể bị xen kẽ.
Những vấn đề như vậy không nhất thiết phát sinh trong giai đoạn xác định. Có thể các từ đều được đề cập đúng nhưng lại sai thứ tự. Do đó, ý tưởng giải pháp nên tập trung vào việc sắp xếp và phân vùng, thay vì liên tục thay đổi các liên kết nhận dạng hoặc dịch thuật.
Giữ tọa độ trước rồi nói về thứ tự đọc
Trước khi giải quyết vấn đề sắp xếp thứ tự, hãy giữ nguyên tọa độ và trang gốc của văn bản. Đừng vội nén toàn bộ trang thành một chuỗi dài.
- Giữ nguyên 4 tọa độ của từng khối văn bản để thuận tiện cho việc đánh giá quyền sở hữu khu vực sau này.
- Giữ lại số trang nguồn để thuận tiện cho việc truy ngược và xác minh thủ công.
- Một khi thông tin khu vực bị mất, các bản dịch tiếp theo sẽ hiểu sai ngữ cảnh và việc thay đổi mô hình dịch có thể không khắc phục được.
##sort=True đáng để thử nhưng nó không phải là công cụ hiểu bố cục
PyMuPDF cung cấp các dạng trích xuất khác nhau như văn bản, từ, khối, v.v. Quá trình xử lý cụ thể của sort thay đổi tùy theo loại và phiên bản đầu ra. Nó không thể được mô tả một cách tổng quát như một thuật toán sắp chữ cố định, cũng như không thể hứa hẹn sẽ khôi phục thứ tự đọc của tất cả các tài liệu.
Gợi ý sử dụng như sau:
- Đối với trang quy tắc, bạn có thể so sánh kết quả của việc sắp xếp trong và ngoài quá trình trước.
- Đối với các trang có tiêu đề cắt ngang, chú thích lề hoặc chú thích cuối trang, các mối quan hệ khu vực phải được kiểm tra lại.
- PDF có thể chứa các dấu hiệu cấu trúc, nhưng điều này không có nghĩa là giao diện trích xuất hiện tại sẽ tự động cung cấp cây đoạn ngữ nghĩa bạn cần.
Bài viết này không triển khai nhận diện bố cục tổng quát, mà chỉ minh họa "cách sắp xếp theo các quy tắc khu vực hiện có," giải thích rõ ràng các ranh giới khả năng. Đối với giao diện và định dạng trích xuất, tham khảo Hướng dẫn trích xuất văn bản chính thức của PyMuPDF.
Minh họa vấn đề bằng năm khối văn bản tổng hợp
Trang mẫu rộng 600 điểm, với 300 điểm giữa các cột; Trong 80 điểm trên cùng là khu vực tiêu đề rào cản, bên dưới là khu vực văn bản chính. Đầu vào bị xáo trộn cố ý: đoạn thứ hai của cột bên phải được liệt kê trước, đoạn đầu tiên của cột bên trái được đặt sau. Mỗi bộ chứa bốn tọa độ và văn bản của hình chữ nhật. Đây là một cấu trúc đơn giản được định nghĩa cho mục đích trình diễn và không tương đương với giá trị trả về đầy đủ của get_text("blocks").
Kết quả mong đợi nên là: tiêu đề, đoạn đầu tiên của cột bên trái, đoạn thứ hai của cột bên trái, đoạn đầu của cột bên phải, đoạn thứ hai của cột bên phải. Các khối vượt qua ranh giới giữa các cột phải được đưa vào danh sách ngoại lệ, không được loại bỏ một cách lặng lẽ hoặc bị ép vào cột bên trái.
Một ví dụ nhỏ có thể chạy hoàn toàn
Ví dụ sau chỉ sử dụng thư viện chuẩn Python. Khi tích hợp PyMuPDF, bạn có thể giữ lại năm trường đầu tiên từ kết quả trích xuất khối và loại trừ các khối không phải văn bản trước. Ví dụ không mở các tệp bên ngoài, không yêu cầu OCR và không tự động suy ra ranh giới cột.
def order_known_layout(blocks, split_x=300, title_bottom=80):
groups = {"title": [], "left": [], "right": []}
rejected = []
for block in blocks:
x0, y0, x1, y1, text = block
if x1 <= x0 or y1 <= y0:
rejected.append(block)
continue
if y1 <= title_bottom:
region = "title"
elif y0 < title_bottom:
rejected.append(block)
continue
elif x1 <= split_x:
region = "left"
elif x0 >= split_x:
region = "right"
else:
rejected.append(block)
continue
groups[region].append(block)
ordered = []
for region in ("title", "left", "right"):
ordered.extend(sorted(groups[region], key=lambda b: (b[1], b[0])))
return [b[4] for b in ordered], rejected
sample = [(330, 160, 550, 190, "R2"), (40, 100, 270, 130, "L1"),
(40, 20, 550, 50, "TITLE"), (330, 100, 550, 130, "R1"),
(40, 160, 270, 190, "L2")]
ordered, rejected = order_known_layout(sample)
assert ordered == ["TITLE", "L1", "L2", "R1", "R2"]
assert rejected == []
wide = (40, 220, 550, 250, "FULL WIDTH BODY")
assert order_known_layout(sample + [wide])[1] == [wide]
assert order_known_layout([]) == ([], [])
print("known-layout examples: 3 assertions passed")
Giá trị 80 và 300 trong ví dụ đến từ các thiết lập của trang tổng hợp này, không phải là ngưỡng trải nghiệm áp dụng cho tất cả PDF. Khi chiều rộng của cột trái và phải trên trang tiếp theo thay đổi, việc sử dụng tham số từ trang trước có thể dẫn đến "chương trình chạy bình thường nhưng lỗi nội dung." Quy định khu vực nên theo trang đó, ít nhất ghi lại phiên bản quy tắc và kích thước trang.
📊 So sánh cốt lõi
| Phương pháp xử lý | Có thể làm gì? | Cần lưu ý điều gì? |
|---|---|---|
Sử dụng trực tiếp sort=True | Sắp xếp hình học theo tọa độ; thử trang quy tắc trước | Tôi không hiểu quyền sở hữu các tiêu đề rào cản, chú thích bên lề và chú thích cuối trang |
| Sắp xếp theo phân vùng tọa độ | Đầu tiên chia khu vực, sau đó đọc theo từng đoạn để dễ kiểm tra hơn | Ngưỡng phân vùng phụ thuộc vào từng trang và cần được xác minh theo từng trang |
| Thứ tự đọc được chú thích thủ công | Kết quả là dễ kiểm soát nhất và phù hợp nhất để xác minh các tài liệu quan trọng | Chi phí cao, phù hợp cho kiểm tra ngẫu nhiên và đánh giá hiệu suất |
Đừng chỉ nhìn vào lỗi trong quá trình chấp nhận
| Các mục kiểm tra | Những gì nên xem | Phải làm gì nếu nó không đáp ứng yêu cầu |
|---|---|---|
| Thứ tự khu vực | Sau tiêu đề, đầu tiên là thanh bên trái đầy đủ, rồi thanh bên phải hoàn toàn | Kiểm tra quy tắc phân vùng; đừng dựa vào việc hoán đổi chuỗi để vá lỗi |
| Tính nhất quán trong nội dung | Số khối được chấp nhận cộng với số khối bị loại bằng số khối đầu vào | Chặn giao hàng và kiểm tra các khối bị thiếu im lặng |
| Văn bản chính của các cuộc thi vượt rào | Xuất hiện trong danh sách từ chối | Thêm các đoạn vượt rào hoặc đánh giá thủ công |
| Quay và cắt | Các khối đầu vào và phân vùng sử dụng cùng một hệ tọa độ | Đầu tiên, hợp nhất các tọa độ, sau đó đưa ra các đánh giá bao gồm |
| Tiêu đề và chú thích | Phân loại riêng biệt theo quy định kinh doanh | Không xóa toàn bộ văn bản ở cuối cùng một lần |
Trong các bài báo thực tế, một cấu trúc như thế này cũng có thể xuất hiện: chèn một sơ đồ rào cản vào giữa, rồi bắt đầu lại cột đôi bên dưới hình ảnh. Ở giai đoạn này, bạn cần chia trang thành phần trên và phần dưới rồi sắp xếp chúng riêng biệt. Việc chia ba phần một lần trong bài viết này là chưa đủ. Bố cục dọc tiếng Trung, văn bản từ phải sang trái và ghi chú viền phức tạp không nên dùng để đọc hướng dẫn ở đây.
🎯 Phương pháp nào phù hợp với bạn?
Nếu bạn ......
- Chỉ các trang đơn hoặc hai cột chỉ cần xử lý quy tắc: Trước tiên so sánh kết quả bật và đóng
sort, sau đó quyết định có sử dụng quy tắc phân vùng hay không. - Xử lý các bài viết có tiêu đề, biểu đồ hoặc chú thích chéo: Chia trang theo phần và thiết lập danh sách ngoại lệ cho nội dung chéo.
- Bạn cần chuyển giao bản dịch cho người khác: Giữ lại tọa độ và số trang, kiểm tra từng mục theo danh sách kiểm tra chấp nhận, và đừng chỉ xem liệu thao tác có lỗi hay không.
- Nếu bạn không muốn tự duy trì script: Bạn có thể sử dụng trực tiếp các công cụ dịch tài liệu có sẵn và kiểm tra bản dịch với cùng một danh sách kiểm tra tuần tự.
Cách nhận quy trình dịch OmniDoc
Giá trị của các script tự xây dựng nằm ở việc nêu rõ các quy tắc chấp nhận; Giá trị của các công cụ dịch sẵn nằm ở việc giảm bớt các bước giữa tài liệu và bản dịch. Hai điều này không mâu thuẫn. OmniDoc (Mục sản phẩm) cung cấp cổng dịch tài liệu, và trang web chính thức cũng giới thiệu các tính năng như OCR, thuật ngữ và so sánh song ngữ. Bạn có thể chọn một bài báo đã giảm nhạy cảm với quyền tải lên và kiểm tra bản dịch bằng cùng một bộ danh sách kiểm tra.
Các kiểm tra chính bao gồm:
- Kiểm tra xem câu mở đầu sau tiêu đề rào cản có liên kết với nhau không.
- Phụ đề đã được gộp vào văn bản chính chưa?
- Kiểm tra xem các tham chiếu chú thích cuối trang có còn phù hợp với vị trí chính xác hay không.
Đây là đánh giá kết quả giao hàng, không phải suy luận thuật toán nội bộ của OmniDoc. Nếu kết quả không đáp ứng yêu cầu, vui lòng giữ lại trang gốc và phần lỗi, trước tiên xác định xem vấn đề nằm ở nhận dạng, sắp xếp hay dịch thuật, rồi quyết định cách khắc phục.
❓ Câu hỏi thường gặp (FAQ)
1. Serial PDF hai cột — có bị nhận dạng sai không?
Không hẳn vậy. Tất cả các ký tự đều có thể được nhận diện đúng; vấn đề thường nằm ở thứ tự đọc, vì vậy bạn nên kiểm tra trước thứ tự và quy tắc khu vực.
2. sort=True: Bạn có thể trực tiếp giải quyết vấn đề đặt hàng hai cột không?
Không thể khái quát hóa. Cách xử lý của sort thay đổi tùy thuộc vào loại đầu ra và phiên bản. Nó không phải là sự hiểu bố cục và không thể hứa hẹn khôi phục thứ tự đọc của tất cả các tài liệu. Đối với các trang quy tắc, bạn có thể thử trước; đối với các trang có nội dung cắt ngang, bạn cũng cần kiểm tra mối quan hệ khu vực.
3. Tại sao bạn không thể nén toàn bộ trang thành một chuỗi dài?
Khi tọa độ và thông tin khu vực bị mất, các bản dịch tiếp theo chỉ nhận được ngữ cảnh kết nối sai, và ngay cả một mô hình dịch khác cũng có thể không sửa được.
4. Liệu 80 và 300 điểm trong ví dụ có thể áp dụng trực tiếp cho các file PDF khác không?
Không. Đây chỉ là các thiết lập cho trang tổng hợp này. Khi kích thước trang hoặc chiều rộng cột thay đổi, phiên bản quy tắc nên được xác minh và ghi riêng biệt theo từng trang.
📝 Tóm tắt
Đối với các vấn đề đặt hàng PDF hai cột, tọa độ và trang nguồn nên được bảo toàn trước, sau đó xử lý theo quy định khu vực, và mỗi mục được kiểm tra theo danh sách kiểm tra chấp nhận. Các script tự xây dựng phù hợp để viết quy tắc rõ ràng, trong khi các công cụ có sẵn tốt hơn để giảm các bước vận hành; cả hai đều có thể sử dụng cùng nhau.
Trải nghiệm ngay: Tải lên tài liệu của bạn để bắt đầu dịch, giữ nguyên định dạng gốc


