Skip to content

Instantly share code, notes, and snippets.

@lbr77
Created November 1, 2025 02:59
Show Gist options
  • Select an option

  • Save lbr77/1313d086f09ef5eda9e14265598ce676 to your computer and use it in GitHub Desktop.

Select an option

Save lbr77/1313d086f09ef5eda9e14265598ce676 to your computer and use it in GitHub Desktop.
beamer2pptx
#!/bin/bash
# Modified pdf2pptx.sh — confined to $workdir
resolution=1024
density=300
colorspace="-colorspace sRGB -background white -alpha remove"
makeWide=true
template_tar="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" # 保留原始模板base64
if [ $# -eq 0 ]; then
echo "Usage: ./pdf2pptx.sh file.pdf [notwide]"
exit 1
fi
# --- Create isolated workspace
orig_dir=$(pwd)
workdir=$(mktemp -d)
cd "$workdir" || exit 1
echo "[*] Working in $workdir"
# --- Extract built-in template
echo "$template_tar" | base64 -d | tar -xzf -
# --- Handle widescreen flag
if [ $# -eq 2 ] && [ "$2" == "notwide" ]; then
makeWide=false
fi
# --- Prepare input
infile="$orig_dir/$1"
echo "[*] Processing file: $infile"
cp "$infile" "$workdir/input.pdf"
tempname="$workdir/slides"
mkdir "$tempname"
# --- Count pages
set -o pipefail
n_pages=$(identify "$workdir/input.pdf" | wc -l) || {
echo "Unable to count number of PDF pages"
exit 1
}
if [ "$n_pages" -eq 0 ]; then
echo "Empty PDF"
exit 1
fi
# --- Convert pages to PNG
echo "[*] Extracting $n_pages pages..."
for ((i=0; i<n_pages; i++)); do
convert -density "$density" $colorspace -resize "x${resolution}" \
"$workdir/input.pdf[$i]" "$tempname/slide-$i.png" || exit 1
done
echo "[+] Extraction done."
# --- Prepare PPTX structure
pptbase="$workdir/pptx_build"
fout="$orig_dir/$(basename "$1").pptx"
cp -r "$workdir/template" "$pptbase"
mkdir -p "$pptbase/ppt/media"
cp "$tempname"/*.png "$pptbase/ppt/media/"
# --- Helper functions
function call_sed {
if sed --version >/dev/null 2>&1; then
sed -i"" "$@"
else
sed -i "" "$@"
fi
}
function add_slide {
local id=$1
local rels="../_rels/presentation.xml.rels"
local types="../../[Content_Types].xml"
local pres="../presentation.xml"
local rid=$((id+8))
local sid=$((id+256))
call_sed "s/slide1\\.xml\"\\/>/&<Relationship Id=\"rId${rid}\" Type=\"http:\\/\\/schemas.openxmlformats.org\\/officeDocument\\/2006\\/relationships\\/slide\" Target=\"slides\\/slide-${id}.xml\"\\/>/g" "$rels"
call_sed "s/slide1\\.xml\" ContentType=\"application\\/vnd\\.openxmlformats-officedocument\\.presentationml\\.slide+xml\"\\/>/&<Override PartName=\"\\/ppt\\/slides\\/slide-${id}.xml\" ContentType=\"application\\/vnd\\.openxmlformats-officedocument\\.presentationml\\.slide+xml\"\\/>/g" "$types"
call_sed "s/<p:sldIdLst>/&<p:sldId id=\"${sid}\" r:id=\"rId${rid}\"\\/>/g" "$pres"
}
function make_slide {
local slide=$1
cp ../slides/slide1.xml ../slides/slide-${slide}.xml
sed "s/image1\\.JPG/slide-${slide}.png/g" ../slides/_rels/slide1.xml.rels > ../slides/_rels/slide-${slide}.xml.rels
add_slide "$slide"
}
# --- Generate slides
pushd "$pptbase/ppt/media" >/dev/null
count=$(ls -1 | wc -l)
for ((slide=count-1; slide>=0; slide--)); do
echo "Generating slide $slide"
make_slide "$slide"
done
popd >/dev/null
# --- Adjust to widescreen
if [ "$makeWide" = true ]; then
pat='<p:sldSz cx=\"9144000\" cy=\"6858000\" type=\"screen4x3\"\/>'
wscreen='<p:sldSz cy=\"6858000\" cx=\"12192000\"\/>'
call_sed "s/${pat}/${wscreen}/g" "$pptbase/ppt/presentation.xml"
fi
# --- Zip as pptx
pushd "$pptbase" >/dev/null
zip -q -r "$fout" .
popd >/dev/null
echo "[+] Generated: $fout"
# --- Cleanup
rm -rf "$workdir"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment