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文档中的总页数 ,而不会触发错误,以便可以安全地将搜索范围缩小到最大页数?
有用于此目的的功能吗?
答案 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
有效!