为什么我无法使用CAM :: PDF解析非比例文本?

时间:2011-06-12 16:29:00

标签: perl pdf

解析页面号码时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;
//}
}`

1 个答案:

答案 0 :(得分:1)

PDF不存储您阅读的语义文本,而是使用以特定字体映射到字形(绘制的字符)的字符代码。但是,通常,代码字形映射与常见字符集(例如ISO-8859-1或UTF-8)匹配,因此代码是人类可读的。对于您能够解析的所有文本都是这种情况,尽管有时奇怪的字符(主要是标点符号)也是“错误的”。

不幸的是,文档中“mount_vxfs”的文本编码完全不同,导致明显的垃圾。如果你很好奇,你可以通过在代码中用getPageConxt()代替getPageText()来看到真正存在的东西。

为了将PDF文本转换回有意义的字符,PDF阅读器必须跳过具有许多转换表(包括所谓的CMaps)的箍。因为这是很多编程工作,许多更简单的库选择不实现它们。 CAM :: PDF就属于这种情况。

如果你只是对解析文本感兴趣(而不是编辑它),我会成功使用以下技术:

  1. 获取xpdf(http://foolabs.com/xpdf)或Poppler(http://poppler.freedesktop.org/)。 Poppler是xpdf的新版本。如果您使用的是* nix,则会有一个包。

  2. 使用命令行工具'pdftotext'从文件中提取文本,无论是页面还是一次提取。

  3. 示例:

    #!/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页上。)