2013-02-05 2 views
3

주어진 부모 폴더에서 파일 그룹을 압축하여 * .epub 파일을 생성하는 펄 스크립트를 작성하고 있습니다. 거기에 내가 수동으로 파일을 압축 할 때perl로 * .epub 만들기 Archive :: Zip - epubchecker 오류

Required MTA-INF/container.xml resource is missing 

이 (내가 WINXP 머신에있어) :이 과정은 작품을 좋아, 나는 어도비 디지털 에디션에서 EPUB을 열 수,하지만 나는 epubchecker 오류가 문제는 없지만 perl로 만든 파일은 오류를 발생시킵니다.

#------------------------------------------------------------------------------- 
# name  : createEpub 
# purpose : create an epub from a given parent folder 
# args  : [0] parent folder [1] name of new zip file [2] log object 
# example : &createEpub($zipLoc, 'newzip', $log); 
# notes  : it is assumed that mimetype, meta-inf and oebs are all child folders 
#    of the given parent folder 
# author: : jw 2/4/13 
#------------------------------------------------------------------------------- 


sub createEpub(){ 
my ($parentFolder, $zipName, $log) = @_; 
my $newZipLoc; 
$parentFolder =~ s#\\#/#g; 

    my $newZip = Archive::Zip->new(); 

    # add mimetype first with no compression 
    my $mimetype = "$parentFolder/mimetype"; 
    my $mimetypeMember = $newZip->addFile($mimetype, 'mimetype'); 
    $mimetypeMember->desiredCompressionMethod(COMPRESSION_STORED); 

    ## add web-inf 
    my $metaINF = $parentFolder . '/META-INF'; 
    &addFilesToZip($metaINF, $parentFolder, $newZip, $log); 

    ## add OEBPS 
    my $oebps = $parentFolder . '/OEBPS'; 
    &addFilesToZip($oebps, $parentFolder, $newZip, $log); 

    # maybe break this out in its own func...ok for current epub script purposes 
    $newZipLoc = $1 if $parentFolder =~ m/(.*)\//; 
    $newZipLoc = $newZipLoc . '/' . $zipName; 
    if($newZipLoc !~ m/\.zip/){ 
     $newZipLoc = $newZipLoc . '.epub'; 
    } 

    $log->info("writing new zip file to $newZipLoc"); 
    $newZip->writeToFileNamed($newZipLoc); 

    ## not sure if this is the write thing to do...returning actual file name, not zip  extract object 
    return $newZipLoc; 

} 


sub addFilesToZip(){ 
my ($file, $origParent, $zip, $log) = @_; 

    if(-d $file){ 
     my @children = grep{ $_ !~ m/mimetype/} glob("$file/*") or warn "can't add  $file to zip! $!\n"; 
      foreach my $child(@children){ 
       &addFilesToZip($child, $origParent, $zip, $log); 
      } 
     } elsif (-f $file){ 
      my $memPath = $file; $memPath =~ s/\Q$origParent\E//; 
      $log->info("adding member $memPath"); 
      my $newMember = $zip->addFile($file, $memPath); 

     } 



} 

내가 윈집의 결과 EPUB 파일을 열

에서, container.xml는 또한 MIME 형식을 압축 처음으로 확인했다, 확실히이 다음은 관련 코드입니다. 다음은 로그에서 발췌 한 것입니다 : 나는 사람들이 자신의 리눅스 쉘 명령에 만들 약간의 변경이 본 것 중 인터넷 검색에서

------------------------------------------------------------------------- 
    creating zip file from recently unzipped files 
------------------------------------------------------------------------- 

[ok]:  adding member /META-INF/container.xml 
[ok]:  adding member /META-INF/stylesheet.css.kindle 
[ok]:  adding member /META-INF/toc.ncx.kindle 
[ok]:  adding member /OEBPS/content.opf 
[ok]:  adding member /OEBPS/coverpage.html 

은,하지만 난 :: 우편을 보관하거나 승리 관련된 아무것도 표시되지 않았다.

덕분에, 당신은 절대 경로로 zip 파일의 항목을 만드는 것 같습니다 로깅에서 BP

답변

3

.

[ok]:  adding member /META-INF/container.xml 

나는 ePub 파일은 상대 경로 할 필요가 생각 - zip 파일에 기록 될 것입니다 선두 "/"의 경로를 제거하려고합니다. ths와 같은 것 (테스트되지 않음)

} elsif (-f $file){ 
     my $memPath = $file; $memPath =~ s/\Q$origParent\E//; 
     # remove leading "/" 
     $memPath =~ s#^/+##; 
     $log->info("adding member $memPath"); 
     my $newMember = $zip->addFile($file, $memPath); 

    } 
+0

감사합니다! -bp – badperson