在 mac 上将 powerpoint 文件夹重新压缩为 pptx 时出错

问题描述 投票:0回答:3

我正在尝试在 macOS Mojave 10.14.5 上手动编辑嵌入的 powerpoint 工作簿(作为稍后使用 STATA 和/或 Bash 自动化该过程的测试)。

我的流程是这样的:

  1. 将已完成的 Powerpoint(PresentationName.pptx)重命名为 .zip
    1. 使用Unarchiver解压PresentationName.pptx.zip(成功!)
    2. 浏览文件夹结构以编辑 Excel 嵌入工作簿中的一些数字
    3. 尝试重新压缩(使用上下文菜单“压缩”或终端)
    4. 尝试打开PresentationName.pptx(错误)

在航站楼:

zip -r rezip1/PresentationName.pptx PresentationName.pptx -x "*.DS_Store"

新的 .pptx 文件将在指定的文件夹中创建。从这里开始,我期望 Powerpoint 能够正常打开,我的新更改会反映在嵌入式工作簿中。

相反,我收到两个错误:

PowerPoint 发现PresentationName.pptx 中的内容存在问题。 PowerPoint 可以尝试修复演示文稿。如果您信任此演示文稿的来源,请单击“修复”。

单击修复后,

抱歉,PowerPoint 无法读取PresentationName.pptx。

我猜测基于终端的拉链压缩了不正确的文件类型/结构,但不确定是否是这种情况,并希望有人在这里取得一些成功。

感谢您的阅读,并对我可能提出的任何愚蠢问题/格式错误表示歉意。

macos powerpoint
3个回答
6
投票

压缩位于解压缩内容的根文件夹中时可以工作(并且排除 .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

1
投票

重新压缩 OOXML 文件很棘手。我已经成功地在不创建 .DS_Store 文件的外部硬盘上工作。在航站楼:

defaults write com.apple.desktopservices DSDontWriteNetworkStores true

此外,macOS Archive 实用程序也永远不会生成可用的 OOXML 文件。在终端中使用 zip 应该可以解决这个问题。

对于非编程编辑,BBEdit 11 或更高版本可以直接处理 OOXML 文件,而无需解压缩它们。 Chrome 的 OOXML Tools 插件也可以做到这一点,而且是免费的。


0
投票

使用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')

© www.soinside.com 2019 - 2024. All rights reserved.