使用压缩生成的损坏的 docx

2024-01-15

首先我要说的是,我在这里创建了一个帐户,因为为了尝试解决这个问题,我一直在用头撞墙,所以就这样吧。

另外,我已经看到这个问题了here. https://stackoverflow.com/questions/13566468/how-to-compress-a-folder-to-make-docx-file-in-android这些答案都没有帮助,我都尝试过。

我需要创建一个word文档,里面有一个简单的表格和数据。我决定创建一个示例文档,在其中获取创建文档所需的 xml。我将所有文件夹从解压缩的 docx 文件移到我的资产文件夹中。当我意识到无法写入资产文件夹后,我编写了一种方法,将所有文件和文件夹复制到设备的外部存储位置,然后将我创建的文档写入同一位置。从那里我尝试将文件压缩回 .docx 文件。这就是事情不起作用的地方。

实际的 docx 文件已创建,我可以通过 DDMS 将其移动到我的计算机,但当我查看它时,Word 说它已损坏。但奇怪的是,如果我解压缩它,然后在我的计算机上重新压缩它而不做任何更改,那么它就可以完美地工作。我使用了一个名为 DiffMerge 的程序(适用于 mac)来将示例解压缩的 docx 文件与我创建的解压缩的 docx 文件进行比较,它说它们完全相同。所以,我认为这与Android中的压缩过程有关.

我还尝试在计算机上解压缩示例 docx 文件,将所有文件和文件夹移动到我的资产文件夹(包括 document.xml 文件),然后尝试将其压缩,而不添加我自己的 document.xml 文件并使用示例文件那也行不通。我尝试的另一件事是将实际的 docx 文件放在我的资产文件夹中,将其解压缩到我的外部存储上,然后重新压缩它而不执行任何操作。这也失败了。

我基本上已经不知所措了。请有人帮我解决这个问题。

这是我的一些代码:

  1. 首先调用 moveDocxFoldersFromAssetsToExternalStorage()。
  2. 之后调用所有文件都已移动过来。
  3. 然后,我创建 document.xml 文件并将其放置在它所属的 word 目录中
  4. 一切都在它应该在的地方,我现在尝试创建 zip 文件。

.

private boolean moveDocxFoldersFromAssetsToExternalStorage(){
    File rootDir = new File(this.externalPath);
    rootDir.mkdir();

    copy("");

    // This is to get around a glitch in Android which doesnt list files or folders
    // with an underscore at the beginning of the name in the assets folder.
    // This renames them once they are saved to the device.
    // We need it to show up in the list in order to move them.

    File relsDir = new File(this.externalPath + "/word/rels");
    File renameDir = new File(this.externalPath + "/word/_rels");
    relsDir.renameTo(renameDir);

    relsDir = new File(this.externalPath + "/rels");
    renameDir = new File(this.externalPath + "/_rels");
    relsDir.renameTo(renameDir);

    // This is to get around a glitch in Android which doesnt list hidden files.
    // We need it to show up in the list in order to move it.

    relsDir = new File(this.externalPath + "/_rels/rels.rename");
    renameDir = new File(this.externalPath + "/_rels/.rels");
    relsDir.renameTo(renameDir);

    return true;
}

private void copy(String outFileRelativePath){
    String files[] = null;
    try {
        files = this.mAssetManager.list(ASSETS_RELATIVE_PATH + outFileRelativePath);
    } catch (IOException e) {
        e.printStackTrace();
    }

    String assetFilePath = null;
    for(String fileName : files){
        if(!fileName.contains(".")){
            String outFile = outFileRelativePath + java.io.File.separator + fileName;
            copy(outFile);
        } else {
            File createFile = new File(this.externalPath + java.io.File.separator + outFileRelativePath);
            createFile.mkdir();
            File file = new File(createFile, fileName);

            assetFilePath = 
                ASSETS_RELATIVE_PATH + outFileRelativePath + java.io.File.separator + fileName;

            InputStream in = null;
            OutputStream out = null;
            try {
                in = this.mAssetManager.open(assetFilePath);
                out = new FileOutputStream(file);
                copyFile(in, out);
                in.close();
                out.flush();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

private void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1){
        out.write(buffer, 0, read);
    }
}

private void zipFolder(String srcFolder, String destZipFile) throws Exception{
    FileOutputStream fileWriter = new FileOutputStream(destZipFile);
    ZipOutputStream zip = new ZipOutputStream(fileWriter);
    zip.setMethod(Deflater.DEFLATED);
    zip.setLevel(ZipOutputStream.STORED);

    addFolderToZip(this.externalPath, "", zip);

    zip.finish();
    zip.close();
}


private void addFolderToZip(String externalPath, String folder, ZipOutputStream zip){
    File file = new File(externalPath);
    String files[] = file.list();

    for(String fileName : files){
        try {
            File currentFile = new File(externalPath, fileName);
            if(currentFile.isDirectory()){
                String outFile = externalPath + java.io.File.separator + fileName;          
                addFolderToZip(outFile, folder + java.io.File.separator + fileName, zip);
            } else {
                byte[] buffer = new byte[8000];
                int len;
                FileInputStream in = new FileInputStream(currentFile);
                zip.putNextEntry(new ZipEntry(folder + java.io.File.separator + fileName));
                while((len = in.read(buffer)) > 0){
                    zip.write(buffer, 0, len);
                }
                zip.closeEntry();
                in.close();
            }
        } catch (IOException e) {
                e.printStackTrace();
        }
    }
}

EDIT

这是我编写的代码,以便根据@edi9999 下面所说的内容使其正常工作。我创建了一个单独的类,我将对其进行扩展和添加,并可能进行一些清理,但这是工作代码。它将目录中的所有文件添加到 zip 文件中,并递归调用自身来添加所有子文件和文件夹。

private class Zip {
    private ZipOutputStream mZipOutputStream;
    private String pathToZipDestination;
    private String pathToFilesToZip;

    public Zip(String pathToZipDestination, String pathToFilesToZip) {
        this.pathToZipDestination = pathToZipDestination;
        this.pathToFilesToZip = pathToFilesToZip;
    }

    public void zipFiles() throws Exception{
        FileOutputStream fileWriter = new FileOutputStream(pathToZipDestination);
        this.mZipOutputStream = new ZipOutputStream(fileWriter);
        this.mZipOutputStream.setMethod(Deflater.DEFLATED);
        this.mZipOutputStream.setLevel(8);

        AddFilesToZip("");

        this.mZipOutputStream.finish();
        this.mZipOutputStream.close();
    }

    private void AddFilesToZip(String folder){
        File mFile = new File(pathToFilesToZip + java.io.File.separator + folder);
        String mFiles[] = mFile.list();

        for(String fileName : mFiles){
            File currentFile;
            if(folder != "")
                currentFile = new File(pathToFilesToZip, folder + java.io.File.separator + fileName);
            else
                currentFile = new File(pathToFilesToZip, fileName);
            if(currentFile.isDirectory()){
                if(folder != "")
                    AddFilesToZip(folder + java.io.File.separator + currentFile.getName());
                else
                    AddFilesToZip(currentFile.getName());
            } else {
                try{
                    byte[] buffer = new byte[8000];
                    int len;
                    FileInputStream in = new FileInputStream(currentFile);
                    if(folder != ""){
                        mZipOutputStream.putNextEntry(new ZipEntry(folder + java.io.File.separator + fileName));
                    } else {
                        mZipOutputStream.putNextEntry(new ZipEntry(fileName));
                    }
                    while((len = in.read(buffer)) > 0){
                        mZipOutputStream.write(buffer, 0, len);
                    }
                    mZipOutputStream.closeEntry();
                    in.close();
                } catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

我想我出了什么问题。

当我打开你的损坏的文件 https://dl.dropboxusercontent.com/u/30994479/Inspection.docx,并在 winrar 上打开它,我在文件夹的开头看到反斜杠,这很不寻常:

当我解压文件后重新压缩文件时,反斜杠不再存在,文件在 Word 中打开,所以我认为这应该是问题所在。

我认为这里的代码是错误的:

String outFile = externalPath + java.io.File.separator + fileName;  

应该

if (externalPath=="")
    String outFile = externalPath + fileName;  
else 
    String outFile = externalPath + java.io.File.separator + fileName;  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用压缩生成的损坏的 docx 的相关文章

  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • Android 中的 OpenGL 缩小

    我正在使用 3D 对象并渲染它并通过扩展 GLSurfaceView 实现渲染器来显示它 问题是如何通过捏合和捏合进行缩小 下面是我的班级 package com example objLoader import java nio Byte
  • Eclipse - 安装新的 JRE (Java SE 8 1.8.0)

    我正在尝试安装 Java 8 到目前为止我所做的 安装最新版本的 Eclipse 下载并安装 Java SE 运行时环境 8http www oracle com technetwork java javase downloads jre8
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • Spring Data JPA:查询如何返回非实体对象或对象列表?

    我在我的项目中使用 Spring Data JPA 我正在演奏数百万张唱片 我有一个要求 我必须获取各种表的数据并构建一个对象 然后将其绘制在 UI 上 现在如何实现我的 Spring 数据存储库 我读到它可以通过命名本机查询来实现 如果指
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 当目标小于 Android O 时,如何在 Android O 上创建快捷方式?

    背景 Android O 对快捷方式的工作方式进行了各种更改 https developer android com preview behavior changes html as https developer android com
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • fs-extra:源和目标不能相同。 (科尔多瓦)

    我在使用 cordova 构建时遇到错误 Error Source and destination must not be the same 构建系统 Ionic ionic cli 4 10 1 ionic framework ionic
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • Android-dispatchTouchEvent 给了我一个 StackOverflowError

    这里我有一个带有 setOnTouchListener 的 ViewFlipper 它工作得很好 然后我膨胀 ReLayNewsItem 然后将其添加到 ViewFlipper 现在我希望 WebView web 监听触摸事件并将它们传递给
  • 从文件路径显示图像视图?

    我需要仅使用文件名而不是资源 ID 来显示图像 ImageView imgView new ImageView this imgView setBackgroundResource R drawable img1 我在可绘制文件夹中有图像
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 错误:任务“:app:clean”执行失败。无法删除文件

    我正在尝试重建我的 Android Studio Gradle 项目 主要包含 Kotlin 代码 但它开始引发UnableToDeleteFileException在清洁 重建过程中 Execution failed for task a
  • 启动层java.lang.module初始化时出错。 FindException:找不到模块 javafx.controls [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试在 Intellij 2018 3 IDE 中构建示例 javaFX 应用程序 我已经安装了oracle JDK11 并
  • 了解与 .NET 的 HttpWebRequest 的 SSL 连接

    我似乎无法理解这个问题 我正在使用 HttpWebRequest 尝试将一些数据发送到另一个站点 我试图找出配置防火墙的最佳方法 但我不知所措 通过观察 NetMon 跟踪 它似乎忽略了我告诉它的内容 我看到从请求中发出的 HTTP 标头
  • leveldb-go 示例,文档

    LevelDB Go http code google com p leveldb go 是LevelDB在Go语言中的移植 LevelDB Go 通常被称为 Go 应用程序的本机替代方案 网站没有示例 也没有文档 我应该通过阅读源代码来学
  • 从基础到派生的“dynamic_cast”

    是的 我知道沮丧使用dynamic cast无法编译 如果Base不是多态的 但我的问题不是这个 class Base public virtual void bar cout lt lt bar n class Derived publi
  • Java 中的模块化:顶级类与嵌套类

    我读过的Java教程 喜欢使用嵌套类来演示一个概念 一个特性或用途 这导致我最初实现了一个我创建的示例项目 主活动类中有很多嵌套类 它可以工作 但现在我得到了一个巨大的整体 java 文件 我发现这有点不方便 我现在打算分解为多个 java
  • 如何查明哪些inotify 手表已注册?

    我将 inotify 监视限制设置为 1024 我认为默认值是 128 尽管如此 yeoman Guard 和 Dropbox 不断失败 并告诉我提高 inotify 限制 在此之前 我想知道是什么消耗了我所有的手表 我的 Dropbox
  • 如何使用带模板的结构和类

    使用此代码 只是一类测试 typedef unsigned short UInt16 template
  • 获取 Java 中自纪元以来的天数、周数和月数

    我正在尝试获取自 Java 纪元以来的天数 周数 月数 Java Calendar 类提供了诸如calendar get Gregorian Calendar DAY OF YEAR 或Calendar get Gregorian Cale
  • 在 iPhone 应用程序中记录调试信息的最佳方法是什么?

    是否有某种标准方法或有人写过一些东西 允许您记录消息并将其显示在 iPhone 屏幕上的小滚动部分或 iPhone 模拟器中的单独窗口中 更新 对于像我这样不知道的菜鸟 请使用如下所述的 NSLog 方法 并确保选择 Run gt Cons
  • Unicorn 不关闭数据库连接

    我正在使用 Rails 3 2 unicorn postgres DB 我有一个问题 unicorn 如何处理数据库连接 我的理解是 unicorn主进程分叉X子进程 每个子进程建立数据库连接 在before fork中关闭 在after
  • uitableview + 导航控制器从所选元素设置标题

    我有一个UINnavigationController处理导航UITableView 当我从表中选择一行时 我需要显示在UINavigationController为上一个菜单中选定的项目添加标题 细胞的标签是从外部读取的xml填充的行UI
  • 在搜索表单中 POST 或 GET?

    我创建了一个搜索表单来查找 MVC 网站上的帖子 表单类型应该是 POST 还是 GET 我知道正在获取可以为搜索添加书签等等 使用 GET 有什么缺点吗 谢谢你 米格尔 虽然GET是更传统的数据查询解决方案 在很多情况下GET太有限 无法
  • 刚刚从 IPython 提示符安装后出现“没有名为 sqlalchemy 的模块”

    我无法导入 sqlalchemy 我搜索并发现了一些解决方案 例如安装flask或flask sqlalchemy等 这些都没有帮助 我缺少什么 有时 您需要重新启动ipython让它找到新安装的模块 我相信这适用于添加到的模块sys pa
  • 您的CPU不支持VT-x

    我已经创建了 AVD 但是当我尝试运行 android 程序时 它显示 错误 您的CPU不支持VT x 我在 BIOS 中启用了虚拟化技术 但当我尝试运行 Android 程序时仍然出现此错误 有两种情况 使用VMware 进入 WM gt
  • 部分回发后 jQuery 不工作

    我在外部文件中有下面这个 jquery 函数 因此 在部分回发后 jquery 无法正常工作 我需要在部分回发时从服务器端加载 jquery 有人可以告诉我我需要在这段代码中调用什么以及如何加载jquery jQuery function
  • 获取 Domino 服务器会话超时 - XPage

    如何在 XPages SSJS 中获取 Domino 服务器的会话超时 我想提示用户在会话过期之前保存他 她的数据 谢谢 仅当用户向服务器发出请求时 服务器才与用户通信 因此 如果用户没有请求 服务器就无法向用户发送信息 例如 用户从服务器
  • 如何在 Android 运行时更改当前主题 [重复]

    这个问题在这里已经有答案了 我创建了一个 PreferenceActivity 允许用户选择他想要应用于整个应用程序的主题 当用户选择主题时 将执行以下代码 if getApplication setTheme R style BlackT
  • 如何在 Azure 应用服务中插入具有 1:n 关系的实体

    我需要使用 Azure 应用服务建立 1 n 关系 我按照这个教程 http shellmonger com 2016 05 27 30 days of zumo v2 azure mobile apps day 26 relationsh
  • 使用压缩生成的损坏的 docx

    首先我要说的是 我在这里创建了一个帐户 因为为了尝试解决这个问题 我一直在用头撞墙 所以就这样吧 另外 我已经看到这个问题了here https stackoverflow com questions 13566468 how to com