342 lines
18 KiB
Python
342 lines
18 KiB
Python
%define normalize() %(echo %* | tr "[:upper:]_ " "[:lower:]--")
|
||
%{?!py3_dist:%define py3_dist() (python%{python3_version}dist(%{normalize %1}) or python3-%1)}
|
||
|
||
|
||
Summary: A simple and powerful dual-screen PDF reader designed for presentations
|
||
Name: python3-pympress
|
||
Version: 1.8.1
|
||
Release: 1
|
||
Source0: pympress-1.8.1.tar.gz
|
||
License: GPL-2.0-or-later
|
||
Prefix: %{_prefix}
|
||
BuildArch: noarch
|
||
Vendor: Cimbali, Thomas Jost, Christof Rath, Epithumia <me@cimba.li>
|
||
Url: https://github.com/Cimbali/pympress/
|
||
Requires: python(abi) = %{python3_version}
|
||
Provides: python%{python3_version}dist(pympress) = 1.8.1
|
||
BuildRequires: findutils grep python3-devel
|
||
%if %{?!rhel:8}%{?rhel} >= 8
|
||
Requires: (%{py3_dist pygobject} or python3-gobject)
|
||
%else
|
||
Requires: python3%{suffix:%{python3_version}}-gobject
|
||
%endif
|
||
%if 0%{?suse_version}
|
||
Requires: gtk3 libpoppler-glib8 libgdk_pixbuf-2_0-0 gstreamer gstreamer-plugins-base gstreamer-plugins-good gstreamer-plugins-good-gtk libgstvideo-1_0-0
|
||
Recommends: gstreamer-plugins-ugly gstreamer-plugins-bad
|
||
%endif
|
||
%if 0%{?mdkversion}%{?mga_version}
|
||
Requires: gtk+3.0 (libpoppler-glib8 or lib64poppler-glib8) (libgdk_pixbuf2.0 or libgdk_pixbuf2.0_0) libgstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good
|
||
Recommends: gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad
|
||
%endif
|
||
%if 0%{?suse_version}%{?mga_version}%{?mdkversion}
|
||
Requires: typelib(cairo) typelib(GLib) typelib(DBus) typelib(DBusGLib) typelib(GObject) typelib(Gdk) typelib(GdkPixbuf) typelib(Gio) typelib(Gtk) typelib(Poppler) typelib(Gst) typelib(GstAllocators) typelib(GstApp) typelib(GstAudio) typelib(GstVideo) typelib(GstGL)
|
||
Recommends: typelib(GstMpegts) typelib(GstWebRTC) typelib(GstBadAudio) typelib(GstCodecs)
|
||
%endif
|
||
BuildRequires: python3-setuptools >= 40.8.0, python3-wheel
|
||
Requires: gobject-introspection %{py3_dist watchdog}
|
||
Requires: python(abi) >= 3.4
|
||
|
||
%description
|
||
#  What is Pympress?
|
||
|
||
Pympress is a PDF presentation tool designed for dual-screen setups such as presentations and public talks.
|
||
Highly configurable, fully-featured, and portable
|
||
|
||
It comes with many great features ([more below](#functionalities)):
|
||
- supports embedded gifs (out of the box), videos, and audios (with VLC or Gstreamer integration)
|
||
- text annotations displayed in the presenter window
|
||
- natively supports beamer's *notes on second screen*, as well as Libreoffice notes pages!
|
||
|
||
Pympress is a free software, distributed under the terms of the GPL license (version 2 or, at your option, any later version).
|
||
|
||
Pympress was originally created and maintained by [Schnouki](https://github.com/Schnouki), on [his repo](https://github.com/Schnouki/pympress).
|
||
|
||
Here is what the 2 screen setup looks like, with a big notes slide next to 2 small slides (current and next) on the presenter side:
|
||

|
||
|
||
# Usage
|
||
|
||
## Opening a file
|
||
Simply start Pympress and it will ask you what file you want to open.
|
||
You can also start pympress from the command line with a file to open like so:
|
||
`pympress slides.pdf`
|
||
or
|
||
`python3 -m pympress slides.pdf`
|
||
|
||
## Functionalities
|
||
|
||
All functionalities are available from the menus of the window with slide previews. Don't be afraid to experiment with them!
|
||
|
||
Keyboard shortcuts are also listed in these menus. Some more usual shortcuts are often available, for example `Ctrl`+`L`, and `F11` also toggle fullscreen, though the main shortcut is just `F`.
|
||
|
||
A few of the fancier functionalities are listed here:
|
||
- **Two-screen display**: See on your laptop or tablet display the current slide, the next slide, the talk time and wall-clock time, and annotations (either PDF annotations, beamer notes on second slide, or Libreoffice notes pages).
|
||
The position of the beamer or Libreoffice notes in the slide is detected automatically and can be overridden via a menu option.
|
||
|
||
If you do not want to use second-slide beamer notes but prefer to have notes on their own pages, you can enable auto-detection of these notes.
|
||
Use the following snippet that prefixes the page labels with `notes:` on notes pages:
|
||
```latex
|
||
\addtobeamertemplate{note page}{}{\thispdfpagelabel{notes:\insertframenumber}}
|
||
```
|
||
- **Media support**: supports playing video, audio, and gif files embedded in (or linked from) the PDF file, with optional start/end times and looping.
|
||
- **Highlight mode**: Allows one to draw freehand on the slide currently on screen.
|
||
- **Go To Slide**: To jump to a selected slide without flashing through the whole presentation on the projector, press `G` or click the "current slide" box.
|
||
Using `J` or clicking the slide label will allow you to navigate slide labels instead of page numbers, useful e.g. for multi-page slides from beamer `\pause`.
|
||
|
||
A spin box will appear, and you will be able to navigate through your slides in the presenter window only by scrolling your mouse, with the `Home`/`Up`/`Down`/`End` keys,
|
||
with the + and - buttons of the spin box, or simply by typing in the number of the slide. Press `Enter` to validate going to the new slide or `Esc` to cancel.
|
||
|
||
- **Deck Overview**: Pressing `D` will open an overview of your whole slide deck, and any slide can be opened from can simply clicking it.
|
||
- **Software pointer**: Clicking on the slide (in either window) while holding `ctrl` down will display a software laser pointer on the slide. Or press `L` to permanently switch on the laser pointer.
|
||
- **Talk time breakdown**: The `Presentation > Timing Breakdown` menu item displays a breakdown of how much time was spent on each slide, with a hierarchical breakdown per chapters/sections/etc. if available in the PDF.
|
||
- **Automatic file reloading**: If the file is modified, pympress will reload it (and preserve the current slide, current time, etc.)
|
||
- **Big button mode**: Add big buttons (duh) for touch displays.
|
||
- **Swap screens**: If Pympress mixed up which screen is the projector and which is not, press `S`
|
||
- **Automatic full screen**: pympress will automatically put the content window fullscreen on your non-primay screen when:
|
||
- connecting a second screen,
|
||
- extending your desktop to a second screen that was mirroring your main screen,
|
||
- when starting pympress on a two-screen display.
|
||
To disable this behaviour, untick “Content fullscreen” under the “Starting configuration” menu.
|
||
- **Estimated talk time**: Click the `Time estimation` box and set your planned talk duration. The color will allow you to see at a glance how much time you have left.
|
||
- **Adjust screen centering**: If your slides' form factor doesn't fit the projectors' and you don't want the slide centered in the window, use the "Screen Center" option in the "Presentation" menu.
|
||
- **Resize Current/Next slide**: You can drag the bar between both slides on the Presenter window to adjust their relative sizes to your liking.
|
||
- **Caching**: For efficiency, Pympress caches rendered pages (up to 200 by default). If this is too memory consuming for you, you can change this number in the configuration file.
|
||
- **Configurability**: Your preferences are saved in a configuration file, and many options are accessible there directly. These include:
|
||
- Customisable key bindings (or shortcuts),
|
||
- Configurable layout of the presenter window, with 1 to 16 next slides preview
|
||
- and many more.
|
||
|
||
See the [configuration file documentation](docs/options.md) for more details,
|
||
- **Editable PDF annotations**: Annotations can be added, removed, or changed, and the modified PDF files can be saved
|
||
- **Automatic next slide and looping**
|
||
|
||
## Command line arguments
|
||
|
||
- `-h, --help`: Shows a list of all command line arguments.
|
||
- `-t mm[:ss], --talk-time=mm[:ss]`: The estimated (intended) talk time in minutes and optionally seconds.
|
||
- `-n position, --notes=position`: Set the position of notes on the pdf page (none, left, right, top, or bottom). Overrides the detection from the file.
|
||
- `--log=level`: Set level of verbosity in log file (DEBUG, INFO, WARNING, ERROR).
|
||
|
||
## Media and autoplay
|
||
|
||
To enable media playback, you need to have either:
|
||
- Gstreamer installed (enabled by default), with plugins gstreamer-good/-bad/-ugly based on which codecs you need, or
|
||
- VLC installed (and the python-vlc module), with `enabled = on` under the `[vlc]` section of your config file.
|
||
|
||
On macOS, issues with the gstreamer brew formula may require users to set `GST_PLUGIN_SYSTEM_PATH` manually. For default homebrew configurations the value should be `/opt/homebrew/lib/gstreamer-1.0/`. Make sure to set this environmental variable globally, or pympress might not pick it up.
|
||
|
||
To produce PDFs with media inclusion, the ideal method is to use beamer’s multimedia package, always with `\movie`:
|
||
|
||
```latex
|
||
\documentclass{beamer}
|
||
\usepackage{multimedia}
|
||
|
||
\begin{frame}{Just a mp4 here}
|
||
\centering
|
||
\movie[width=0.3\textwidth]{\includegraphics[width=0.9\textwidth]{frame1.png}}{movie.mp4}
|
||
|
||
\movie[width=0.3\textwidth]{}{animation.gif}
|
||
|
||
\movie[width=0.3\textwidth]{}{ding.ogg}
|
||
\end{frame}
|
||
```
|
||
|
||
If you desire autoplay, ensure you have pympress ≥ 1.7.0 and poppler ≥ 21.04, and use the `movie15` package as follows:
|
||
|
||
```latex
|
||
\documentclass{beamer}
|
||
\usepackage{movie15}
|
||
\begin{document}
|
||
|
||
\begin{frame}
|
||
\begin{center}
|
||
\includemovie[attach=false,autoplay,text={%%
|
||
\includegraphics{files/mailto.png}%%
|
||
}]{0.4\linewidth}{0.3\linewidth}{files/random.mpg}
|
||
\end{center}
|
||
\end{frame}
|
||
|
||
\end{document}
|
||
```
|
||
|
||
# Dependencies
|
||
|
||
Pympress relies on:
|
||
* Python (version ≥ 3.4, python 2.7 is supported only until pympress 1.5.1, and 3.x < 3.4 until v1.6.4).
|
||
* [Poppler](http://poppler.freedesktop.org/), the PDF rendering library.
|
||
* [Gtk+ 3](http://www.gtk.org/), a toolkit for creating graphical user interfaces, and [its dependencies](https://www.gtk.org/overview.php), specifically:
|
||
* [Cairo](https://www.cairographics.org/) (and python bindings for cairo), the graphics library which is used to pre-render and draw over PDF pages.
|
||
* Gdk, a lower-level graphics library to handle icons.
|
||
* [PyGi, the python bindings for Gtk+3](https://wiki.gnome.org/Projects/PyGObject). PyGi is also known as *pygobject3*, just *pygobject* or *python3-gi*.
|
||
* Introspection bindings for poppler may be shipped separately, ensure you have those as well (`typelib-1_0-Poppler-0_18` on OpenSUSE, `gir1.2-poppler-0.18` on Ubuntu)
|
||
* optionally [VLC](https://www.videolan.org/vlc/), to play videos (with the same bitness as Python)
|
||
and the [python-vlc](https://pypi.org/project/python-vlc/) bindings.
|
||
* optionally Gstreamer to play videos (which is a Gtk library)
|
||
|
||
### On linux platforms
|
||
The dependencies are often installed by default, or easily available through your package or software manager.
|
||
For example, on ubuntu, you can run the following as root to make sure you have all the prerequisites *assuming you use python3*:
|
||
|
||
```sh
|
||
apt-get install python3 python3-pip libgtk-3-0 libpoppler-glib8 libcairo2 python3-gi python3-cairo python3-gi-cairo gobject-introspection libgirepository-1.0-1 libgirepository1.0-dev gir1.2-gtk-3.0 gir1.2-poppler-0.18
|
||
```
|
||
|
||
Different distributions might have different package naming conventions, for example the equivalent on OpenSUSE would be:
|
||
|
||
```sh
|
||
zypper install python3 python3-pip libgtk-3-0 libpoppler-glib8 libcairo2 python3-gobject python3-gobject-Gdk python3-cairo python3-gobject-cairo typelib-1_0-GdkPixbuf-2_0 typelib-1_0-Gtk-3_0 typelib-1_0-Poppler-0_18
|
||
```
|
||
|
||
On CentOS/RHEL/Fedora the dependencies would be:
|
||
|
||
```sh
|
||
yum install python36 python3-pip gtk3 poppler-glib cairo gdk-pixbuf2 python3-gobject python3-cairo
|
||
```
|
||
|
||
And on Arch Linux:
|
||
|
||
```sh
|
||
pacman -S --needed python python-pip gtk3 poppler cairo gobject-introspection poppler-glib python-gobject gst-plugin-gtk
|
||
```
|
||
|
||
|
||
### On macOS
|
||
|
||
Dependencies can be installed using [Homebrew](https://brew.sh/):
|
||
|
||
```sh
|
||
brew install --only-dependencies pympress
|
||
```
|
||
|
||
### On windows
|
||
The [binary installer for windows](#installing-) comes with pympress and all its dependencies packaged.
|
||
|
||
Alternately, in order to install from pypi or from source on windows, there are two ways to get the dependencies:
|
||
|
||
1. using MSYS2 (replace x86_64 with i686 if you're using a 32 bit machine).
|
||
|
||
**Warning:** this can take a substantial amount of disk size as it requires a full software distribution and building platform.
|
||
|
||
```sh
|
||
pacman -S --needed mingw-w64-x86_64-gtk3 mingw-w64-x86_64-cairo mingw-w64-x86_64-poppler mingw-w64-x86_64-python3 mingw-w64-x86_64-vlc python3-pip mingw-w64-x86_64-python3-pip mingw-w64-x86_64-python3-gobject mingw-w64-x86_64-python3-cairo
|
||
```
|
||
|
||
This is also the strategy used to automate [builds on appveyor](https://github.com/Cimbali/pympress/tree/master/scripts/build_msi_mingw.sh).
|
||
|
||
2. Using PyGobjectWin32. *Be sure to check the supported Python versions (up to 3.4 at the time of writing)*, they appear in the FEATURES list in the linked page.
|
||
- Install native [python for windows](https://www.python.org/downloads/windows/)
|
||
- Get GTK+3, Poppler and their python bindings by executing [the PyGi installer](https://sourceforge.net/projects/pygobjectwin32/). Be sure to tick all the necessary dependencies in the installer (Poppler, Cairo, Gdk-Pixbuf).
|
||
|
||
Alternately, you can build your Gtk+3 stack from source using MSVC, see [the Gnome wiki](https://wiki.gnome.org/Projects/GTK+/Win32/MSVCCompilationOfGTKStack) and [this python script that compiles the whole Gtk+3 stack](https://github.com/wingtk/gvsbuild/).
|
||
This strategy has not been used successfully yet, due to problems building Poppler with its introspection bidings (i.e. typelib) − see [#109](https://github.com/Cimbali/pympress/issues/109).
|
||
|
||
# Contributing
|
||
|
||
Feel free to clone this repo and use it, modify it, redistribute it, etc, under the GPLv2+.
|
||
A [number of contributors](https://github.com/Cimbali/pympress/graphs/contributors) have taken part in the development of pympress and submitted pull requests to improve it.
|
||
|
||
**Be respectful of everyone and keep this community friendly, welcoming, and harrasment-free.
|
||
Abusive behaviour will not be tolerated, and can be reported by email at me@cimba.li − wrongdoers may be permanently banned.**
|
||
|
||
Pympress has inline sphinx documentation ([Google style](http://www.sphinx-doc.org/en/latest/ext/example_google.html), contains rst syntax), and the [docs generated from it are hosted on the github pages of this repo](https://pympress.github.io/).
|
||
|
||
## Translations
|
||
|
||

|
||

|
||

|
||

|
||

|
||

|
||

|
||

|
||

|
||

|
||
<!-- https://poeditor.com/docs/languages -->
|
||
|
||
We thank the many contributors of translations: <!-- translator list -->
|
||
Agnieszka,
|
||
atsuyaw,
|
||
Cherrywoods,
|
||
Dongwang,
|
||
Estel-f,
|
||
Fabio Pagnotta,
|
||
Ferdinand Fichtner,
|
||
Frederik. blome,
|
||
FriedrichFröbel,
|
||
He. yifan. xs,
|
||
Jaroslav Svoboda,
|
||
Jeertmans,
|
||
Karen Zhang,
|
||
Kristýna,
|
||
Leonvincenterd,
|
||
LogCreative,
|
||
Lorenzo. pacchiardi,
|
||
Luis Sibaja,
|
||
Marcin Dohnalik,
|
||
marquitul,
|
||
Morfit,
|
||
Mzn,
|
||
Nico,
|
||
Ogawa,
|
||
Paul,
|
||
Pierre BERTHOU,
|
||
polaksta,
|
||
Saulpierotti,
|
||
Shebangmed,
|
||
susobaco,
|
||
Tapia,
|
||
Tejas,
|
||
Timo Zhang,
|
||
Tkoyama010,
|
||
Toton95,
|
||
Vojta Netrh,
|
||
Vulpeculus,
|
||
and <!-- last translator --> Cimbali.
|
||
|
||
If you also want to add or contribute to a translation, check [pympress’ page on POEditor](https://poeditor.com/join/project/nKfRxeN8pS).
|
||
Note that old strings are kept and tagged `removed`, to give context and keep continuity between translations of succcessive versions.
|
||
This means `removed` strings are unused and do not need translating.
|
||
|
||
## Packages
|
||
|
||
Official releases are made to [PyPI](https://pypi.org/) and with [github releases](https://github.com/Cimbali/pympress/releases).
|
||
The community maintains a number of other packages or recipes to install pympress (see [Install section](#installing-)). Any additions welcome.
|
||
|
||
|
||
|
||
|
||
%prep
|
||
%setup -n pympress-1.8.1
|
||
|
||
%build
|
||
%py3_build
|
||
|
||
%install
|
||
%py3_install
|
||
|
||
echo %{python3_sitelib}/pympress > INSTALLED_FILES
|
||
echo %{python3_sitelib}/pympress-1.8.1-py%{python3_version}.egg-info >> INSTALLED_FILES
|
||
|
||
|
||
find "%{buildroot}%{_prefix}" -wholename "%{buildroot}%{python3_sitelib}" -prune -o -name 'pympress*' -printf '%{_prefix}/%%P\n' -prune >> INSTALLED_FILES
|
||
for f in pympress; do chmod 0755 "%{buildroot}%{_bindir}/$f"; echo "%{_bindir}/$f"; done | (grep -vxFf INSTALLED_FILES || :) >> INSTALLED_FILES
|
||
|
||
%find_lang pympress && cat pympress.lang >> INSTALLED_FILES || :
|
||
find "%{buildroot}%{_prefix}" -wholename "%{buildroot}%{python3_sitelib}" -prune -o -name 'io.github.pympress.*' -printf '%{_prefix}/%%P\n' -prune >> INSTALLED_FILES
|
||
|
||
%post
|
||
if [ $1 -gt 1 ]; then
|
||
find "%{python3_sitelib}" -maxdepth 1 -name 'pympress-1.5.*' -print0 | xargs -0 --no-run-if-empty rm -r
|
||
fi
|
||
|
||
%files -f INSTALLED_FILES
|
||
|
||
%license LICENSE.txt
|
||
|
||
%defattr(-,root,root)
|
||
|
||
%changelog
|
||
* Fri May 26 2023 wangtaozhi <wangtaozhi@kylinsec.com.cn> - 1.8.1-1
|
||
- Package init
|