解析页面号码时http://sfdoccentral.symantec.com/sf/5.1/linux/pdf/vxfs_admin.pdf中的22,我能够解析除mount_vxfs
之外的所有单词,因为它的编码样式和/或字体与普通纯文本不同。
有关详细信息,请参阅随附的PDF页面。
请找到我的代码: -
`#!/usr/bin/perl
use CAM::PDF;
my $file_name="vxfs_admin_51sp1_lin.pdf";
my $pdf = CAM::PDF ->new($file_name);
my $no_pages=$pdf->numPages();
print "$no_pages\n";
for(my $i=1;$i<$no_pages;$i++){
my $page = $pdf->getPageText($i);
//for page no. 22
//if($i==22){
print $page;
//}
}`
答案 0 :(得分:1)
PDF不存储您阅读的语义文本,而是使用以特定字体映射到字形(绘制的字符)的字符代码。但是,通常,代码字形映射与常见字符集(例如ISO-8859-1或UTF-8)匹配,因此代码是人类可读的。对于您能够解析的所有文本都是这种情况,尽管有时奇怪的字符(主要是标点符号)也是“错误的”。
不幸的是,文档中“mount_vxfs”的文本编码完全不同,导致明显的垃圾。如果你很好奇,你可以通过在代码中用getPageConxt()代替getPageText()来看到真正存在的东西。
为了将PDF文本转换回有意义的字符,PDF阅读器必须跳过具有许多转换表(包括所谓的CMaps)的箍。因为这是很多编程工作,许多更简单的库选择不实现它们。 CAM :: PDF就属于这种情况。
如果你只是对解析文本感兴趣(而不是编辑它),我会成功使用以下技术:
获取xpdf(http://foolabs.com/xpdf)或Poppler(http://poppler.freedesktop.org/)。 Poppler是xpdf的新版本。如果您使用的是* nix,则会有一个包。
使用命令行工具'pdftotext'从文件中提取文本,无论是页面还是一次提取。
示例:
#!/usr/bin/perl
use English;
my $file_name="vxfs_admin.pdf";
open my $text_fh, "/usr/bin/pdftotext -layout -q '$file_name' - 2>/dev/null |";
local $INPUT_RECORD_SEPARATOR = "\f"; # slurp a whole page at a time
while (my $page_text = <$text_fh>) {
# this is here only for demo purposes
print $page_text if $INPUT_LINE_NUMBER == 19;
}
close $text_fh;
(注意:我使用你的链接检索的文件略有不同;有问题的位在第19页上。)