Использование CAM::PDF для Perl - Невозможно извлечь изображение из PDF

У меня есть PDF-файл, который listimages.pl, который использует CAM:: PDF, ничего не возвращает, но использование 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 ответ

Решение

Некоторые части CAM::PDF незакончены Если вы посмотрите на источник listimages.plвы увидите, что синтаксический анализ содержимого для встроенных изображений несколько примитивен, например, он не допускает непревзойденные парены между BI а также EI (как это имеет место) и поэтому не находит изображение здесь. Там в uninlinepdfimages.pl, он использует другую эвристику для анализа встроенных изображений, но для этого файла он, кажется, зависает, и я не собираюсь выяснять, что его смущает. А также, CAM::PDF::Renderer::ImagesКак и в вашем коде, это еще один подход к той же проблеме, и, наконец, он выполняет правильный анализ потока контента, но библиотека, похоже, не предоставляет средств для извлечения данных изображения. Но если вам это ОЧЕНЬ нужно, я не вижу никаких технических проблем (кроме вашего времени), учитывая информацию в @imageNodes (ширина, высота, глубина, используемое сжатие, imagedata), для программного извлечения изображения.

Другие вопросы по тегам