As I have been speaking at a number of events recently I also have been updating my GitHub Events repository. Usually I include a markdown file with a short description, my demos and my slides. I had been uploading my files as .pptx and I noticed that the repository edged over 100 MB. This prompted me into reconsidering this approach, I felt I needed to address the following:

Use the most compatible format available, presentations should be viewable on any device

Fonts should be correctly represented

File size should be minimal

In an effort to more efficiently use the space I have available and to use a more compatible format I decided to convert my presentations to .pdf.

Because I do not like doing stuff manually I decided to use PowerShell in combination with a bit of bash scripting to get my repository updated. First lets take a look what kind of data we are dealing with:

1 2 Get-ChildItem C:\git\Events -File - Filter * pptx -Recurse | Select-Object -Property FullName Get-ChildItem C:\git\Events -File -Filter *pptx -Recurse | Select-Object -Property FullName

In total 29 presentations uploaded in .pptx format, if I would have to convert these by hand it would take about 30 minutes. Taking a look at what is possible with the PowerPoint.Application Com-Object took about 5 minutes and an additional 5 to put together the following script:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 Get-ChildItem C:\git\Events -File - Filter * pptx -Recurse | ForEach-Object -Begin { $null = Add - Type - AssemblyName Microsoft.Office.Interop.PowerPoint $SaveOption = [ Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType ] ::ppSaveAsPDF $PowerPoint = New-Object -ComObject "PowerPoint.Application" } -Process { $Presentation = $PowerPoint .Presentations.Open ( $_ .FullName ) $PdfNewName = $_ .FullName -replace '\.pptx$' , '.pdf' $Presentation .SaveAs ( $PdfNewName , $SaveOption ) $Presentation .Close ( ) } -End { $PowerPoint .Quit ( ) Stop-Process -Name POWERPNT -Force } Get-ChildItem C:\git\Events -File -Filter *pptx -Recurse | ForEach-Object -Begin { $null = Add-Type -AssemblyName Microsoft.Office.Interop.PowerPoint $SaveOption = [Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType]::ppSaveAsPDF $PowerPoint = New-Object -ComObject "PowerPoint.Application" } -Process { $Presentation = $PowerPoint.Presentations.Open($_.FullName) $PdfNewName = $_.FullName -replace '\.pptx$','.pdf' $Presentation.SaveAs($PdfNewName,$SaveOption) $Presentation.Close() } -End { $PowerPoint.Quit() Stop-Process -Name POWERPNT -Force }

This script will recursively look for all .pptx files in the Events repository and the run the following code:

In the begin block load the PowerPoint Com-Object and the required type for storing files as .pdf

For each presentation, open the presentation, generate a new name and convert it to .pdf

Finally at the end close the PowerPoint application and afterwards using Stop-Process to close the window, note that if you had any other PowerPoint windows open they will also be closed.

Now I have both the .pdf and the .pptx stored in the folder, let’s take a look what the difference in file size is:

1 2 3 4 5 6 7 8 9 foreach ( $Extension in ( 'pptx' , 'pdf' ) ) { Get-ChildItem C:\git\Events -File - Filter "*$Extension" -Recurse | Measure-Object -Property Length -Sum | ForEach-Object { [ pscustomobject ] @ { 'SizeinMB' = [ math ] ::Round ( $_ .Sum / 1MB , 2 ) 'Extension' = $Extension } } } foreach ($Extension in ('pptx','pdf')) { Get-ChildItem C:\git\Events -File -Filter "*$Extension" -Recurse | Measure-Object -Property Length -Sum | ForEach-Object { [pscustomobject]@{ 'SizeinMB' = [math]::Round($_.Sum/1MB,2) 'Extension' = $Extension } } }

A nice decrease in size and a format that is more suitable for sharing, this is looking good. After verifying that the .pdf files are looking good we can remove the .pptx files with the following code:

1 2 Get-ChildItem C:\git\Events -File - Filter * pptx -Recurse | Remove-Item -Force Get-ChildItem C:\git\Events -File -Filter *pptx -Recurse | Remove-Item -Force

The last step is to commit everything to GitHub and make it available to everyone. I found a nice Stack Overflow thread that explained how to mass remove files:

Removing multiple files from a Git repo that have already been deleted from disk

Which left me with the following commands to run to commit everything to the repository using bash:

1 2 3 4 git ls-files --deleted -z | xargs -0 git rm git add * git commit -m "Removed pesky pptx and added glorious pdf" git push origin master git ls-files --deleted -z | xargs -0 git rm git add * git commit -m "Removed pesky pptx and added glorious pdf" git push origin master

And to view the result here is what is looks like on GitHub now and the commit:

GitHub – JaapBrasser – Events – Commits

Let me know what you think, is .pdf a more useful format over .pptx to share presentations or would you rather see it the other way around?



Like this: Like Loading...