Общее количество страниц в документе PDF - PullRequest
0 голосов
/ 13 января 2019

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

Мы можем передать дополнительный аргумент этой функции для извлечения текста из определенных страниц документа.

Например, чтобы извлечь текст со страниц 3, 5 и 7 из образца exampleSonnets.pdf файла:

str = extractFileText("exampleSonnets.pdf", 'Pages', [3 5 7]);

Однако эта функция не позволяет заранее определить общее количество страниц, содержащихся в документе PDF .

Так что, если нам случится сделать что-то вроде:

str = extractFileText("exampleSonnets.pdf", 'Pages', [99 100]);

Выдается следующая ошибка:

Error using extractFileText (line 95)
No page 100 in file. Maximum page number: 47.

Предупреждение о том, что мы запросили номер страницы, который превышает фактическое общее количество страниц в документе.

Это хорошо.

Однако как мне узнать общее количество страниц в документе PDF заранее , не вызывая ошибки, чтобы можно было безопасно сузить поиск до максимального номера страницы?

Есть ли функция для этой цели?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Идея Flawr на самом деле очень умная!

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

No page 100 in file. Maximum page number: 47.
                                           ^
                                   This is all we need

Так что нам даже не нужно перебирать каждую страницу документа:)

Я пошел дальше и сделал эту простую numpages функцию:

function [num] = numpages(filename)

% Queried page number. Any big number should do.
bignum = 1e6;

try
    extractFileText(filename, 'Pages', bignum);
catch ME
    if strcmp(ME.identifier, 'textanalytics:extractFileText:NoSuchPage')
        % Extract the Maximum page number from the exception message.
        num = str2double(extractBetween(ME.message, "number: ", "."));
    else
        % Not the exception we are interested in. Rethrow it.
        rethrow(ME);
    end
end

end

Контрольный пример:

>> numpages("exampleSonnets.pdf")

ans =

    47

Работает!

0 голосов
/ 13 января 2019

Я не знаю, как можно было бы сделать это. Но вы можете использовать try/catch, чтобы справиться с ситуацией напрямую, не зная заранее количество страниц.

Если вам нужно заранее узнать количество страниц, вы можете просто перебирать страницы, пока не найдете ошибку, которую вы обрабатываете с помощью try/catch (работает для небольших PDF-файлов) или реализуете, например, например. бинарный поиск аналогичным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...