PDF文档中的总页数

时间:2019-01-13 13:19:07

标签: matlab pdf

MATLAB提供了extractFileText函数,该函数使我们可以从PDF文件以及其他文件格式中读取文本,并将提取的文本另存为字符串。

我们可以向该函数传递一个额外的参数,以便从文档的特定页面提取文本。

例如,要从示例exampleSonnets.pdf文件的第3、5和7页提取文本:

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 :(得分:2)

我不知道一种可以让您执行此操作的方法。但是您可以使用try/catch直接处理这种情况,而无需事先知道页面数。

如果您确实需要事先知道页面的数量,则可以遍历页面,直到遇到使用try/catch处理的错误(适用于小型pdf文件)或实施例如以类似的方式进行二进制搜索。

答案 1 :(得分:2)

flawr's idea实际上非常聪明!

实际上,由于错误消息中包含最大页码,因此我们可以触发异常(故意寻求任何可笑的大页码),捕获该异常,然后解析错误消息以恢复最大页码

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

有效!