gpt4 book ai didi

java - 使用压缩生成损坏的 docx

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:49 24 4
gpt4 key购买 nike

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

另外,这个问题我已经看过了here.这些答案都没有帮助,我都试过了。

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

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

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

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

这是我的一些代码:

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

编辑

这是我根据 @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();
}
}
}
}
}

最佳答案

我想我有什么问题。

当我打开你的corrupted File , 然后在 winrar 上打开它,我在文件夹的开头看到了反斜杠,这是不寻常的:

Content of the corrupted Zip

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

Content of the corrected Zip

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

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

应该是

if (externalPath=="")
String outFile = externalPath + fileName;
else
String outFile = externalPath + java.io.File.separator + fileName;

关于java - 使用压缩生成损坏的 docx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com