Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么我无法使用CAM::PDF解析非比例文本?_Perl_Pdf - Fatal编程技术网

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

Perl 为什么我无法使用CAM::PDF解析非比例文本?,perl,pdf,Perl,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_page

在解析的第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;
//}
}`
`#/usr/bin/perl
使用CAM::PDF;
我的$file\u name=“vxfs\u admin\u 51sp1\u lin.pdf”;
my$pdf=CAM::pdf->new($file\u name);
my$no_pages=$pdf->numPages();
打印“$no_页面\n”;
对于(我的$i=1;$igetPageText($i);
//第22页
//如果($i==22){
打印$page;
//}
}`

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

不幸的是,文档中“mount_vxfs”的文本编码完全不同,这导致了明显的垃圾。如果您感到好奇,您可以在代码中用getPageContent()替换getPageText()来查看真正的内容

为了将PDF文本转换回有意义的字符,PDF阅读器必须使用大量的转换表(包括所谓的CMAP)跳转。因为这是大量的编程工作,许多简单的库选择不实现它们。CAM::PDF就是这样

如果您只是对解析文本感兴趣(而不是编辑文本),那么我成功地使用了以下技术:

  • 获取xpdf(http://foolabs.com/xpdf)还是波普勒(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;
    
    !/usr/bin/perl
    使用英语;
    我的$file\u name=“vxfs\u admin.pdf”;
    打开我的$text\u fh,“/usr/bin/pdftotext-layout-q'$file\u name'-2>/dev/null |”;
    本地$INPUT_RECORD_SEPARATOR=“\f”#一次发出一整页的声音
    while(我的$page\u text=){
    #这里仅用于演示目的
    如果$INPUT\U LINE\U NUMBER==19,则打印$page\U text;
    }
    关闭$text_fh;
    

    (注意:我使用您的链接检索到的文档略有不同;有问题的部分在第19页。)

    Mat,发生了什么事……请尽可能说明原因???????也许你应该向我们展示你的代码,而不是你链接到的pdf的截图。我认为你的键盘出了问题。曼迪,在27个问题之后,你应该知道不要在评论中发布代码。请编辑你的问题,并用正确的格式添加代码惯性导航与制导。