- 论坛徽章:
- 0
|
本帖最后由 justqb 于 2012-09-03 10:43 编辑
有大概200g,50w个 PDF文件要处理。
主要是从里面提取一下需要的信息。
我的思路是把PDF转成TXT,然后用正则处理。
我的代码:- #!perl -w
- use strict;
- use 5.010;
- use CAM::PDF;
- open TST ,">tst.txt";
- my ($dir, $subdir, @files, $file)= ("tst" , "" );
- my ($pdf, $pagecount, $text1,);
- opendir DIR , $dir;#打开文件夹tst
- @files = grep {/pdf$/} readdir DIR;#读取文件,
- foreach $file (@files){
- say "$dir/$file";
- eval {$pdf = CAM::PDF->new("$dir/$file")};#有时候PDF本身就是损坏的,这句可能导致程序崩溃,就加了eval。
- $pagecount = eval {$pdf->numPages()};#同上
- say "^^$dir/$file" unless $pagecount;#
- say " $pagecount";
- next unless $pagecount =~ m{^\d+$};
- $text1 = join "-----\n" , map {$pdf->getPageText($_)} (1..$pagecount);
- #$text1 = $pdf->toString();
- say TST $text1; #调试中,都写到一个文件中了。
- }
复制代码 测试的文件夹里有23个文件,一共8m多一点,这个程序运行了2min才结束。看任务管理器,一般都要200m+内存,cpu一直保持在25%(4核cpu,酷睿8200,2.3g的)
这样的话,需要 200g * 1024m / 8m * 2min / 60 min / 24h = 35天才能转完。
小弟英语不怎么样,pdf转txt只找到这一个模块。而且这个程序是单线程,如果能用多线程,可能速度也会快个三四倍(感觉程序的瓶颈在cpu上,多线程会效率高点)。
也试过了一些单独的转化程序,不过转的有问题,没这个模块好。(比如双栏的pdf,带页眉页脚,这个模块转出来的顺序是页眉,左栏,右栏,页脚。其他程序转出来,就是页眉,左右栏不分(左边和右边在同一行,下行继续这样),页脚)。
希望大侠们提供高效模块的信息,能多线程并发就更好了。谢谢! |
|