2015-05-12 1 views
3

Существует несколько вопросов (некоторые ответили, а другие нет) об извлечении простого текста из файлов PDF. Stackoverflow был полезен, чтобы указать, что документация Adobe Adobe очень полезна для обнаружения объектов во время разбора: например, следует использовать ссылки «BT» и «ET» PDF для создания обратных вызовов при использовании CGPDFScanner.Извлеките только текст из файлов PDF с помощью CGPDFScanner

документация яблоко показывает обратного вызова пример: с

static void op_BT (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    printf("BT /%s\n", name); 
} 

И среди команд другой CGPDFScanner, выше обратного вызова настройки сначала создается:

myTable = CGPDFOperatorTableCreate(); 
CGPDFOperatorTableSetCallback (myTable, "BT", &op_BT); 

Все хорошо до сих пор, но документация Apple, похоже, не помогает младшим программистам, таким как я, понять следующий шаг: Помимо определения текстового блока (предположительно между обратными вызовами BT и BE?), какие несколько шагов/строк необходимы во время /я n/вне обратного вызова для захвата идентифицированного текстового блока в NSString?

Большое спасибо.

ответ

0

Первое, что вам нужно сделать, это загрузить ссылку на PDF. В наши дни это стандарт ISO, но вы можете скачать Acrobat SDK (http://www.adobe.com/devnet/acrobat.html), который содержит копию Adobe, которая будет служить вам точно также.

Читать главу 9. научу вас, что с одной стороны, вы должны понимать, текстовые операторы (Tj,»,», TJ), а с другой стороны, вы должны понимать, шрифты и кодировки.

Текстовые операторы - это операторы, которые вы можете перехватить, добавляя «строки» к PDF-документу, а все текстовые операторы должны появляться между блоками BT и ET, перехватывая эти блоки BT и ET сами по себе, не будут много для вас делать I

Шрифты важны, поскольку они определяют, как байты, используемые этими операторами, соответствуют действительным (Unicode) символам. Поэтому, если вы хотите получить значение байтов, которые вы получаете из файла PDF, вам нужно t o знать, как использовать шрифты для получения этого значения.

Некоторые дополнительные пункты:

  • Не думайте, что BT и ET соответствуют фактическим блока текста или абзаца, как вы можете знать его от таких приложений, как InDesign или Word. Один текстовый блок может содержать целую страницу или один символ (или ничего).

  • Существуют также операторы текстового состояния, которые определяют, как текст будет отображаться на странице. Есть способы, например, привлечь невидимый текст; вы можете или не захотите извлечь этот тип текста. Если вы этого не сделаете, вам нужно будет поддерживать достаточное количество операторов текстового состояния, что вы можете отличить.

Не маленькая задача :)

Update после просмотра образца PDF

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

1) Если вы посмотрите на файл PDF, на который вы ссылаетесь, вы не сможете пропустить проблему с шрифтом/кодировкой. Шрифты в образце PDF-файла подмножества, что означает, что у вас нет «cleartext» в описании страницы PDF, а вместо этого индексы, которые должны отображаться через кодировку шрифтов, используемых для получения значимого текста.

2) Извлечение текста возможно, если вы посмотрите на следующий выход из pdfToolbox (предупреждение, я аффилированное довольно сильно с этим инструментом):

<page id="33"> 
    <words> 
     <word txt="Senator"> 
      <parts> 
       <part tlh="28.3481" tlv="868.534" trh="55.4455" trv="868.534" blh="28.3481" blv="859.902" brh="55.4455" brv="859.902"></part> 
      </parts> 
     </word> 
     <word txt="House,"> 
      <parts> 
       <part tlh="57.5305" tlv="868.534" trh="82.123" trv="868.534" blh="57.5305" blv="859.902" brh="82.123" brv="859.902"></part> 
      </parts> 
     </word> 
     <word txt="85"> 
      <parts> 
       <part tlh="84.208" tlv="868.534" trh="92.548" trv="868.534" blh="84.208" blv="859.902" brh="92.548" brv="859.902"></part> 
       </parts> 
     </word> 

Есть, несомненно, и другие инструменты, которые могут дать аналогичный (или лучший) результат, поэтому извлечение текста само по себе должно быть выполнимым.

Большая проблема заключается в поиске текста, который вас интересует в правильном порядке. Выделение, которое я использовал здесь, дает текст каждого слова и его позиции (ограничивающий прямоугольник) на странице. Когда я просматриваю XML, когда вы попадаете в таблицу, проблема будет заключаться в том, какой текст принадлежит той ячейке таблицы, где заканчиваются строки и столбцы и т. Д.

В какой-то мере эта проблема сложнее, чем проблема просто обнаруживая строки текста, потому что вы имеете дело с довольно плотной таблицей (и где моя проблема была в основном одномерной (собирая все на одной линии), эта проблема двумерна.

+0

Дэвид, большое спасибо за ясное объяснение. Очевидно, что это сложнее, чем ожидалось! Если возможно, я был бы очень благодарен за любые подробные рекомендации. Adobe Ref дает различные примеры того, как «абстрактный» текст (который я хочу) отличается от представления текста через « глифов ". В примере, представленном Adobe: BT /F13 48 Tf 20 38 Td 7 Tr (ABC) Tj ET - Есть ли советы о том, как мы можем просто нацелить буквы ABC, которые появляются в скобках (xxx ....) перед оператором «Tj»? – MikeLondonUK

+0

Дэвид, я прочитал ваш комментарий с марта 2012 о «фокусе». Увлекательные комментарии о стандарте, который является универсальным в сегодняшнем возрасте «больших данных», когда столько данных хранится в формате PDF! Что касается вашей темы «фокус», возможно, у вас есть еще несколько мыслей, если я объясню, что мой основной упор делается на получение простого текста (например, «http://downloads.property.joneslanglasalle.co.uk/img/commercial_pdf_jll27452_1.pdf») и, в частности, сотни таблиц, подобных тому, который содержится на стр. 34). – MikeLondonUK

+0

Здесь очень важно. Я согласен. Если вас интересует только извлечение этих данных, и вы знаете, что процесс, генерирующий эти файлы, не сильно меняется ... (big ifs:)) ... значимой стратегией может быть сборка этих файлов и создание уверен, что все они сформированы аналогичным образом. Используйте инструмент, например callas pdfToolbox (принадлежность!) Или браузер Enfocus, чтобы посмотреть, как создаются PDF-файлы. Это потенциально позволит вам пропустить все или большую часть кодировки/шрифтов. В этом случае ваша проблема может быть сведена к «простому» перехвату операторов рисования текста ... –

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