2012-06-09 63 views
8

Tôi không thể phát hiện trang trống trong tệp pdf. Tôi đã tìm kiếm trên internet cho nó nhưng không thể tìm thấy một giải pháp tốt.Cách tìm Trang trống trong tệp pdf

Sử dụng Itextsharp Tôi đã thử với kích thước trang, Xobjects. Nhưng họ không cho kết quả chính xác.

tôi đã cố gắng

if(xobjects==null || textcontent==null || size <20 bytes) 
    then "blank" 
else 
not blank 

Nhưng thời gian tối đa nó sẽ trả về câu trả lời sai. Tôi đã sử dụng iTextSharp

Mã này nằm dưới ... Tôi đang sử dụng iTextSharp Librabry

Đối xobjects

PdfDictionary xobjects = resourceDic.GetAsDict(PdfName.XOBJECT); 
//here resourceDic is PdfDictionary type 
//I know that if Xobjects is null then page is blank. But sometimes blank page gives xobjects which is not null. 

Đối contentstream

RandomAccessFileOrArray f = reader.SafeFile; 
//here reader = new PdfReader(filename); 

byte[] contentBytes = reader.GetPageContent(pageNum, f); 
//I have measured the size of contentbytes but sometimes it gives more than 20 bytes for blank page 

Đối textContent

String extractedText = PdfTextExtractor.GetTextFromPage(reader, pageNum, new LocationTextExtractionStrategy()); 
    // sometimes blank page give a text more than 20 char length . 
+0

Bạn thấy gì trên trang mà bạn biết để trống? (Chỉnh sửa chi tiết này vào câu trả lời của bạn, thay vì phụ thêm chi tiết đáng kể trong các ý kiến). – halfer

+0

@halfer xem ngay bây giờ. –

+0

Đó là một câu hỏi hay. Tôi không biết câu trả lời, vì trước đây tôi chưa thực hiện bất kỳ phân tích cú pháp PDF nào. Bạn đã phân tích ba loại đối tượng đó để xem các trang trống có điểm chung nào không? Ví dụ: nội dung văn bản nào thực sự xuất hiện trên một trang trống? – halfer

Trả lời

1

tôi nghi ngờ bạn đã thử .Trim() trên dây của bạn, vì vậy tôi sẽ không gợi ý rằng trên riêng của nó.

Nội dung thực tế của chuỗi dài hơn 20 ký tự trống là bao nhiêu? Tôi nghi ngờ nó chỉ là ký tự dòng mới (giống như những gì xảy ra khi người ta nhấn nhập 10+ lần chỉ để có được một trang mới chứ không phải chèn một trang-break), trong trường hợp này:

String extractedText = 
    string.Replace(string.Replace(
     PdfTextExtractor.GetTextFromPage(reader, pageNum, new LocationTextExtractionStrategy()) 
    , Environment.NewLine, ""), "\n", "").Trim(); 

Cho chúng tôi biết nội dung đầu ra là gì sau này. Một khả năng khác là nó là văn bản trống với không gian không phá vỡ và các ký tự khác không thực sự là không gian, bạn sẽ cần tìm và thay thế chúng theo cách thủ công .. tại thời điểm này tôi sẽ đề nghị bạn thực sự chỉ sử dụng đối sánh regex cho [0-9, az, AZ] và sử dụng để xác định xem trang của bạn có trống hay không.

+0

Tôi không cắt xâu chuỗi. Tôi chỉ nhận được chuỗi và hiển thị nó. Tôi có thể cung cấp cho bạn một tệp pdf có trang trống nhưng văn bản là 01 557599 FM.qxd 4/29/04 11.32AM Trang ii –

+0

Đó là khả năng từ các trường ẩn trong đầu trang/chân trang .. nếu bạn có thể xóa đầu trang và chân trang khỏi tài liệu trước khi nhận được văn bản từ trang có thể là một lựa chọn tốt. – Seph

+0

Nếu không, bạn có thể cần phải hiển thị các trang thành hình ảnh và so sánh nếu chúng trống hoặc không (trừ khi các trang có hình nền hoặc hình mờ hoặc tương tự) .. Tôi mong được nhìn thấy nếu người khác có đề xuất vững chắc hơn (nếu bạn không thể xóa phần đầu trang và chân trang của mỗi trang). – Seph

2

Một cách rất đơn giản để khám phá các trang trống là: sử dụng dòng lệnh Ghostscript gọi thiết bị bbox.

bbox Ghostscript của tính toán tọa độ của rằng tối thiểu hình chữ nhật 'bounding hộp' mà bao quanh tất cả các điểm của trang nơi một điểm ảnh sẽ được hiển thị:

gs \ 
    -o /dev/null \ 
    -sDEVICE=bbox \ 
    input.pdf 

Trên Windows:

gswin32c.exe^
    -o nul^
    -sDEVICE=bbox^
    input.pdf 

Kết quả:

GPL Ghostscript 9.05 (2012-02-08) 
Copyright (C) 2010 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
Processing pages 1 through 6. 
Page 1 
%%BoundingBox: 27 281 548 804 
%%HiResBoundingBox: 27.000000 281.000000 547.332031 804.000000 
Page 2 
%%BoundingBox: 0 0 0 0 
%%HiResBoundingBox: 0.000000 0.000000 0.000000 0.000000 
Page 3 
%%BoundingBox: 27 302 568 814 
%%HiResBoundingBox: 27.949219 302.000000 567.332031 814.000000 
Page 4 
%%BoundingBox: 27 302 568 814 
%%HiResBoundingBox: 27.949219 302.000000 567.332031 814.000000 
Page 5 
%%BoundingBox: 27 302 568 814 
%%HiResBoundingBox: 27.949219 302.000000 567.332031 814.000000 
Page 6 
%%BoundingBox: 27 302 568 814 
%%HiResBoundingBox: 27.949219 302.000000 567.332031 814.000000 

Như bạn có thể thấy, trang 2 của tài liệu đầu vào của tôi trống.

+0

Tôi mới sử dụng pdf. Trong cửa sổ lệnh tôi chạy nó, nhưng khi tôi chạy lệnh như một tập tin thực thi sau đó số trang tôi nhận được như là tập tin đầu ra không có gì khác. Làm thế nào tôi có thể khắc phục vấn đề này. @Kurt Pfeifle –

+0

@ lazy king: Lý do có thể là: (1) tất cả các dòng bắt đầu bằng 'Trang' được chuyển hướng đến 'stdout'. (2) tất cả các dòng bắt đầu bằng '%% BoundingBox:' hoặc '%% HiResBoundingBox:' được chuyển hướng tới 'stderr'. Trong cửa sổ lệnh, đầu ra stderr có thể bị chặn nếu bạn chạy lệnh từ bên trong một tập tin batch ... –

+0

@lazy king: Bạn có thể thử cái này 'gswin32c.exe -sstdout =% stderr -o nul -sDEVICE = bbox" input.pdf "2> output.txt' để chuyển hướng trực tiếp tất cả tệp đầu ra của tệp vào một tệp văn bản có tên * output.txt *. Đó là điều bạn muốn? –

0

Có thư viện trình bao bọc cho C# và VB.NET từ số mupdf c++ library. Bạn có thể sử dụng nó để chuyển đổi sang các trang thành bmp (ở các định dạng khác nhau tif, jpg, png) và kiểm tra kích thước của bitmap.

Bạn nên kiểm tra xem kích thước tối thiểu nào với các ký tự tối thiểu của trang mà bạn sẽ xem là trống.

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