Add bordered fabric poster variant

Change-Id: I8ceae9833cca768f4795d3b1096021c9e2d8ebc0
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2599805..09666ca 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -145,7 +145,9 @@
     - start_section install_linux_packages "Installing missing Linux packages"
     - mkdir -pv $APT_CACHE_DIR ccache $R_LIBS_USER
     - apt-get -o Acquire::Retries=5 -o Acquire::http::Timeout=30 -o Acquire::https::Timeout=30 update
-    - apt-get install --no-install-recommends -o dir::cache::archives="$APT_CACHE_DIR" -y libasound2t64 npm curl ccache libvulkan1 libu2f-udev fonts-liberation build-essential libglpk40 libcurl4-gnutls-dev libxml2-dev libsodium-dev libsecret-1-dev libfontconfig1-dev libssl-dev libxt6 libpq-dev imagemagick ghostscript inkscape scour poppler-utils qpdf fonts-stix
+    - apt-get install --no-install-recommends -o dir::cache::archives="$APT_CACHE_DIR" -y libasound2t64 npm curl ccache libvulkan1 libu2f-udev fonts-liberation build-essential libglpk40 libcurl4-gnutls-dev libxml2-dev libsodium-dev libsecret-1-dev libfontconfig1-dev libssl-dev libxt6 libpq-dev imagemagick ghostscript inkscape scour poppler-utils qpdf texlive-extra-utils texlive-latex-extra fonts-stix
+    - command -v pdfjam
+    - kpsewhich pdfpages.sty
     # The distro Node (18, EOL) is too old for current tooling. Install the
     # current Node.js LTS (24.x) from the official tarball into /usr/local, which
     # precedes /usr/bin on PATH so `node`/`npx` resolve to it. We deliberately do
@@ -206,7 +208,10 @@
     - ./ci/html2pdf $HTML $PDF 1
     # Variant for printing on fabric, where solid black bleeds out: replace all
     # vector black by 15% grey (keeps QR codes scannable and text crisp).
-    - ./ci/pdf-lighten-black $PDF target/$(basename $SOURCE_FILE .Rmd)_fabric.pdf
+    - export FABRIC_PDF=target/$(basename $SOURCE_FILE .Rmd)_fabric.pdf
+    - ./ci/pdf-lighten-black $PDF $FABRIC_PDF
+    # Add 10 mm of blank material on every side for mounting the fabric poster.
+    - pdfjam $FABRIC_PDF --papersize '{861mm,1209mm}' --noautoscale true --outfile target/$(basename $SOURCE_FILE .Rmd)_fabric-1cmborder.pdf
     - gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sPAPERSIZE=a1 -dFIXEDMEDIA -dPDFFitPage -sOutputFile=target/$(basename $SOURCE_FILE .Rmd)_a1.pdf $PDF
     - inkscape -b white --pdf-poppler -o $SVG $PDF || true
     - scour -i $SVG -o target/skeleton_optimized.svg --enable-viewboxing --enable-id-stripping --shorten-ids --indent=none
diff --git a/README.md b/README.md
index 2fbdb3b..627e065 100644
--- a/README.md
+++ b/README.md
@@ -107,4 +107,15 @@
 ci/pdf-lighten-black poster.pdf poster_fabric.pdf 0.25   # lighter, if black still bleeds
 ```
 
-The CI workflow builds this variant automatically as `target/skeleton_fabric.pdf`.
+For mounting, `pdfjam` can place that A0 fabric version on a page which is 2 cm
+wider and taller, leaving a 1 cm margin on every side:
+
+```bash
+pdfjam poster_fabric.pdf \
+    --papersize '{861mm,1209mm}' \
+    --noautoscale true \
+    --outfile poster_fabric-1cmborder.pdf
+```
+
+The CI workflow builds both variants automatically as
+`target/skeleton_fabric.pdf` and `target/skeleton_fabric-1cmborder.pdf`.