{"id":13928685,"url":"https://github.com/maxonthegit/PPspliT","last_synced_at":"2025-07-19T10:31:50.006Z","repository":{"id":37353693,"uuid":"231770275","full_name":"maxonthegit/PPspliT","owner":"maxonthegit","description":"A PowerPoint add-in that splits slides according to slideshow-time animation effects","archived":false,"fork":false,"pushed_at":"2024-04-19T19:39:39.000Z","size":42715,"stargazers_count":284,"open_issues_count":2,"forks_count":6,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-08-08T18:19:44.960Z","etag":null,"topics":["powerpoint-add-in","powerpoint-automation","powerpoint-vba"],"latest_commit_sha":null,"homepage":"https://www.maxonthenet.altervista.org","language":"VBA","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxonthegit.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.txt","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2020-01-04T13:42:22.000Z","updated_at":"2024-07-22T15:31:51.000Z","dependencies_parsed_at":"2024-03-13T23:28:45.196Z","dependency_job_id":"06407cfa-c830-40e0-bc6a-0f1f80210e9a","html_url":"https://github.com/maxonthegit/PPspliT","commit_stats":null,"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxonthegit%2FPPspliT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxonthegit%2FPPspliT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxonthegit%2FPPspliT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxonthegit%2FPPspliT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxonthegit","download_url":"https://codeload.github.com/maxonthegit/PPspliT/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226588793,"owners_count":17655787,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["powerpoint-add-in","powerpoint-automation","powerpoint-vba"],"created_at":"2024-08-07T18:01:16.763Z","updated_at":"2024-11-26T17:30:51.482Z","avatar_url":"https://github.com/maxonthegit.png","language":"VBA","funding_links":[],"categories":["VBA"],"sub_categories":[],"readme":"```\n    _____  _____           _ _ _______\n   |  __ \\|  __ \\         | (_)__   __|\n   | |__) | |__) |__ _ __ | |_   | |\n   |  ___/|  ___/ __| '_ \\| | |  | |\n   | |    | |   \\__ \\ |_) | | |  | |\n   |_|    |_|   |___/ .__/|_|_|  |_|\n                    | |\n                    |_|  by Massimo Rimondini\n```\nPPspliT is a PowerPoint add-in that transforms each slide of a presentation into\na sequence of slides, each displaying the contents of the original slide as they\nwould appear at every intermediate animation step. As such, its most natural\ncontext of application is to produce a redistributable version of a presentation\nin a _flat_ file format like PDF.\n\nTo some extent, PowerPoint already provides export functions that are meant to\ninclude animations in the target file (e.g., it can export a presentation as a\nvideo). However, to my knowledge, a true conversion of existing slides into an\nequivalent sequence of static (i.e., animation-less) slides that is suitable for\nprinting or PDF export has never been natively offered by PowerPoint. PPspliT\ntries to fill this gap.\n\n----\n* [Features](#features)\n* [Usage](#usage)\n* [Building](#building)\n  * [Prerequisites](#prerequisites)\n  * [Packaging for Windows](#packaging-for-windows)\n  * [Packaging for MacOS](#packaging-for-macos)\n* [Known limitations](#known-limitations)\n* [Manual installation](#manual-installation)\n* [References](#references)\n* [Acknowledgments](#acknowledgments)\n* [Troubleshooting](#troubleshooting)\n----\n\n## Features\n* **User experience**\n  * Fully integrated with PowerPoint: it is natively implemented in Visual Basic\n  for Applications (VBA).\n  * Adds a new tab in PowerPoint's native ribbon toolbar (or dedicated toolbar\n  for PowerPoint releases prior to 2007): splitting slides is a one-click task.\n  * Can operate on a range of selected slides or on the whole presentation, if no\n  slides are selected.\n* **Capabilities**\n  * Supports all entry, emphasis, exit and motion path effects applied to slide\n  shapes (with some caveats, see below).\n  * Supports \"Rewind when done playing\", \"Hide on next mouse click\" and\n  \"Auto-reverse\" effect flags, as well as reversed motion paths.\n  * Can split slides at every click-triggered animation effect (like it would\n  happen during a slideshow) or at each and every animation effect (useful to\n  preserve multiple intermediate animations that are played without any speaker\n  interaction).\n  * Updates [custom\n  slideshows](https://support.microsoft.com/en-gb/office/create-and-present-a-custom-show-09d4d340-3c47-4125-b177-0de3be462c5d)\n  by replacing each slide with those that result from splitting it. Custom\n  slideshows are actually named sequences of slides from the full deck and,\n  besides being used at presentation time, they can also be selected as\n  predefined slide ranges when printing. Therefore, this feature can be\n  exploited to conveniently export (by printing to PDF) slide subsequences that\n  are predefined in the form of custom slideshows.\n  * Can optionally preserve slide numbers during splitting: if slide footers\n  contain text frames with dynamically computed slide numbers, these can be\n  overwritten so that numbers in all the slides resulting from splitting a single\n  original slide match its original slide number.\n  * Operates with native PowerPoint shapes: the slides produced after the split\n  are derived from the original presentation and still contain editable shapes.\n  * Format-agnostic: since the final product is still a slide deck, you can\n  export it to any document format for which you have a virtual printer or file\n  converter installed. PDF is implicitly supported, as PowerPoint has been\n  including an export function to this format for a few years now.\n\nSome examples displaying the operation of the add-in can be found in the\n[project home page][Home page].\n\n\n## Usage\nSimply click on the \"Split animations\" button of the PPspliT toolbar.\nUsing the appropriate checkboxes on the same toolbar, you can choose to split\nslides on animation effects that are triggered by a mouse click (most common\nusage) or just every animation effect (this may be especially slow). You can\nalso choose to preserve slide numbers during the split.\n\n[Usage instructions](PPspliT-howto.pdf) are also available.\n\n*Notice*: in all releases older than 2.0 the add-in makes heavy use of the\nsystem clipboard. Therefore, it is very important that you refrain from using it\nduring the split and that no programs interfere with the clipboard at all.\nEffective since release 2.0, this requirement has been relaxed, and the system\nclipboard can be safely used while a slide deck is being split.\n\n**Warning**: running the add-in will modify your presentation. Even though it is\ngenerally possible to revert the changes using the undo feature (Ctrl+Z), it is\nstrongly advised to work on a copy of the original slide deck to avoid losing\nyour work by accidentally overwriting it with the split presentation.\n\nIt may take a while for the split process to complete. If you are wondering\n1. why so much code and\n2. why does it take so long to split animations\n\nhere are some hints:\n* PowerPoint applies slideshow effects to rasterized versions of the shapes.\nInstead, in PPspliT the same effects are re-implemented on the original shape\nobjects.\n* VBA has some sparse bugs here and there, which allow limited or no access to\nshape properties. I needed to work these around to my best.\n* Each animation step requires creating a new slide, which is time consuming.\n* For each animation step, all the shapes that are supposed to appear later on\nby means of a subsequent entry effect or to have disappeared because of a\npreceding exit effect must be appropriately removed.\n\n\n----\n\n## Building\nAs PPspliT is implemented as a VBA macro inside PowerPoint, there is no true\n_build_ procedure. The source code is embedded in PowerPoint binary files that\nare saved as native PowerPoint add-ins: this is also the reason why changes are\ntracked in separate files (e.g., [PPspliT.bas](src/PPT12+/PPspliT.bas)). \\\nThe only step that requires _building_ is the generation of distributable\ninstallers.\n\n### Prerequisites\n* Windows\n  * [Nullsoft Scriptable Install System (NSIS)](https://sourceforge.net/projects/nsis/)\n  * [Office 2007 Custom UI editor](http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2009/08/07/7293.aspx) -- As of June 2020, the link seems broken: you may try using the [Office RibbonX Editor](https://github.com/fernandreu/office-ribbonx-editor) instead.\n* MacOS\n  * Script Editor (ships natively with MacOS)\n\n### Packaging for Windows\n* Edit the VBA macro inside `PPT12+\\PPspliT.pptm` as needed, then prepare the\nfile as follows:\n  * Update the release number if required (also in the about dialog box).\n  * Save the file (`PPspliT.pptm`).\n  * Export each module from the Visual Basic for Applications editor into\n  corresponding `.bas`, `.frm` and `.frx` files.\n  * Export the whole file as a PowerPoint add-in (`PPspliT.ppam`).\n  * Open `PPspliT.pptm` using the Office 2007 Custom UI Editor or the Office\n  RibbonX Editor, update the release number if required, and save the file.\n  * Do the same for `PPspliT.ppam`.\n* Apply consistent changes to file `PPT11-\\PPspliT.ppt`, save it, export each\nmodule and export the whole PPT file as a PowerPoint 97-2003 add-in (`PPspliT.ppa`).\n* Edit file `ppsplit_installer.nsi` to refresh the release number if required.\n* Process file `ppsplit_installer.nsi` through NSIS (usually it is enough to\nright-click on the file and select \"Compile NSIS script\"). File `PPspliT-setup.exe`\nshould then be generated in the parent folder.\n\n### Packaging for MacOS\n* Apply changes to `PPspliT.pptm` and export it as PowerPoint add-in `PPspliT.ppam`\nas described above for the Windows case.\n* Open file `MacOS/PPspliT for MacOS/Install PPspliT.app` using Apple's Script\nEditor.\n* Refresh resource `PPspliT.ppam` inside the script by dragging and dropping the\nupdated `PPspliT.ppam` inside the Script Editor.\n* Save the installer and close the Script Editor.\n* Open a Terminal window and run script `MacOS/PPspliT for MacOS/build_macos_dmg.sh`\nto generate file `PPspliT.dmg`.\n\n----\n\n## Known limitations\nYes, the list is apparently long, but please look carefully through it because\nit consists mostly of corner cases.\n* PPspliT does not offer any PDF conversion functions: it is not meant to. It\njust processes a presentation to split animations, then it is up to your\nfavorite PDF generation software or PowerPoint's native PDF export function to\ngenerate the final PDF (or whatever other document format).\n* PPspliT does not preserve animation effects: the slide deck resulting from a\nsplit accurately renders the status of the slideshow at each intermediate\nanimation step, but every slide is cleared of all animation effects. This means\nthat you cannot have \"moving shapes\" in your final _flat_ (PDF) document. Even\nif animations were preserved in the slides, embedding them in the final document\nwould require advanced processing functions for every possible output document\nformat, which is out of the scope of PPspliT, and would lead to much less\nportable documents.\n* All of the add-in features are implemented for all PowerPoint versions, but\nminor glitches may exist with versions prior to 2007, sometimes due to VBA\nlimits or bugs.\n* Some functions are knowingly unsupported and may never be implemented:\n1. *Slide transitions*\n\u0026mdash; Since they are meant to smoothen slide changes, they have no\npersistent effects on their contents, hence no action that needs to be\nrendered by PPspliT.\n\n2. *Shape dimming after playing an effect*\n\n3. *Most effects/actions triggered by mouse clicks on a specific shape*\n\u0026mdash; As an exception, cross-slide hyperlinks *are* supported: their targets\nare updated to point to the originally meant slides even after they have\nbeen renumbered by the split. Slide previews using the\n[zoom feature](https://support.microsoft.com/en-us/office/use-zoom-for-powerpoint-to-bring-your-presentation-to-life-9d6c58cd-2125-4d29-86b1-0097c7dc47d7)\nare *not* supported anyway, meaning that they may become broken after splitting.\n\n4. *The shaking and blinking emphasis effects*\n\u0026mdash; This is due to a PowerPoint bug.\n\n5. *Effects applied to individual shapes of composite objects (SmartArt, charts)*\n\u0026mdash; To my knowledge, the interface exposed by VBA to alter the properties of\nsuch shapes is somewhat limited. For example, a position property like\n`Selection.ShapeRange(1).SmartArt.Nodes(1).Shapes(1).Left` is read-only, and\nmethods like `ScaleHeight` or `Cut` affect the whole SmartArt object despite\nbeing applied to its individual shapes. Shape groups *are* of course supported.\n\n6. *For emphasis effects, repetition and \"Until next click\" duration*\n\u0026mdash; The *duration* parameter of emphasis effects normally indicates the\ntime that it takes to play the effect until its end. For very few effect\ntypes, this same setting indicates the time for which the effect persists\non its target shape instead. Effects that are not persistent (i.e., they\nhave an established duration in seconds) are simply ignored by PPspliT. Any\nother emphasis effects are assumed to last until the end of the slide (or\nuntil a subsequent effect is applied to the same slide). This means that\nemphasis effects that last \"until next click\" are *not* supported and are\nhandled in the same way as effects that last \"until end of slide\".\nOn the other hand, the *repeat* setting allows to loop the effect's action\nfor an established number of iterations or, alternatively, until the next mouse\nclick or the end of the current slide. Since effect loops don't have any\nmeaningful outcome on a statically rendered slide, PPspliT simply ignores\nthis setting and assumes that all emphasis effects are applied once (i.e.,\nwithout loops).\n\n7. *Accurate rendering of color effects*\n\u0026mdash; PowerPoint implements color change effects in a way that is honestly\nhard for me to reverse engineer. PPspliT approximates these effects but the\nfinal applied color may not perfectly coincide with the one natively applied\nby PowerPoint.\n\n8. *Many emphasis and motion effects that apply to a single text paragraph\ninstead of a whole shape*\n\u0026mdash; In general, all those effects whose rendering requires separation of\nthe text frame from its parent shape are unlikely to be supported.\n\n9. *Rasterized shape scaling and non-proportional text resizing*\n\u0026mdash; PowerPoint applies any effects to rasterized versions of the shapes. As\na consequence, grow/shrink effects affect all the elements of a shape\n(including, e.g., shape border thickness) and not necessarily preserve the\naspect ratio. PPspliT resizes the native shape instead, thus preserving its\ncomponents (including border thickness) and resulting in a sharper rendering,\nbecause the native vector shapes are preserved and there is no interpolation\nintroduced by resizing or rotation effects. While this is generally welcome,\nthe final result may sometimes differ from the intended one. Most evidently,\nPPspliT only supports proportional growing/shrinking of text elements:\nif a grow/shrink effect occurs on a text element and is set to only affect it\nvertically or horizontally, PPspliT renders it by adjusting the font size by\nan amount that is a good compromise between horizontal and vertical growth/shrink,\nbut no \"compression\" or \"expansion\" of the text occurs.\n\n10. *Accurate rendering of some rotation effects*\n\u0026mdash; When a slide show is played, PowerPoint rotates shapes around the\ncenter of the visible shape body. Instead, PPspliT rotates them around the\ncenter of the container box. Sometimes the container box may be larger than the\nvisible shape, resulting in a different center of rotation being applied. To\nexplain the difference, consider an arc, whose container box is the rectangle\n(or, possibly, square) that encloses the full circle: at slideshow time\nPowerPoint can rotate the arc around the center of the arc stroke itself,\nwhereas PPspliT would rotate it around the center of the container box: since\nthe latter is generally (much) larger than the visible arc, the final\nimpression is that the visible shape (the arc) has \"wandered around\".\n\n11. *Exit/entry effects applied to shapes that are part of a slide layout are only\npartially supported*\n\u0026mdash; In fact, these shapes are turned into placeholders (instead of\ndisappearing altogether) when one attempts to delete them. While this is not an\nissue in the vast majority of cases, if such placeholders have a formatting\napplied (e.g., a background color) they may stay visible even when they are not\nexpected to.\n\n12. *Adjustment of slide numbers on a PPTX file that is imported into PowerPoint\n\u003c=2003 using the Microsoft Office Compatibility Pack*\n\u0026mdash; This is a very old special condition and is never expected to occur.\n\n13. *Adjustment of (dynamic) slide numbers that appear in standard text boxes*\n\u0026mdash; Although dynamically updated slide numbers can be inserted in any text\nparagraph, PPspliT is only able to adjust them (i.e., preserve a numbering that\nis coherent with the one of the original slides even after splitting) if such\nnumbers appear in special placeholder boxes defined in slide masters and\ninserted as headers/footers in the slide deck.\n\n14. *Animations in slide masters*\n\n15. *Animation effects whose order is strictly dependent on timing*\n\u0026mdash; Animation effects can be played after a mouse click (\"on click\"), after\nthe preceding effect has ended (\"after previous\") or at the same time as a\npreceding effect (\"with previous\"). While ordering of the effect outcomes is\nstrictly defined in the first two cases, it may depend on timing in the third\ncase. For example, if effect B follows effect A in the animation sequence, both\neffects are set to play \"with previous\" but effect A has a *delay* set to 1\nsecond whereas effect B has no delay, effect B is played before effect A.\nPPspliT does not consider this kind of reordering, and assumes that effects are\nalways played in the same order in which they appear in the animation sequence.\n\n16. *Something else I am not aware of*\n\n---\n\n## Manual Installation\nPPspliT comes packaged with an installer which eases setup by means of a\nconvenient wizard. The installer is tuned to operate in many different typical\nconfigurations (as a sole exception, security features in recent releases of\nmacOS may require following specific [(un)installation\ninstructions](https://www.maxonthenet.altervista.org/downloads/PPspliT/PPspliT-macOS-howto.pdf)).\nHowever, in the unlikely case in which it fails, you can still attempt a\nmanual installation by following the procedure below.\n\n\n1. Download the latest [PPspliT macro file](https://github.com/maxonthegit/PPspliT/raw/master/src/PPT12%2B/PPspliT.ppam)\nand save it to a location of your choice.\nAs an alternative, download the latest [Windows installer file][Home page]\n(even if you are using macOS), open it with your favorite Zip unpacker (do _not_ start the installer),\nfind file `PPspliT.ppam` inside the archive and save it to a location of your choice.\n\n\n\n2. Start PowerPoint.\n3. Add the downloaded `PPspliT.ppam` as a PowerPoint add in as described at\t https://support.microsoft.com/en-us/office/add-or-load-a-powerpoint-add-in-3de8bbc2-2481-457a-8841-7334cd5b455f,\nnamely:\n\n* In case you are using PowerPoint for Windows:\n\n4. Click the _File_ tab, then _Options_.\n5. In the _Options_ dialog box, click _Add-Ins_.\n6. In the _Manage_ list at the bottom of the dialog box, click _PowerPoint Add-ins_,\nthen click _Go_.\n7. In the _Add-Ins_ dialog box, click _Add New_.\n8. In the _Add New PowerPoint Add-In_ dialog box, browse for the previously saved\n`PPspliT.ppam` file and then click _OK_.\n9. A security notice might appear. In this case, click on _Enable Macros_ and\nthen click _Close_.\n\n* If, instead, you are using PowerPoint for macOS:\n\n4. Open the _Tools_ menu on the top bar (i.e. not the PowerPoint ribbon toolbar,\nbut rather the macOS menu bar at the top of the screen) and select _PowerPoint add ins_.\n5. Click on _+_ and select file `PPspliT.ppam` that you saved above.\n\nNote that,even when this issue occurs, the installer should have already\ntaken care of copying the required files to a proper location in your system\n(usually `%APPDATA%\\Microsoft\\AddIns\\PPspliT` for Windows systems, and\n`$HOME/Library/Group\\ Containers/UBF8T346G9.Office` for macOS systems).\nTherefore, the steps for unpacking and saving file `PPspliT.ppam` described above\ncan be skipped.\n\n\n---\n\n## References\n* [Project home page][Home page]\n* At the time of first sketching the add-in code, I used [this blog post by Neil\nMitchell](http://neilmitchell.blogspot.com/2007/11/creating-pdf-from-powerpoint-with.html)\nand [its follow-up](https://neilmitchell.blogspot.com/2007/11/powerpoint-pdf-part-2.html) as greatly inspirational starting points.\n\n## Acknowledgments\nAlthough I am the only developer of the add-in, several suggestions for\nimprovements and bug fixes came in the form of feedback from its end users. Some\nof them are acknowledged in the [changelog](CHANGES.txt).\n\n----\n\n# Troubleshooting\n\n_The add-in is splitting only the first slide instead of the whole slide deck._\n\nMaybe you have accidentally selected the first slide in the left-side thumbnail\npane of PowerPoint. Just try clicking anywhere in the main pane of\nPowerPoint (i.e., the slide editor) and try PPspliTting again.\n\n---\n\n_The (Windows) installer fails to recognize any PowerPoint releases (error\nmessage \"the add in has been left unconfigured\")._\n\nThis may happen, for example, when a pre installed OEM PowerPoint release is\nbeing used. There is not much that can be done to address this issue, as\nspecially packed PowerPoint releases may be harder to detect for the installer\nand the effort to improve its recognition capabilities exceeds the user\nreported impact of this problem. However, you can still work around this little\nproblem by performing a [manual installation](#manual-installation).\n\n---\n\n_Error \"Macro cannot be found or has been disabled because of security\" is\ndisplayed every time a split is attempted._\n\nAs an outdated but, possibly, still valid explanation, a [security update\nreleased by Microsoft](http://support.microsoft.com/kb/2598041/en-us\") around\nApril 2012 may cause this issue with most VBA-based applications that make use\nof dialog boxes, including PPspliT. To correct this problem, Microsoft suggests\ndeleting cached versions of control type libraries, which is harmless for your\nsystem. I can confirm that this solution has worked for me. Basically, you have\nto delete all `.exd` files stored in `%HOMEPATH%\\Application\nData\\Microsoft\\Forms` and `%TEMP%\\VBE`. Please rely on the official instructions\nfrom Microsoft, which can be found in the page mentioned above. \\\nIf this does not solve your problem, then either you are still using a really\noutdated PPspliT release (1.5 was known to have such compatibility problems) or\nyour macro security settings may need to be reviewed.\n\n\n\n\n[Home page]: http://www.maxonthenet.altervista.org/ppsplit.php\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxonthegit%2FPPspliT","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxonthegit%2FPPspliT","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxonthegit%2FPPspliT/lists"}