我正在尝试在 macOS Mojave 10.14.5 上手动编辑嵌入的 powerpoint 工作簿(作为稍后使用 STATA 和/或 Bash 自动化该过程的测试)。
我的流程是这样的:
在航站楼:
zip -r rezip1/PresentationName.pptx PresentationName.pptx -x "*.DS_Store"
新的 .pptx 文件将在指定的文件夹中创建。从这里开始,我期望 Powerpoint 能够正常打开,我的新更改会反映在嵌入式工作簿中。
相反,我收到两个错误:
PowerPoint 发现PresentationName.pptx 中的内容存在问题。 PowerPoint 可以尝试修复演示文稿。如果您信任此演示文稿的来源,请单击“修复”。
单击修复后,
抱歉,PowerPoint 无法读取PresentationName.pptx。
我猜测基于终端的拉链压缩了不正确的文件类型/结构,但不确定是否是这种情况,并希望有人在这里取得一些成功。
感谢您的阅读,并对我可能提出的任何愚蠢问题/格式错误表示歉意。
压缩位于解压缩内容的根文件夹中时可以工作(并且排除 .DS_Store,就像您已经在做的那样)。解压和压缩演示文稿的完整示例,生成名为
PresentationName-repacked.pptx
的正确文件:
mkdir PresentationName
cp PresentationName.pptx PresentationName/
cd PresentationName
unzip PresentationName.pptx
rm PresentationName.pptx
zip -vr ../PresentationName-repacked.pptx ./ -x "*.DS_Store"
这里有两个用于在 Mac 上解压和打包 PowerPoint 文件的 shell 脚本:
解压-pptx.sh
#!/usr/bin/env bash
# Usage: ./unpack-pptx.sh PresentationName.pptx
NAME="${1/.pptx/}"
set -e
set -x
mkdir "$NAME"
cp "$NAME".pptx "$NAME"/
cd "$NAME"
unzip "$NAME".pptx
rm "$NAME".pptx
exit 0
pack-pptx.sh
#!/usr/bin/env bash
# Usage: ./pack-pptx.sh PresentationName.pptx
# Note: Expects the unpacked directory (created with unpack-pptx.sh) to be available
NAME="${1/.pptx/}"
set -e
set -x
cd "$NAME"
zip -vr ../"$NAME"-repacked.pptx ./ -x "*.DS_Store"
exit 0
重新压缩 OOXML 文件很棘手。我已经成功地在不创建 .DS_Store 文件的外部硬盘上工作。在航站楼:
defaults write com.apple.desktopservices DSDontWriteNetworkStores true
此外,macOS Archive 实用程序也永远不会生成可用的 OOXML 文件。在终端中使用 zip 应该可以解决这个问题。
对于非编程编辑,BBEdit 11 或更高版本可以直接处理 OOXML 文件,而无需解压缩它们。 Chrome 的 OOXML Tools 插件也可以做到这一点,而且是免费的。
使用Python,你可以这样做:
import zipfile
import os
def unpack_pptx(pptx_file):
name = os.path.splitext(pptx_file)[0]
os.makedirs(name, exist_ok=True)
pptx_copy = os.path.join(name, pptx_file)
with open(pptx_file, 'rb') as src, open(pptx_copy, 'wb') as dst:
dst.write(src.read())
with zipfile.ZipFile(pptx_copy, 'r') as zip_ref:
zip_ref.extractall(name)
os.remove(pptx_copy)
unpack_pptx('pptx_file.pptx')
import zipfile
def pack_pptx(directory, output_path=None):
if output_path is None:
name = os.path.basename(directory)
output_path = f"{name}.pptx"
with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zip_ref:
for root, _, files in os.walk(directory):
for file in files:
if file != ".DS_Store":
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, directory)
zip_ref.write(file_path, arcname)
pack_pptx('pptx_file', 'output_path.pptx')