【发布时间】:2016-07-03 16:49:44
【问题描述】:
我正在尝试编写文件重命名 Perl 脚本,以减少手动操作。我手动打开pdf文件,复制标题并根据标题重命名文件名。
我正在编写以下代码以根据文件标题重命名 pdf。例如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;
这是文件。标记的标题是我想要的。
【问题讨论】:
-
pdf 中的内容流可能会被过滤(这通常意味着它被压缩),因此您不能只使用正则表达式来查找标题(它不是“纯文本”形式因此它不会匹配或匹配将是pdf的一些随机部分)。要确认在一些类似记事本的编辑器中打开 pdf 并搜索标题 - 您可能找不到它。您需要正确解析 pdf 以获取第一页的内容,然后从中提取标题。我没有使用 perl 的经验,所以对此无能为力,抱歉。
-
感谢您提供信息,但任何人都可以帮助生成代码以正常工作
-
你可以使用工具
pdfinfo(它是poppler工具包的一部分)告诉你PDF的标题吗? -
你能多解释一下你所说的标题是什么意思吗?那是文档顶部的一些文本标题,还是文件中的元信息?也许在 PDF 查看器中截取文件的屏幕截图,使敏感的内容不可读,然后在您想要的部分周围手绘一个圆圈。
-
感谢 mark 和 simbabque,我没有使用任何工具,我正在创建脚本来查找 pdf 顶部的 pdf 文件的标题(例如:SPE-180024-MS)并替换文件根据那个标题
标签: perl pdf rename batch-rename