2012-08-10 23 views
8

Tôi cần phải phân tích cú pháp tài liệu PDF. Tôi đã triển khai trình phân tích cú pháp và đã sử dụng Thư viện iText và cho đến bây giờ nó đã hoạt động mà không có bất kỳ vấn đề gì.Khoảng trắng lạ khi phân tích cú pháp PDF

Nhưng tôi không cần phải phân tích cú pháp tài liệu khác có khoảng trắng rất lạ ở giữa các từ. Một ví dụ tôi nhận được:

Võ RBER eitung auf chết Motorr adsaison. Viele Motorr adf AHR er

Mọi từ đậm nên được kết nối, nhưng bằng cách nào đó Parser PDF được thêm khoảng trắng vào các từ. Nhưng khi tôi sao chép và dán nội dung từ PDF vào một Textfile tôi không nhận được những không gian này.

Đầu tiên tôi nghĩ đó là do thư viện Phân tích cú pháp PDF mà tôi đang sử dụng, nhưng cũng với thư viện khác, tôi nhận được cùng một vấn đề chính xác.

Tôi đã xem qua số singleSpaceWidth từ các từ được phân tích cú pháp và tôi nhận thấy rằng nó luôn thay đổi khi nó thêm khoảng trắng. Tôi đã cố gắng đặt chúng lại với nhau một cách thủ công. Nhưng vì không thực sự là một khuôn mẫu để kết hợp lại những từ mà hầu như không thể.

Có ai khác có vấn đề tương tự hoặc thậm chí là giải pháp cho vấn đề đó không?

Theo yêu cầu, đây là một số thông tin hơn:

Phân tích với SemTextExtractionStrategy:

PdfReader reader = new PdfReader("data/SpecialTests/SuedostSchweiz/" + src); 

SemTextExtractionStrategy semTextExtractionStrategy = new SemTextExtractionStrategy(); 

for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
    // Set the page number on the strategy. Is used in the Parsing strategies. 
    semTextExtractionStrategy.pageNumber = i; 

    // Parse text from page 
    PdfTextExtractor.getTextFromPage(reader, i, semTextExtractionStrategy); 
} 

Đây là phương pháp SemTextExtractionStrategy thực sự phân tích cú pháp t ext. Ở đó tôi tự thêm sau mỗi từ phân tích cú pháp một khoảng trắng, nhưng bằng cách nào đó nó chia các từ trong việc phát hiện:

@Override 
public void parseText(TextRenderInfo renderInfo, int pageNumber) {  

    this.pageNumber = pageNumber; 

    String text = renderInfo.getText(); 

    currTextBlock.getText().append(text + " "); 

    .... 
} 

Dưới đây là toàn bộ SemTextExtraction lớp nhưng trong đó nó chỉ gọi phương thức từ trên cao (parseText):

public class SemTextExtractionStrategy implements TextExtractionStrategy { 

    // Text Extraction Strategies 
    public ColumnDetecter columnDetecter = new ColumnDetecter(); 

    // Image Extraction Strategies 
    public ImageRetriever imageRetriever = new ImageRetriever(); 

    public int pageNumber = -1; 

    public ArrayList<TextParsingStrategy> textParsingStrategies = new ArrayList<TextParsingStrategy>(); 
    public ArrayList<ImageParsingStrategy> imageParsingStrategies = new ArrayList<ImageParsingStrategy>(); 

    public SemTextExtractionStrategy() { 

     // Add all text parsing strategies which are later on applied on the extracted text 
     // textParsingStrategies.add(fontSizeMatcher); 
     textParsingStrategies.add(columnDetecter); 

     // Add all image parsing strategies which are later on applied on the extracted text 
     imageParsingStrategies.add(imageRetriever); 
    } 

    @Override 
    public void beginTextBlock() { 

    } 

    @Override 
    public void renderText(TextRenderInfo renderInfo) { 
     // TEXT PARSING 
     for(TextParsingStrategy strategy : textParsingStrategies) { 
      strategy.parseText(renderInfo, pageNumber); 
     } 
    } 

    @Override 
    public void endTextBlock() { 

    } 

    @Override 
    public void renderImage(ImageRenderInfo renderInfo) { 
     for(ImageParsingStrategy strategy : imageParsingStrategies) { 
      strategy.parseImage(renderInfo); 
     } 
    } 
} 
+0

vui lòng cho biết phiên bản iText bạn đang sử dụng và bằng cách nào đó bạn cũng cần cung cấp PDF cũng như mã mà bạn phân tích cú pháp. – Eugene

+0

Đã thêm tất cả thông tin trong bài đăng ở trên. – Prine

+0

Còn lớp TextExtractionStrategy mà bạn sử dụng thì sao? – Eugene

Trả lời

2

tôi đã xử lý các tập tin PDF được với Ghostscript lệnh sau:

gs -o out.pdf -q -sDEVICE=pdfwrite -dOptimize=false -dUseFlageCompression=false -dCompressPages=false -dCompressFonts=false whitespacesProblem.pdf 

Lệnh này tạo ra một tập tin out.pdf, mà không có mã hóa dòng, vì vậy nó có thể đọc được tốt hơn. Phần thú vị nằm trong dòng 52, mà tôi chia thành nhiều dòng để dễ đọc:

[ 
    (&;&)-287.988 
    (672744)29.9906 
    (+\(%)30.01 
    (+!4)29.9876 
    (&4)-287.989 
    (%4)30.0039 
    (&1&8)-287.975 
    (3=\)!)-288.021 
    (*&4)30.0212 
    (&=23)-287.996 
    (+1%)-287.99 
    (\(=&)-288.011 
    (8&1&)-287.974 
    (672744)29.9906 
    (+\(3+=378$)-250.977 
    (#7\)!) 
]TJ 

Giữa các dấu ngoặc đơn là các ký tự văn bản. Tôi đã thay đổi một số người trong số họ và xem tệp PDF được hiển thị để xem nhân vật nào đại diện cho hình tượng nào. Sau đó, tôi đã giải mã văn bản:

[ 
    (ele)-287.988 
    (Motorr)29.9906 *** 
    (adf)30.01 *** 
    (ahr)29.9876 *** 
    (er)-287.989 
    (fr)30.0039 
    (euen)-287.975 
    (sich)-288.021 
    ... 
] 

Vì vậy, thực sự có khoảng trắng giữa các ký tự. Trong trường hợp của bạn, điều này có lẽ là sành điệu của phông chữ. Câu hỏi bây giờ là cách thư viện PDF của bạn diễn giải khoảng trắng này, và dường như với tôi, thậm chí "khoảng trắng âm" được đưa vào một khoảng trống trong chuỗi kết quả.

+0

Có cách nào để thoát khỏi điều này hoặc thực hiện? – NinjaOnSafari

+0

và bạn đã sử dụng công cụ nào để tạo pdf? – NinjaOnSafari

+0

Đó là Ghostscript; Tôi đã chỉnh sửa câu trả lời để làm rõ điều đó. Cảm ơn gợi ý. –

0

Bởi vì tài liệu mà bạn có được chia thành các cột, các lỗi hiển nhiên là bên trong

SemTextExtractionStrategy

lớp học. Tôi cho rằng lớp ColumnDetecter là một trong những nguyên nhân có thể được đổ lỗi cho iText. Tôi chỉ có thể giả định rằng nó được thực hiện dựa trên kích thước của cột, sau đó lấy văn bản dựa trên đó.

Nếu bạn chỉ muốn văn bản, thì việc triển khai có thể đơn giản hơn, dựa trên kích thước của Cột.

+0

Cảm ơn câu trả lời của bạn. Tôi chắc chắn sẽ có một cái nhìn vào ColumnDetecter. Nhưng các phương pháp parseText là từ lớp này và ở đó tôi nhận được đầu ra trực tiếp từ thư viện iText nơi các từ đã được chia tách .. – Prine

1

Các khoảng trắng trong pdf là một vấn đề được biết đến như mô tả của các câu trả lời trên đây bởi Roland và cũng nhìn thấy ở comment đầu tiên của https://issues.apache.org/jira/browse/TIKA-724

Câu trả lời đó cũng làm việc đối với tôi là một trong những nhìn thấy bởi huuhungus tại https://github.com/smalot/pdfparser/issues/72

mà là cụ thể cho PDFParser và nó là thay đổi mã mà thực sự làm tăng thêm không gian này đến PDFParser nếu bạn biết bạn sẽ có vấn đề này:

sr c/Smalot/PdfParser/Object.php nhận xét ra dòng này

$text .= ' '; 

Không hoàn toàn sửa chữa nó, nhưng đó là lúc chấp nhận

thư viện khác cũng có thể có các bản sửa lỗi tạm thời tương tự để họ có thể giúp đỡ về vấn đề này trong vài trường hợp.

+0

iText 5.2.1 là phiên bản cũ hiện nay. Phiên bản hiện tại đã có các thuộc tính/phương pháp có thể ghi đè để tinh chỉnh trong đó các tình huống iText thêm một khoảng trống và trong đó không có. Không bao giờ thêm một không gian cũng là một lựa chọn xấu nói chung, nhiều PDF sau đó sẽ văn bản của họ trích xuất với hầu như không có bất kỳ không gian nào cả. – mkl

Các vấn đề liên quan