使用 perl Archive::Zip 创建 *.epub -- epubchecker 错误

2024-02-26

我正在编写一个 perl 脚本,它将从给定的父文件夹中压缩一组文件并创建一个 *.epub 文件。该过程工作正常,我可以在 adobe 数字版本中打开 epub,但我收到 epubchecker 错误:

Required MTA-INF/container.xml resource is missing

当我手动压缩文件时(我在 winxp 机器上)没有问题,但 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 );

        }



}

当我在 winzip 中打开生成的 epub 文件时,container.xml 肯定在那里,我还确保 mimetype 是第一个,没有压缩。以下是日志的摘录:

-------------------------------------------------------------------------
    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

在谷歌搜索中,我看到人们对他们的 linux shell 命令做了轻微的改变,但我没有看到任何与 archive::zip 或 win 相关的内容。

谢谢, BP


从您的日志记录来看,您似乎正在使用绝对路径在 zip 文件中创建条目。

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

我相信 epub 文件需要是相对路径 - 尝试从要写入 zip 文件的路径中删除前导“/”。像这样的东西(未经测试)

    } 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 );

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 perl Archive::Zip 创建 *.epub -- epubchecker 错误 的相关文章

  • 我能否确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行?

    Perl 5 10 和 5 12 的一些新功能 例如 say 被定义为功能 您可以使用 feature 编译指示显式启用或禁止这些功能 但其他添加 例如正则表达式的命名捕获组 是隐式的 当我使用 5 10 解释器编写 Perl 但希望它也能
  • 我需要一个便携式、一致的伪随机数生成器

    I am writing a kid sister encryption http enfranchisedmind com blog posts the kid sister crypto manifesto function and I
  • 从 Perl 脚本 DBI 关闭 MSSQL 服务器

    我正在写一个 perl 脚本 其中我必须关闭我的 mssql 服务器 做一些操作 然后我必须重新启动它 我知道一种方法是使用 netstat 来停止服务 但我不能使用它 所以我尝试安装 DBI 和 DBD ODBC 模块 我可以通过以下代码
  • perl imap 将邮件移至垃圾箱 (Mail::IMAPClient)

    我需要将所有未见的邮件移至垃圾箱 然后从收件箱中删除 my inbox imap gt select Inbox my mails imap gt unseen foreach my msgid mails imap gt set flag
  • 从 Perl 中的字符串中删除标点符号

    如何从 Perl 中的字符串中删除除空格之外的所有标点符号 s punct g
  • 使用 Getopt::Long 解析参数的最简洁方法

    我使用 GetOpt 来解析命令行参数 我想添加一个新选项 multi 它应该得到一个如下所示的字符串 key1 abc key2 123 key3 xwz 我不知道用户想要提供多少个自定义密钥 但他可以提供 minimax5键 另外 我想
  • 是否有用于 AES 的纯 Perl 模块?

    是否有用于 AES 的纯 Perl 模块 地穴 Rijndael PP http search cpan org dist Crypt Rijndael PP Rijndael 是底层算法AES https secure wikimedia
  • 在 ios 中从 XMPP 服务器检索存档的消息

    我正在将 XMPP 功能集成到我的 ios 应用程序中 但遇到了一个无法解决的问题 问题是我无法从服务器获取存档的消息 我的客户能够登录 并且我已经成功测试了多个服务调用 发送 接收消息 获取有关用户的信息 发送后
  • Moose:属性值更改时缓存的计算结果会过期吗?

    在我们的类中 我们有一个模式 我们创建一个属性来表示 计算值 出于显而易见的原因 我们想要缓存计算值 然后当基础值之一发生变化时使缓存失效 所以我们目前有这个 package FooBar use Moose has foo gt acce
  • 如何构建 Perl Web 服务基础设施

    我有许多用于管理多服务器基础设施的脚本 其中一些脚本需要 root 访问权限 一些需要访问数据库 并且大多数脚本都是基于 perl 的 我想将所有这些脚本转换为非常简单的 Web 服务 可以从不同的应用程序执行 这些 Web 服务将接受常规
  • 如何在正则表达式中区分数字和ip地址?

    例如 如果我们查看 5 56 和 183 55 0 144 基本上 当你做这样的事情时 d d 它匹配 5 56 189 55 和 0 144 有没有办法通过正则表达式仅匹配数字而不匹配 ip 地址的部分 我尝试使用前瞻 但我不知道它应该是
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 将相同匹配模式的连续 2 行放入单行中

    我想解析这组行 以便如果得到相同的模式 例如 lt email protected cdn cgi l email protection gt 在连续的行中 它应该以单行形式打印 并在两行之间使用 q2VDWKkY010407 222187
  • 如何使用 Perl 正则表达式匹配字符串末尾/开头处的空格或单词?

    我想找到与我的正则表达式匹配的序列 它们应该位于由空格包围的字符串中间 末尾或开头或者是字符串中唯一的东西 Example 我们假设序列 qwe45rty 就是我们正在寻找的 我希望能够对所有这些因素都抱有积极的态度 qwe45rty qw
  • 向用户提示多个问题(是/否和文件名输入)

    我想问用户多个问题 我有两种类型的问题 是 否或文件名输入 我不知道如何将这一切放入一个好的if结构 我不确定是否也应该使用 else 语句 有人可以帮我们解决这个问题吗 这是我到目前为止所拥有的 print Do you want to
  • 在 Ubuntu 中执行 .cgi 文件

    我在 Ubuntu 下运行 Apache PHP 当我运行 cgi 文件时 通过http localhost mycgi cgi 浏览器将显示代码而不是运行它 如何让浏览器执行 CGI 文件而不是显示其内容 将这些行添加到您的 apache
  • 如何将会话管理添加到简单的 Perl CGI 网页?

    我有一个简单的网页 到目前为止不需要任何登录 它是用 Perl CGI 编程的 我想知道添加会话支持以便获得登录信息的步骤 我不需要非常复杂的方法 因为网页非常简单 另外 我想要一些关于支持 Perl 会话所需的技术 库的建议 我在很多很多
  • 在 qx 运算符中将 perl 数组拆分为单独的参数

    我试图将一组参数传递给qx操作员 考虑 my files qw A txt B txt print qx ls files 这给出了错误 ls cannot access A txt B txt No such file or direct
  • 使用 -T 开关运行时 $ENV{ENV} 不安全

    当我尝试最后一个例子时perlfaq5 如何计算文件中的行数 http perldoc perl org perlfaq5 html How do I count the number of lines in a file 我收到一条错误消
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本

随机推荐

  • 大表中的行数

    SELECT COUNT FROM BigTable 1 如果我的行数超过 10 亿 我应该使用哪种方式来获取表中的行数 更新 例如 如果上面的查询出现 超时问题 有什么方法可以优化它 怎样才能做得更快呢 如果您需要精确的计数 则必须使用C
  • 每次执行 make 先决条件

    我的生成文件 PHONY test unit test functional mocha test test unit test functional test unit SUITE unit test unit mocha echo un
  • 部署概念:打包 JAR 依赖项、何时以及为何

    因此 我对 Java EE 比较陌生 并且很难理解 Java 部署文件何时 何地以及为何与其依赖项一起打包 假设我将我的项目构建为myapp jar 并且依赖于 fizz jar buzz jar 和 JODA joda time 2 0
  • 清理 Python 模块并重新启动 Mac OS X

    我不是一个完全的新手 但我尝试安装模块很长一段时间 此时我想重新开始并安装 python 和我需要的所有模块 这样我才能真正理解它们 我的问题是 其中一些导入 但大多数安装到错误的站点包或不导入 可能是因为我弄乱了我的系统 python 我
  • 在Java或Android中将Mat(OpenCV)数据类型写入csv文件

    我喜欢将 Mat 类型数据从 OpenCV 提取到 csv 文件 我可以从 Mat 到字节数组 然后我写入文本文件 但我从未获得完整图像 始终获取图像的一部分 可能出什么问题了 printtoTextFile Mat d File file
  • R:在查询图形参数时防止 par() 打开新窗口

    这个问题说明了一切 有时您需要进行初步计算来格式化绘图 并且您不希望显示窗口 最重要的是抢走焦点 例如 假设您想知道用作边距的行的高度 您可能需要使用 par mai par mar 我经常查询图形参数来定义图形输出 但发现弹出的窗口分散注
  • 为什么我无法在 asp:CheckBox 上设置值?

    没有这个属性Value
  • Slickgrid 水平滚动条覆盖最后一行

    当 Slickgrid 包含在div具有固定宽度和水平滚动条变得必要 该滚动条覆盖最后一行数据 http jsfiddle net ericjohannsen LtsvJ http jsfiddle net ericjohannsen Lt
  • 如何使用 GDAL 从 tiff 和 4 个角纬度和经度创建 geotiff [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一张没有 TIFF 格式地理数据的图像 地图 我需要从我的图像中获取 GeoTIFF 文件 我的地
  • 为什么 tomcat 的数据库连接池有两个选项(tomcat-dbcp 和 tomcat-jdbc)?

    我想将数据库连接池添加到现有应用程序 我找到了两个基于tomcat的库tomcat dbcp and tomcat jdbc 我刚刚遇到麻烦了 我应该选择哪一个 总之 Tomcat 提交团队成员的注释 请参阅here https bz ap
  • 使用私有构造函数实例化内部类

    我正在尝试使用反射来创建类的实例 但它是内部密封的并且有私有构造函数 我想知道如何初始化它 并且作为框架的一部分 我只能使用反射将其取出 internal sealed class ABC private ABC string passwo
  • 为什么“pip3 install netifaces”在 Debian 10 Buster 上失败?

    我在 AWS EC2 上设置了一个新的 Debian 10 Buster 实例 并且能够安装依赖于 netifaces 的 pip3 软件包 但是当我第二天返回时 该软件包崩溃并报告 netifaces 中的错误 如果我尝试运行 pip3
  • iPhone 应用内购买商店工具包错误 -1003“无法连接到 iTunes Store”

    我一直致力于添加应用内购买 并且能够使用 Store Kit 创建和测试应用内购买 耶 在测试过程中 我以一种导致应用程序在购买过程中崩溃的方式运行了我的应用程序 所以我猜接收 paymentQueue updatedTransaction
  • Bash 命令替换给出奇怪的不一致输出

    由于与此问题无关的某些原因 我不是直接在 bash 脚本中运行 Java 服务器 而是通过单独的子 shell 下的命令替换在后台运行 该子命令的目的是返回 Java 服务器的进程 ID 作为其标准输出 有问题的片段如下 launch da
  • 在 C++ 标识符中使用下划线的规则是什么?

    在 C 中 使用某种前缀来命名成员变量是很常见的 以表示它们是成员变量 而不是局部变量或参数 如果您有 MFC 背景 您可能会使用m foo 我也见过myFoo偶尔 C 或者可能只是 NET 似乎建议仅使用下划线 如下所示 foo C 标准
  • 我想使用 pyqt5 的拖放方法获取并显示图像

    我想使用 pyqt5 的拖放方法获取并显示图像 例如 像这张图片一样 我想制作拖放空间和图像显示空间 import sys from PyQt5 QtWidgets import QPushButton QWidget QLineEdit
  • CUDA 编译器 (nvcc) 宏

    是否有我可以使用的 CUDA 的 define 编译器 nvcc 宏 如 Windows 的 WIN32 等 我需要这个用于 nvcc 和 VC 编译器之间通用的头代码 我知道我可以继续定义我自己的并将其作为参数传递给 nvcc 编译器 D
  • C++:像使用数组一样使用 std::vector 是否安全?

    我需要有一个固定大小的元素数组 并调用它们需要了解它们如何放置在内存中的函数 特别是 功能类似于glVertexPointer 需要知道顶点在哪里 它们彼此之间有多远等等 在我的例子中 顶点将是要存储的元素的成员 要获取此数组中元素的索引
  • ggplot2:颜色随 y 轴值变化的条形图

    我有这个简单的代码 数据 条形图 dat lt c Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec val lt c 2 5 3 2 5 3 3 1 0 2 6 4 3 5 5 2 1 9 2
  • 使用 perl Archive::Zip 创建 *.epub -- epubchecker 错误

    我正在编写一个 perl 脚本 它将从给定的父文件夹中压缩一组文件并创建一个 epub 文件 该过程工作正常 我可以在 adobe 数字版本中打开 epub 但我收到 epubchecker 错误 Required MTA INF cont