C # и Python чтения PDF

C # с использованием сторонних библиотек pdfbox:

с использованием системы;
используя System.Collections.Generic;
используя System.Linq;
используя System.Text;
используя System.Threading.Tasks;
использованием System.IO;
используя org.apache.pdfbox.pdmodel;
используя org.apache.pdfbox.util;
Пространство имен ReadPDF
{
    класс Program
    {
        статической силы Main (string [] арг)
        {
            строка пути = string.Format (Environment.CurrentDirectory + "/path/Export_001397_32251.pdf");
            ЕЫпе (PDF2TXT (путь));
            Console.ReadKey ();
        }
        общественности статической строки PDF2TXT (строка путь)
        {
            PDDocument док = NULL;
            попробовать
            {
                 док = PDDocument.load (путь);
                 PDFTextStripper стриппер = новый PDFTextStripper ();
                 вернуть stripper.getText (DOC);
            }
            Наконец
            {
                если (док! = NULL)
                {
                    doc.close ();
                }
            }
        }
    }
}
Ссылка Адрес: HTTP: //www.squarepdf.net/how-to-convert-pdf-to-text-in-net-vb
 
Используйте pdflumber или питона pdfmine
 
 
pdfplumber Импорт 
Импорт Re

путь = 'путь / test.pdf'
PDF = pdfplumber.open (путь)

для pdf.pages страницы:
Печать (page.extract_text ())
для pdf_table в page.extract_tables ():
Таблица = []
клетки = []
для строки в pdf_table:
IF не любая (строка):
# Если вся строка пуста, то рассматривается как конец записи
ЕСЛИ любые (клетки):
table.append (клетки)
клеток = []
Элиф Все (строки):
# Если вся строка не пуста, то этот раздел для новой линии, на одном конце ,
ЕСЛИ любая (клетка):
table.append (клетка)
клетки = []
table.append (строка)
остальное:
если Len (клетки) == 0:
клетки = строка
еще:
для я в диапазоне (LEN (строка)):
если строка [я] не является None:
клетки [I] = строка [я ] , если клетки [I] является никто другой клетки [я] + грести [I]
для строки в таблице:
печать ([re.sub ( «\ s +», «», ячейка) если ячейка не является никто другой ни для ячейки , в строка])

pdf.close ()



импорт SYS
импорт ОС
из binascii импорта b2a_hex
###
### требования PDF-рудничных
###

из pdfminer.pdfparser импорта PDFParser
из pdfminer.pdfdocument импорта PDFDocument, PDFNoOutlines
из pdfminer.pdfpage импорта PDFPage
из pdfminer.pdfinterp импорта PDFResourceManager, PDFPageInterpreter
из pdfminer.converter импорт PDFPageAggregator
из pdfminer.layout импортных LAParams, LTTextBox, LTTextLine, LTFigure, LTImage, LTChar

DEF with_pdf (pdf_doc, п, pdf_pwd, * арг):
"" "Открыть документ в формате PDF, и применить функцию, возвращая результаты ""»
результат = None
попытка:
# открыть файл в формате PDF
Fp = открыт (pdf_doc"гь ')
# Создать объект парсера , связанный с объектом файла
парсером = PDFParser (FP)
# создать объект PDFDocument , который сохраняет структуру документа
док = PDFDocument (синтаксический анализатор, pdf_pwd)
# подключить анализатор и документ объекты
parser.set_document (док)
# поставить пароль для инициализации ,
если doc.is_extractable:
# применить функцию и возвращает результат
Result = Fn (DOC, * аргументы)
# закрыть PDF файл
fp.close () , за
исключение IOError:
# файл не существует или аналогичных проблемы
пропуска
возврат результат
###
### Оглавление
###

Защиту _parse_toc (док):
«» «С открытым объекта PDFDocument, получить таблицу данных содержимого (ТОС)
[это функция высшего порядка должны быть переданы with_pdf ()]» ""
TOC = []
попробуйте:
очерчивает = doc.get_outlines ()
для (уровень, название, Dest, а, SE) в контурах:
toc.append ((уровень, название)) , за
исключением PDFNoOutlines:
пропуск
возврата TOC
четкости get_toc (pdf_doc , pdf_pwd = ''):
"" "Возвращение оглавления (TOC), если таковые имеются, для этого PDF - файл" ""
вернуться with_pdf (pdf_doc, _parse_toc, pdf_pwd)
###
### Извлечение изображений
###
Защиту write_file (папка, имя файл, FileData, флаги = «ж»):
«» "Запись файл данных в комбинацию папки и имени файла
(флаги:„W“для текста записи„термометр“для записи двоичного файла, используйте„а“ вместо 'ш' для Append) ""»
результат = False ,
если os.path.isdir (папка):
попробуйте:
file_obj = открыт (os.path.join (папка, имя файла), флаги)
file_obj.write (FileData)
file_obj .close ()
результат = True
кроме IOError:
передачи
возвращаемого результата
Защиты determine_image_type (stream_first_4_bytes):
""»Выясните тип файла изображения на основе сравнения магического числа первых 4 (или 2) байты «»»
file_type = Отсутствует
bytes_as_hex = b2a_hex (stream_first_4_bytes) ,
если bytes_as_hex.startswith ( 'ffd8'):
file_type = '.jpeg'
Элиф bytes_as_hex == '89504e47':
file_type = '.png'
ELIF bytes_as_hex == '47494638':
file_type = ' '.gif
Элиф bytes_as_hex.startswith ( '424d'):
FILE_TYPE =' .bmp»
возвращают file_type

защиту save_image (lt_image, PAGE_NUMBER, images_folder):
""" Попытка сохранить данные изображения из этого LTImage объекта и возвращает имя файла , в случае успеха ""»
результат = None ,
если lt_image.stream:
file_stream = lt_image.stream.get_rawdata () ,
если file_stream:
file_ext = determine_image_type (file_stream [0: 4]) ,
если file_ext:
имя_файла = '' .join ([ул (PAGE_NUMBER), '_', lt_image.name, file_ext]) ,
если write_file (images_folder, имя_файла, file_stream, флаги =» термометру «):
результат = имя_файла
возвращаемый результат


###
### Извлечение текста
###

защиту to_bytestring (с, ENC =» UTF-8' ):
„“ "Преобразовать данную строку Юникода с байтовой строки, используя стандартную кодировку ,
если это не уже байтовой строки ""» ,
если s:
если isinstance (s, ул):
возвращение s
еще:
возвращение s.encode (ENC)

Защиту update_page_text_hash (ч, lt_obj, РСТ = 0,2):
"" "Использование BBOX x0, x1 значения в пределах проц% , чтобы произвести списки связанного текста в хэш" ""

x0 = lt_obj.bbox [0]
x1 = lt_obj.bbox [2]

key_found = False
для K, V в h.items ():
hash_x0 = к [0] ,
если х0> = (hash_x0 * (1,0-РСТ)) и (hash_x0 * (1,0 + РСТ))> = х0:
hash_x1 = к [1] ,
если x1> = (hash_x1 * (1,0-РСТ)) и (hash_x1 * (1,0 + РСТ))> = x1:
# текст внутри этого LT * объект был расположен на одной и той же
ширине # в виде до серии текста, так что она принадлежит вместе
key_found = True
v.append (to_bytestring (lt_obj.get_text ()))
ч [к] = г ,
если не key_found:
# текст, основанный на ширине, новая серия,
# поэтому он получает свою собственную серию (запись в хэш)
ч [(x0, x1)] = [to_bytestring (lt_obj. get_text ())]
возвращение ч

Защиты parse_lt_objs (lt_objs, PAGE_NUMBER, images_folder, текст = []):
"" "Перебрать список LT * объекты и сбор данных , текстовые или графические , содержащиеся в каждом" ""
TEXT_CONTENT = []

page_text = {} # к = (х0, х1) из BBOX, V = список текстовых строк в пределах этой ширины BBOX (физический столбец)
для lt_obj в lt_objs:
если isinstance (lt_obj, LTTextBox) или isinstance (lt_obj, LTTextLine):
# текст,так расположить логически на основе его ширины колонки
page_text = update_page_text_hash (page_text, lt_obj)
Элиф isinstance (lt_obj, LTImage):
# изображение, поэтому сохранить его в указанную папку, и отметьте его место в тексте
saved_file = save_image (lt_obj, PAGE_NUMBER, images_folder)
если saved_file:
# использование HTML стиль <IMG /> тег , чтобы отметить положение изображения в текстовом
text_content.append ( '<IMG SRC = " '+ os.path.join (images_folder, saved_file) +'" />')
еще:
печать> > sys.stderr, "ошибка при сохранении изображения на странице", PAGE_NUMBER, lt_obj .__ repr__
Элиф isinstance (lt_obj, LTFigure):
Объекты # LTFigure являются контейнерами для других объектов LT *, поэтому рекурсию через детей
text_content.append (parse_lt_objs (lt_obj, PAGE_NUMBER, images_folder, TEXT_CONTENT))

для K, V в отсортированном ([(ключ, значение) для (ключ, значение) в page_text.items ()]):
# Сортировка page_text хэш с помощью клавиш (x0, x1 значений в BBOX),
# , который производит сверху вниз, слева направо последовательности соответствующих столбцов
text_content.append ( «» .join (v))

возвращение «\ n'.join (TEXT_CONTENT)


###
### обработки страница
###

Защита _parse_pages (DOC, images_folder):
""" С открытым объектом PDFDocument, получить страницы и анализировать каждый один
[это функция высшего порядка должны быть переданы with_pdf ()] ""»
rsrcmgr = PDFResourceManager ()
laparams = LAParams ()
устройство = PDFPageAggregator (rsrcmgr, laparams = laparams)
Интерпретатор = PDFPageInterpreter (rsrcmgr, устройство)

TEXT_CONTENT = [ ]
для I, страница Перечислит (PDFPage.create_pages (док)):
interpreter.process_page (страница)
# получить объект LTPage для этой страницы
макета = device.get_result ()
# макета является объектом LTPage , который может содержать дочерние объекты , как LTTextBox , LTFigure, LTImage и т.д.
text_content.append (parse_lt_objs (макет, (г + 1), images_folder))

возвращение TEXT_CONTENT

Защиту get_pages (pdf_doc, pdf_pwd = «», images_folder = «/ TMP»):
«» «Процесс каждой из страниц в этом PDF - файл и возвращает список строк , представляющих собой найденный текст на каждой странице» «»
вернуться with_pdf (pdf_doc , _parse_pages, pdf_pwd, * кортеж ([images_folder]))

а = открыт ( 'путь / a.txt', 'а')
для I в get_pages ( 'путь / Export_001397_32251.pdf'):
a.write (я)
печати (я)
a.close ()





 

 

рекомендация

отwww.cnblogs.com/ganzhihui/p/11543920.html
рекомендация