Lấy tọa độ văn bản pdf python

Bạn có thể trích xuất văn bản từ các tọa độ cụ thể của tài liệu PDF bằng cách sử dụng quy trình OCR ở phía máy chủ như một giải pháp thay thế. Tham khảo đoạn mã sau cho cùng

Ghi chú

Nhấp vào nút trích xuất văn bản trong ví dụ trên sẽ xuất trang tài liệu PDF dưới dạng hình ảnh bằng cách sử dụng phương thức ExportAsImage trong PdfLoadedDocument, hình ảnh kết quả sau đó được cắt bớt với hình chữ nhật được cung cấp. Sau đó, hình ảnh đã cắt được OCRed để lấy văn bản từ hình ảnh.   

Nhiều bài đăng về Stack Overflow khác đề cập đến cách trích xuất tất cả văn bản theo thứ tự, nhưng làm cách nào tôi có thể thực hiện bước trung gian để lấy văn bản và vị trí văn bản?

Đưa ra một tệp PDF, đầu ra sẽ trông giống như

489, 41,  "Signature"
500, 52,  "b"
630, 202, "a_g_i_r"

Tiết lộ đầy đủ, tôi là một trong những người duy trì pdfminer. sáu. Đây là phiên bản pdfminer do cộng đồng duy trì cho python 3

Ngày nay, pdfminer. sáu có nhiều API để trích xuất văn bản và thông tin từ PDF. Để trích xuất thông tin theo chương trình, tôi khuyên bạn nên sử dụng extract_pages(). Điều này cho phép bạn kiểm tra tất cả các thành phần trên một trang, được sắp xếp theo thứ bậc có ý nghĩa do thuật toán bố cục tạo ra

Ví dụ sau đây là một cách Pythonic để hiển thị tất cả các phần tử trong cấu trúc phân cấp. Nó sử dụng đơn giản1. pdf từ thư mục mẫu của pdfminer. sáu

from pathlib import Path
from typing import Iterable, Any

from pdfminer.high_level import extract_pages


def show_ltitem_hierarchy(o: Any, depth=0):
    """Show location and text of LTItem and all its descendants"""
    if depth == 0:
        print('element                        x1  y1  x2  y2   text')
        print('------------------------------ --- --- --- ---- -----')

    print(
        f'{get_indented_name(o, depth):<30.30s} '
        f'{get_optional_bbox(o)} '
        f'{get_optional_text(o)}'
    )

    if isinstance(o, Iterable):
        for i in o:
            show_ltitem_hierarchy(i, depth=depth + 1)


def get_indented_name(o: Any, depth: int) -> str:
    """Indented name of LTItem"""
    return '  ' * depth + o.__class__.__name__


def get_optional_bbox(o: Any) -> str:
    """Bounding box of LTItem if available, otherwise empty string"""
    if hasattr(o, 'bbox'):
        return ''.join(f'{i:<4.0f}' for i in o.bbox)
    return ''


def get_optional_text(o: Any) -> str:
    """Text of LTItem if available, otherwise empty string"""
    if hasattr(o, 'get_text'):
        return o.get_text().strip()
    return ''


path = Path('~/Downloads/simple1.pdf').expanduser()

pages = extract_pages(path)
show_ltitem_hierarchy(pages)

Đầu ra hiển thị các phần tử khác nhau trong cấu trúc phân cấp. Hộp giới hạn cho mỗi. Và văn bản mà phần tử này chứa

To extract coordinates or location and size of characters in pdf, we shall extend the PDFTextStripper class, intercept and implement writeString(String string, List textPositions) method.

Lớp tổ chức. apache. hộp pdf. dòng nội dung. PDFTextStripper loại bỏ tất cả văn bản

List in the writeString() method contains information regarding the characters, like whether its Unicode, character’s X coordinate, Y coordinate, height, width, x-scaling value, y-scaling value, font size, space width, etc.

Các bước để trích xuất tọa độ của các ký tự trong PDF

Sau đây là quy trình từng bước để trích xuất tọa độ hoặc vị trí của các ký tự trong PDF

1. Mở rộng PDFTextStripper

Tạo một Lớp Java và mở rộng nó bằng PDFTextStripper

public class GetCharLocationAndSize extends PDFTextStripper {
  . . .
}

2. Gọi phương thức writeText

Đặt ranh giới trang (từ trang đầu tiên đến trang cuối cùng) để tách văn bản và gọi phương thức writeText()

PDFTextStripper stripper = new GetCharLocationAndSize();
stripper.setSortByPosition( true );
stripper.setStartPage( 0 );
stripper.setEndPage( document.getNumberOfPages() );

Writer dummy = new OutputStreamWriter(new ByteArrayOutputStream());
stripper.writeText(document, dummy);

3. Ghi đè writeString

phương thức writeString nhận thông tin về vị trí văn bản của các ký tự trong luồng. Chúng ta sẽ ghi đè phương thức writeString như hình bên dưới

@Override
protected void writeString(String string, List<TextPosition> textPositions) throws IOException {
    . . .
}

4. Vị trí và Kích thước In

Đối với mỗi mục trong danh sách TextPosition dành cho một ký tự riêng lẻ, hãy in tọa độ và kích thước

Ví dụ 1 – Trích xuất Tọa độ hoặc Vị trí của Ký tự trong PDF

Trong ví dụ này, chúng tôi sẽ lấy một tệp PDF có văn bản và trích xuất tọa độ (X, Y) của các ký tự

GetCharLocationAndSize. java

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;
 
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;
 
/**
* This is an example on how to get the x/y coordinates and size of each character in PDF
*/
public class GetCharLocationAndSize extends PDFTextStripper {
 
    public GetCharLocationAndSize() throws IOException {
    }
 
    /**
     * @throws IOException If there is an error parsing the document.
     */
    public static void main( String[] args ) throws IOException {
        PDDocument document = null;
        String fileName = "apache.pdf";
        try {
            document = PDDocument.load( new File(fileName) );
            PDFTextStripper stripper = new GetCharLocationAndSize();
            stripper.setSortByPosition( true );
            stripper.setStartPage( 0 );
            stripper.setEndPage( document.getNumberOfPages() );
 
            Writer dummy = new OutputStreamWriter(new ByteArrayOutputStream());
            stripper.writeText(document, dummy);
        }
        finally {
            if( document != null ) {
                document.close();
            }
        }
    }
 
    /**
     * Override the default functionality of PDFTextStripper.writeString()
     */
    @Override
    protected void writeString(String string, List<TextPosition> textPositions) throws IOException {
        for (TextPosition text : textPositions) {
            System.out.println(text.getUnicode()+ " [(X=" + text.getXDirAdj() + ",Y=" +
                    text.getYDirAdj() + ") height=" + text.getHeightDir() + " width=" +
                    text.getWidthDirAdj() + "]");
        }
    }
}

đầu ra

2 [(X=26.004425,Y=22.003723) height=5.833024 width=5.0907116]
0 [(X=31.095137,Y=22.003723) height=5.833024 width=5.0907116]
1 [(X=36.18585,Y=22.003723) height=5.833024 width=5.0907097]
7 [(X=41.276558,Y=22.003723) height=5.833024 width=5.0907097]
- [(X=46.367268,Y=22.003723) height=5.833024 width=2.8872108]
8 [(X=49.25448,Y=22.003723) height=5.833024 width=5.0907097]
- [(X=54.34519,Y=22.003723) height=5.833024 width=2.8872108]
6 [(X=57.2324,Y=22.003723) height=5.833024 width=5.0907097]
W [(X=226.4448,Y=22.003723) height=5.833024 width=7.911499]
e [(X=233.88747,Y=22.003723) height=5.833024 width=4.922714]
l [(X=238.81018,Y=22.003723) height=5.833024 width=2.2230377]
c [(X=241.03322,Y=22.003723) height=5.833024 width=4.399185]
o [(X=245.4324,Y=22.003723) height=5.833024 width=4.895355]
m [(X=250.32776,Y=22.003723) height=5.833024 width=7.7943115]
e [(X=258.12207,Y=22.003723) height=5.833024 width=4.922699]

Tải tài liệu PDF tại đây apache. pdf  nếu bạn muốn sử dụng cùng một tệp PDF. Nếu không, bạn có thể gán tên tệp trong chương trình Java với đường dẫn tệp PDF của mình

Phần kết luận

Trong Hướng dẫn PDFBox này, chúng ta đã học cách trích xuất tọa độ hoặc vị trí của các ký tự trong tài liệu PDF và cũng là cách trích xuất Unicode, tọa độ X, tọa độ Y, chiều cao, chiều rộng, giá trị tỷ lệ x, giá trị tỷ lệ y, cỡ chữ, khoảng trắng

Làm cách nào để trích xuất thông tin từ PDF bằng Python?

Đối tượng trang có chức năng extract_text() để trích xuất văn bản từ trang pdf.

Làm cách nào để trích xuất dữ liệu từ PDF bằng pypdf2 trong Python?

Để trích xuất văn bản, chúng tôi sẽ đọc tệp và tạo một đối tượng PDF của tệp. Sau đó, chúng ta sẽ tạo một đối tượng lớp PDFReader và truyền Đối tượng tệp PDF cho nó. Và cuối cùng, chúng tôi sẽ trích xuất từng trang và nối văn bản của từng trang