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 根据PDF标题重命名文件_Perl_Pdf_Rename_Batch Rename - Fatal编程技术网

Perl 根据PDF标题重命名文件

Perl 根据PDF标题重命名文件,perl,pdf,rename,batch-rename,Perl,Pdf,Rename,Batch Rename,我正在尝试编写文件重命名Perl脚本,以减少手动操作。我手动打开pdf文件,复制标题并根据标题重命名文件名 我正在写下面的代码根据文件标题重命名pdf。e、 g.SPE-180024-MS为标题,pdf应重命名为该名称 根据我的逻辑,它应该重命名文件,但输出不正确 #!/usr/bin/perl use strict; #use warnings; use Cwd; use File::Basename; #use File::Copy; use File::Find; use PDF::A

我正在尝试编写文件重命名Perl脚本,以减少手动操作。我手动打开pdf文件,复制标题并根据标题重命名文件名

我正在写下面的代码根据文件标题重命名pdf。e、 g.SPE-180024-MS为标题,pdf应重命名为该名称

根据我的逻辑,它应该重命名文件,但输出不正确

#!/usr/bin/perl

use strict;
#use warnings;

use Cwd;
use File::Basename;
#use File::Copy;
use File::Find;
use PDF::API2;
use CAM::PDF;

my $path1 = getcwd;
open( F6, ">Ref.txt" );

opendir( DIR, $path1 ) or die $!;
my @dots = grep /(.*?)\-(MS)$/, readdir(DIR);
closedir(DIR);

my @file;
my @files;
my $check;
my $err_1;
my $err_2;
my $err_3;

foreach my $file (@dots) {

    #print F6 $file."\n";
    opendir DIR1, $file or die "Can't open $file: $!";
    my @files = sort grep { -f "$file/$_" } readdir DIR1;
    my $data1 = join( ",", <@files> );
    closedir DIR1;

    #print F6 @files."\n";
    my $a = @files;

    if ($data1 =~ m#(((\w+)\-(\d+)\-MS)\.(pdf))#
        #&& $data1=~m#((\w+)\-(\d+)\-MS\.(xml))#) #((.*?)\.xml)#
        ) {

        my $check = $2;

        #print F6 $1."\n";

        if ( $data1 =~ m#(((\w+)\-(\d+)\-MS)\.(xml))# ) {
            my $check1 = $2;
            my $first  = $1;

            if ( $check eq $file || $check1 eq $file ) {

            }
            else {
                #print F6 $file."\tDIFFERENT FILE PRESENT\n";
            }
        }
    }

    foreach my $f1 ( glob("$file/*.xml") ) {

        #print F6 $f1."\n";

        open( FH, '<', $f1 ) or die "Cannot open file: $f1";
        my $data2 = join( "", <FH> );

        #print F6 $data2."\n";

        close FH;

        if ( $data2 =~ m#(<page-count count="(\d+)"/>)# ) {

            my $page = $2;

            #print F6 $f1."\t".$1."\n";

            if ( $f1 =~ m#(.*?)-MS/((.*?)-MS)#s
                #SPE-173391-MS/SPE-173393-MS    #(.*?)\.(.*?)$/s)
                ) {

                my $f11 = $2;

                #print F6 $f11."\n";
                if ( $file eq $f11 ) {

                }
                else {

                    $err_1
                        = $err_1
                        . $file . "\t"
                        . $f11
                        . "\tDIFFERENT XML FILE PRESENT\n";

                    #print F6 $file."\t".$f11."\tDIFFERENT XML FILE PRESENT\n";
                    #print F6 $file."\tDIFFERENT XML FILE PRESENT\n";
                }

                foreach my $f2 ( glob("$file/*.pdf") ) {

                    open( F2, "<$f2" ) or die "Cannot open file: $f2";
                    my $data = join( "", <F2> );
                    close F2;

                    my $xml_list = $data;

                    my $pdf   = PDF::API2->open($f2);
                    my $pages = $pdf->pages;

                    #print F6 $f2."\t".$pages."\n";

                    if ($f2 =~ m#(.*?)-MS/((.*?)-MS)#

                        #/(.*?)\.(.*?)$/s
                        ) {

                        my $f21 = $2;

                        if ( $file eq $f21 ) {

                        }
                        else {

                            $err_2
                                = $err_2
                                . $file . "\t"
                                . $f21
                                . "\tDIFFERENT PDF FILE PRESENT\n";

                            #print F6 $file."\t".$f21."\tDIFFERENT PDF FILE PRESENT\n";
                        }

                        while ( $f11 =~ m/$f21/gs ) {

                            if ( $page !~ m#$pages#s ) {

                                $err_3
                                    = $err_3
                                    . $f1 . "\t"
                                    . $page . "\t"
                                    . $f2 . "\t"
                                    . $pages . "\n";

                                #print F6 $f1."\t".$page."\t".$f2."\t".$pages."\n";

                                $data2 =~ s#<page-count count="$page"\/>#<page-count count="$pages"\/>#gs;

                                open( FH, '>', $f1 ) or die "Cannot open file: $f1";
                                print FH $data2 . "\n";
                                close FH;
                            }
                        }
                    }
                }
            }
        }
    }
}

close F6;
#/usr/bin/perl
严格使用;
#使用警告;
使用化学武器;
使用File::Basename;
#使用文件::复制;
使用File::Find;
使用PDF::API2;
使用CAM::PDF;
my$path1=getcwd;
打开(F6,“>Ref.txt”);
opendir(DIR,$path1)或die$!;
my@dots=grep/(.*?\-(MS)$/,readdir(DIR);
closedir(DIR);
我的@文件;
我的@文件;
我的美元支票;
我的$err_1;
我的$err_2;
我的$err_3;
foreach my$文件(@dots){
#打印F6$文件。“\n”;
opendir DIR1,$file或die“无法打开$file:$!”;
my@files=sort grep{-f“$file/$\}readdir DIR1;
我的$data1=加入(“,”);
closedir-DIR1;
#打印F6@文件。“\n”;
我的$a=@文件;
如果($data1=~m#((\w+)\-(\d+)-MS)\(pdf))#
#&&$data1=~m#((\w+)\-(\d+)-MS\(xml))#((.*)\.xml)#
) {
我的美元支票=2美元;
#打印F6$1。“\n”;
如果($data1=~m#((\w+)\-(\d+)-MS)\(xml))){
我的$CHECK 1=$2;
my$first=$1;
如果($check eq$文件| |$check 1 eq$文件){
}
否则{
#打印F6$文件。“\t存在不同的文件\n”;
}
}
}
foreach my$f1(glob(“$file/*.xml”)){
#打印F6$f1。“\n”;
打开(FH),,$f1)或模具“无法打开文件:$f1”;
打印FH$data2。“\n”;
关闭FH;
}
}
}
}
}
}
}
}
关闭F6;

这是文件。标记的标题就是我想要的


您不能只打开PDF文件并对其进行操作。它与文本文件不同,因此必须对其进行解析。 你可以用。它会将您的pdf转换为文本,稍后可以对其进行分析以获得标题

上面提供的链接涵盖了完成工作所需的足够内容。我在这里复制一些相关的东西

use CAM::PDF;
my $pdf = CAM::PDF->new('test1.pdf');
$pageNum = 1
my $page1 = $pdf->getPageContent(pageNum);
变量
page1
的页面内容由pageNum变量指定。Rest是提取所需信息的问题


如果您发现将整个pdf转换为文本,那么您可以使用CAM::pdf的一部分,但是与阅读单个页面相比,这是低效的

您不能只打开PDF文件并对其进行操作。它与文本文件不同,因此必须对其进行解析。 你可以用。它会将您的pdf转换为文本,稍后可以对其进行分析以获得标题

上面提供的链接涵盖了完成工作所需的足够内容。我在这里复制一些相关的东西

use CAM::PDF;
my $pdf = CAM::PDF->new('test1.pdf');
$pageNum = 1
my $page1 = $pdf->getPageContent(pageNum);
变量
page1
的页面内容由pageNum变量指定。Rest是提取所需信息的问题


如果您发现将整个pdf转换为文本,那么您可以使用CAM::pdf的一部分,但是与阅读单个页面相比,这是低效的

PDF通常有一组元数据,其中包括文档标题。如果幸运的话,你会在那里找到想要的PDF标题。使用
PDF::API2
的Perl示例及其方法:

使用autodie;
使用Modern::Perl;
使用PDF::API2;
my$file='/your/sample/file.pdf';
my$pdf=pdf::API2->open($file);
我的%pdf\u信息=$pdf->info;
my$title=$pdf_info{title};
my$renamed_dir='/some/where/else/';
如果($标题){
我的$new\u name=$renamed\u dir.$title;
如果(-f$新名称){
警告“文件$new_名称已存在,请将其移到一边!”;
}否则{
$pdf->saveas($new_name);
}
}否则{
警告“在文档信息中找不到标题。”;
}

如果需要使用文本的某些部分,则应首先将其转换为文本。因为你没有提到任何操作系统的限制,所以你得到了一个Debian/Ubuntu解决方案。首先,安装包
poppler-utils
。然后使用新安装的工具
pdftotext
从PDF中提取所有文本。最好使用
pdftotext-layout
。从生成的文本中,您必须grep/解析带有“标题”的行,然后使用该行重命名(或者更安全地说:复制)PDF。

PDF通常有一组元数据,其中包括文档标题。如果幸运的话,你会在那里找到想要的PDF标题。使用
PDF::API2
的Perl示例及其方法:

使用autodie;
使用Modern::Perl;
使用PDF::API2;
my$file='/your/sample/file.pdf';
my$pdf=pdf::API2->open($file);
我的%pdf\u信息=$pdf->info;
my$title=$pdf_info{title};
my$renamed_dir='/some/where/else/';
如果($标题){
我的$new\u name=$renamed\u dir.$title;
如果(-f$新名称){
警告“文件$new_名称已存在,请将其移到一边!”;
}否则{
$pdf->saveas($new_name);
}
}否则{
警告“在文档信息中找不到标题。”;
}

如果需要使用文本的某些部分,则应首先将其转换为文本。因为你没有提到任何操作系统的限制,所以你得到了一个Debian/Ubuntu解决方案。首先,安装包
poppler-utils
。然后使用新安装的工具
pdftotext
从PDF中提取所有文本。最好使用
pdftotext-layout
。从生成的文本中,您必须grep/解析带有“标题”的行,然后使用该行重命名(或更安全地复制)PDF。

PDF中的内容流可能会被过滤(通常意味着它是压缩的),因此您不能仅使用regexp来查找标题(它不在“纯文本”中)形式,因此它将不匹配,或者匹配将是某个随机的o部分