2010-01-04 48 views
27

Vì vậy, tiểu bang tôi đang phát hành một loạt dữ liệu dưới dạng PDF, nhưng để làm cho vấn đề tồi tệ hơn, hầu hết (tất cả?) Của các tệp PDF xuất hiện là các chữ được nhập trong Office, in/fax, và sau đó được quét (chính phủ của chúng tôi vào thời điểm tốt nhất của nó?). Lúc đầu, tôi nghĩ rằng tôi đã điên, nhưng sau đó tôi bắt đầu nhìn thấy rất nhiều pdf được 'nghiêng', giống như ai đó đã không nhận được chúng trên máy quét đúng cách. Vì vậy, tôi đã tìm ra điều tốt nhất tiếp theo để nhận được văn bản thực tế của họ, sẽ biến từng trang thành một hình ảnh.Chuyển đổi PDF sang hình ảnh tự động

Rõ ràng điều này cần được tự động hóa và tôi muốn gắn bó với Python nếu có thể. Nếu Ruby hoặc Perl có một số hình thức thực hiện quá tuyệt vời để vượt qua, tôi có thể đi theo lộ trình đó. Tôi đã thử pyPDF để trích xuất văn bản, điều đó rõ ràng là không làm tôi tốt. Tôi đã thử swftools, nhưng những hình ảnh tôi nhận được từ đó chỉ là nhút nhát hoàn toàn không sử dụng được. Nó chỉ có vẻ như các phông chữ bị hủy hoại trong chuyển đổi. Tôi cũng không thực sự quan tâm đến định dạng hình ảnh trên đường ra, miễn là chúng tương đối nhẹ và có thể đọc được.

+4

trước khi thực hiện điều đó, liên hệ với thực thể .gov tạo tệp. Bạn có thể truy cập dễ dàng vào các tệp kỹ thuật số thực tế đó. Đã từng làm việc trong .gov và gặp phải vấn đề tương tự, thường là do các yêu cầu pháp lý cổ (giấy chữ ký) và/hoặc thiếu hiểu biết kỹ thuật (thông thường, công cụ này sẽ bỏ qua nhóm CNTT/web nơi họ có thể bắt được nó).Bạn cũng có thể gọi chúng ra trên các vấn đề khả năng tiếp cận như một JPG khổng lồ của một trang là hoàn toàn không thể tiếp cận với công nghệ hỗ trợ. –

+0

Ngoài ra, để công bằng với đất .gov, họ thường phải phục vụ cho một vực thẳm công nghệ cực kỳ rộng. Than ôi, chúng ta vẫn sống trong một thời điểm mà mẫu số chung thấp nhất là một dạng giấy. –

+0

Đã bỏ phiếu để đóng: Xem http://stackoverflow.com/questions/331918/converting-a-pdf-to-a-series-of-images-with-python. – Brian

Trả lời

13

Nếu tệp PDF thực sự được quét hình ảnh, thì bạn không nên chuyển đổi PDF sang hình ảnh, bạn nên trích xuất hình ảnh từ tệp PDF. Nhiều khả năng, tất cả dữ liệu trong PDF về cơ bản là một hình ảnh khổng lồ, được bọc trong độ dài PDF để làm cho nó dễ đọc trong Acrobat.

Bạn nên thử đơn giản, đơn giản là tìm hình ảnh trong tệp PDF và sao chép các byte ra: Extracting JPGs from PDFs. Các mã có chết đơn giản, và có lẽ hàng chục lý do nó sẽ không hoạt động trên các tập tin PDF của bạn. Nhưng nếu có, bạn sẽ có một cách nhanh chóng và không đau để lấy dữ liệu hình ảnh ra khỏi các tập tin PDF.

+0

Tính năng này chỉ hoạt động đối với JPG? Bởi vì khi tôi thử nó trên pdf của riêng tôi nó sẽ ngay lập tức dừng lại sau khi không tìm thấy sự khởi đầu. –

5

Ghostscript lý tưởng để chuyển đổi tệp PDF thành hình ảnh. Nó là đáng tin cậy và có nhiều tùy chọn cấu hình. Nó cũng có sẵn theo giấy phép GPL hoặc giấy phép thương mại. Bạn có thể gọi nó từ dòng lệnh hoặc sử dụng API gốc của nó. Để biết thêm thông tin:

7

Bạn có thể gọi ví dụ pdftoppm từ dòng lệnh (hoặc sử dụng mô-đun subprocess của Python) và sau đó chuyển đổi tệp PPM kết quả thành định dạng mong muốn bằng cách sử dụng ví dụ: ImageMagick (một lần nữa, sử dụng subprocess hoặc một số ràng buộc nếu chúng tồn tại).

+1

Tôi rất muốn tìm giải pháp mà không sử dụng thư viện bên ngoài, vì tôi cần thực hiện chuyển đổi này trên máy chủ chia sẻ không thể cài đặt ImageMagick hoặc Ghostscript, bất kỳ ideA như thế nào? – DaniPaniz

1

Đây là phương pháp thay thế để chuyển tệp .pdf thành hình ảnh: Sử dụng máy in hình ảnh. Tôi đã sử dụng thành công chức năng dưới đây để "in" hình ảnh của pdf sang jpeg với ImagePrinter Pro. Tuy nhiên, có rất nhiều máy in hình ảnh ra khỏi đó. Chọn cái bạn thích. Một số mã có thể cần phải được thay đổi một chút dựa trên máy in ảnh bạn chọn và định dạng lưu tệp tiêu chuẩn mà máy in hình ảnh sử dụng.

import win32api 
import os 

def pdf_to_jpg(pdfPath, pages): 
    # print pdf using jpg printer 
    # 'pages' is the number of pages in the pdf 
    filepath = pdfPath.rsplit('/', 1)[0] 
    filename = pdfPath.rsplit('/', 1)[1] 

    #print pdf to jpg using jpg printer 
    tempprinter = "ImagePrinter Pro" 
    printer = '"%s"' % tempprinter 
    win32api.ShellExecute(0, "printto", filename, printer, ".", 0) 

    # Add time delay to ensure pdf finishes printing to file first 
    fileFound = False 
    if pages > 1: 
     jpgName = filename.split('.')[0] + '_' + str(pages - 1) + '.jpg' 
    else: 
     jpgName = filename.split('.')[0] + '.jpg' 
    jpgPath = filepath + '/' + jpgName 
    waitTime = 30 
    for i in range(waitTime): 
     if os.path.isfile(jpgPath): 
      fileFound = True 
      break 
     else: 
      time.sleep(1) 

    # print Error if the file was never found 
    if not fileFound: 
     print "ERROR: " + jpgName + " wasn't found after " + str(waitTime)\ 
       + " seconds" 

    return jpgPath 

Các kết quả jpgPath biến cho bạn biết vị trí đường dẫn của trang jpeg cuối cùng của pdf in. Nếu bạn cần nhận một trang khác, bạn có thể dễ dàng thêm một số logic để sửa đổi đường dẫn để nhận các trang trước

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