使用CAM :: PDF for Perl - 无法从pdf中提取图像

时间:2014-01-16 06:21:39

标签: perl pdf cam-pdf

我有一个pdf文件,使用CAM :: PDF的listimages.pl只返回使用PDF :: GetImages将提取图像。使用以下代码,我可以找到图像对象,但我不知道如何将其提取到文件。我无法弄清楚为什么命令行工具不起作用。

#!/usr/bin/perl -w
use strict;

use Cwd;
use File::Basename;
use Data::Dumper;
use CAM::PDF;
use CAM::PDF::PageText;
use CAM::PDF::Renderer::Images;

my $file = shift @ARGV || die "Usage: get-pdf-images /path/to/file.pdf \n";

my $pdf = CAM::PDF->new($file) || die "$CAM::PDF::errstr\n";

#print $pdf->toString();

foreach my $p ( 1 .. $pdf->numPages() ) {
    my $page = $pdf->getPageContentTree($p);
    my $str = $pdf->getPageText($p);
    if (defined $str) {
#        CAM::PDF->asciify(\$str);
        print $str;
    }

    print "-------------------------------\n";
    my $gs = $page->findImages();
    my @imageNodes = @{$gs->{images}};
    print "Found " . scalar @imageNodes . " images on page $p\n";
    print Data::Dumper->Dump([\@imageNodes],['imageNodes']);
}

如果我运行`pdfinfo.pl``,它会报告:

$ pdfinfo.pl test.pdf
File:         test.pdf
File Size:    4599 bytes
Pages:        1
Author:       þÿadmin01
CreationDate: Fri Jan  3 03:48:53 2014
Creator:      þÿPDFCreator Version 1.7.2
Keywords:
ModDate:      Fri Jan  3 03:48:53 2014
Producer:     GPL Ghostscript 9.10
Subject:
Title:        þÿVision6Card
Page Size:    variable
Optimized:    no
PDF version:  1.4
Security
  Passwd:     none
  Print:      yes
  Modify:     yes
  Copy:       yes
  Add:        yes

可以从这里下载test.pdf文件:http://imaptools.com:8080/dl/test.pdf

1 个答案:

答案 0 :(得分:1)

CAM::PDF的某些部分尚未完成。如果您查看listimages.pl的来源,您会看到解析内嵌图像的内容有点原始,例如它不允许BIEI之间无法匹配的parens(就像这样),所以在这里找不到图像。有uninlinepdfimages.pl,它使用另一种启发式方法来解析内联图像,但对于这个文件,它似乎挂了,我无意查看混淆它的内容。并且,CAM::PDF::Renderer::Images,就像在你的代码中一样,是对同一个问题的另一种看法,最后它对内容流进行了正确的解析,但是库似乎没有提供任何帮助在这里提取图像数据的方法。但是如果你非常需要它,我会看到没有技术问题(除了你的时间),给定@imageNodes中的信息(宽度,高度,深度,使用的压缩,imagedata),以编程方式提取图像。