2009-04-21 4 views
32

Я ищу быстрый и надежный способ чтения/разбора больших файлов PDF в Ruby (на Linux и OSX).Ruby: Чтение файлов PDF

До сих пор я нашел довольно старый и простой PDF-toolkit (pdftotext -wrapper) и PDF-reader, который не смог прочитать большинство моих файлов. Хотя две библиотеки предоставляют именно ту функциональность, которую я искал.

Мой вопрос: Я что-то пропустил? Есть ли инструмент, который лучше подходит (быстрее и надежнее), чтобы решить мою проблему?

+0

Возможный дубликат [Ruby PDF-parsing gem/library] (http://stackoverflow.com/questions/320621/ruby-pdf-parsing-gem-library) –

ответ

24

Вы могли бы найти Docsplit полезно:

Docsplit это утилита командной строки и библиотека рубина для расщепления документов на их составные части: поиск UTF-8 обычного текст, изображения страниц или эскизы в любом формате, PDF-файлы, отдельные страницы и метаданные документов (название, автор, количество страниц ...)

+1

Хавьер: взгляните на Docsplit. Он обертывает библиотеку Apache PDFBox для извлечения текста - потому что у нас были лучшие результаты качества с помощью PDFBox, что pdftotext. – jashkenas

+0

@pw. Устанавливали все библиотеки и следили за всей документацией для этого, однако мне было тяжело, есть ли у вас рефералы для учебных пособий или документации, выходящие за рамки двух строк кода? –

+0

Docsplit действительно хорош, но его больше не поддерживают – Magnum

0

Вот некоторые варианты:

http://en.wikipedia.org/wiki/List_of_PDF_software

С этой ссылке, и поиск SourceForge, есть несколько утилит командной строки, которые могут делать то, что вы хотите, как этот: http://pdftohtml.sourceforge.net/

В зависимости от ваши требования и то, как выглядят PDF-файлы, вы можете посмотреть на использование API Документов Google (выгрузите PDF-файл, а затем загрузите его как текст) или можете попробовать что-то вроде gocr. Мне пришлось много раз анализировать текст изображения с помощью gocr в прошлом, и вам просто нужно подпрыгнуть в оболочку, чтобы сделать это, например, gocr -i whatever.pdf (я думаю, что это работает с PDF-файлами).

Недостатком всего этого является то, что они не являются реалистично-рубиновыми реализациями, но многие хорошие (и бесплатные) проекты OCR, похоже, выполняются именно так.

+2

Зачем мне OCR («оптическое распознавание символов»)) читать PDF-файл, который не состоит из отсканированного текста? Разве это не привело бы к ненужному замедлению всего процесса? – Javier

+1

№ OCR - это процесс преобразования изображений в текст. В PDF-чтениях и инструментариях PDF используется эта концепция для преобразования изображения (то же, что выводится, скажем, из сканера) в текст. – Terry

+1

Итак, в основном вы говорите, что весь текст внутри PDF состоит из изображения, которое нужно сначала распознать как текст? – Javier

1

Вы можете использовать JRuby и парсер библиотеки Java PDF, такой как ApachePDFBox (https://www.ohloh.net/p/pdfbox). См. Также http://java-source.net/open-source/pdf-libraries.

+0

Или iText, http://www.lowagie.com/iText/. –

+0

Это звучит как интересная альтернатива. Вы видели реализацию или пример где-то? – Javier

+0

@nemo: iText? Я пытаюсь читать PDF-файлы, а не создавать их. – Javier

2

После того, как вы попытаетесь использовать разные методы, я использую PDF-Toolkit. Он довольно старый, но он быстрый, стабильный и надежный. Кроме того, он действительно не должен быть новым, потому что он просто обертывает xpdf commandline utilities.

0

Если вам просто нужно получить текстовый контент из pdf-файла, pdftohtml в sourceforge эффективен. он не подходит для работы с изображениями.

0

У вас есть библиотека CombinePDF?

Это чисто рубиновое решение, которое позволяет обрабатывать PDF-файлы, такие как извлечение страниц, наложение одной страницы PDF поверх другой, нумерация страниц, написание основного текста и таблиц и т. Д. ».

Вот пример для прядения существующего файла PDF с логотипом. В примере читается файл PDF, извлекается одна страница для использования в качестве штампа и штампы другого файла PDF.

require 'combine_pdf' 
company_logo = CombinePDF.load("company_logo.pdf").pages[0] 
pdf = CombinePDF.load "content_file.pdf" 
pdf.pages.each {|page| page << company_logo} 
pdf.save "content_with_logo.pdf" 

Вы также можете отпечатать текст, количество страниц или использование:

require 'combine_pdf' 

pdf = CombinePDF.load "content_file.pdf" 

pdf.number_pages #adds page numbers. you can add formatting and placement options. 

pdf.pages.each {|page| page.textbox "One Way To Stamp"} 

#you can a shortcut method to stamp pages 
pdf.stamp_pages "Another way to stamp" 

#you can use the shortcut method for both text and PDF stamps 
company_logo = CombinePDF.load("company_logo.pdf").pages[0] 
pdf.stamp_pages company_logo 

# you can use write simple tables 
pdf.pages[0].write_table headers: ['first name', 'surname'], table_data: [['John', 'Doe'], ['Mr.', 'Smith']] 

pdf.save "content_with_logo.pdf" 

Это не предназначено для сложных операций, но она дополняет большинство библиотек PDF авторинга и позволяет использовать шаблоны PDF вместо написания цельное с нуля.

Смежные вопросы