chore(pdf): add din5008 letter templating

This commit is contained in:
Steffen Jost 2022-06-08 18:26:14 +02:00
parent 5015dba5e3
commit c0eafdd1c8
8 changed files with 285 additions and 29 deletions

View File

@ -26,7 +26,7 @@ let
cups # needed for interface with print center
#texlive.combined.scheme-medium # too large for container in LMU build environment.
(texlive.combine {
inherit (texlive) scheme-basic xcolor
inherit (texlive) scheme-basic xcolor "scrlttr2"
# lualatex
luatexbase unicode-math lualatex-math selnolig
;

View File

@ -145,6 +145,7 @@ dependencies:
- rfc5051
- unidecode
- pandoc
- pandoc-types
- token-bucket
- async
- pointedlist

View File

@ -74,14 +74,12 @@ in pkgs.mkShell {
++ (with pkgs;
[ nodejs-14_x postgresql_12 openldap google-chrome exiftool memcached minio minio-client
gup skopeo
# texlive.combined.scheme-medium
texlive.combined.scheme-medium
# texlive.combined.scheme-small
(texlive.combine {
inherit (texlive) scheme-basic xcolor
# lualatex
luatexbase unicode-math lualatex-math selnolig
;
})
#(texlive.combine {
# inherit (texlive) scheme-basic xcolor scrlttr2 luatexbase unicode-math lualatex-math selnolig;
# ERROR: attribute 'scrlttr2' missing - gleicher Fehler kommt bei ausgedachten Namen, auch ohne Zahl am Ende
#})
]
)
++ (with pkgs.haskellPackages; [ stack yesod-bin hlint cabal-install weeder profiteur ]);

View File

@ -10,6 +10,7 @@ import Jobs
import Data.Char (isDigit)
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import qualified Data.ByteString.Lazy as L
import qualified Data.Set as Set
@ -17,7 +18,7 @@ import qualified Data.Map as Map
import qualified Text.Pandoc as P
import qualified Text.Pandoc.PDF as P
-- import qualified Text.Pandoc.Builder as P
import qualified Text.Pandoc.Builder as P
import Handler.Admin.Test.Download (testDownload)
@ -239,7 +240,7 @@ postAdminTestR = do
<p style="white-space:pre-wrap; font-family:var(--font-monospace);">
#{tshow res}
|]
i18nIdent <- newIdent
let i18nForm' = wrapForm i18nWidget FormSettings
{ formMethod = POST
@ -276,22 +277,31 @@ postAdminTestR = do
getAdminTestPdfR :: Handler TypedContent
getAdminTestPdfR = do
-- let -- typePDF = "application/pdf" :: ContentType
-- typePDF = Settings.Mime.mimeLookup "pdfdemo.pdf"
content <- liftIO . P.runIO $ do
tmpl <- P.compileDefaultTemplate "latex"
let
md = "# Hello \n\n This is some *more* Text." :: Text
texopts = []
writeropts = def { P.writerTemplate = Just tmpl }
doc <- P.readMarkdown def md
-- P.makePDF "pdflatex" texopts P.writeLaTeX writeropts doc -- xcolor.sty not found
P.makePDF "lualatex" texopts P.writeLaTeX writeropts doc -- unicode-math.sty not found
case content of
Right (Right bs) -> do
liftIO $ L.writeFile "/tmp/generated.pdf" bs
now <- liftIO getCurrentTime
sendByteStringAsFile "demoPDF.pdf" (L.toStrict bs) now
-- sendResponse (typePDF, toContent bs)
Right (Left err) -> sendResponseStatus internalServerError500 $ tshow err
Left err -> sendResponseStatus internalServerError500 $ P.renderError err
templates <- liftIO $ do
letter_md <- Text.readFile "templates/letter/fraport_renewal.md"
letter_tp <- P.compileTemplate "" letter_md
din5008 <- Text.readFile "templates/letter/din5008.latex" >>= P.compileTemplate ""
now <- getCurrentTime
return (now, letter_md, letter_tp, din5008)
case templates of
(_,_,Left err,_) -> sendResponseStatus internalServerError500 $ tshow err
(_,_,_,Left err) -> sendResponseStatus internalServerError500 $ tshow err
(now, md, Right templ, Right latex) -> do
content <- liftIO . P.runIO $ do
let texopts = []
readeropts = def { P.readerExtensions = P.pandocExtensions }
writeropts1 = def { P.writerTemplate = Just templ }
writeropts2 = def { P.writerTemplate = Just latex }
-- https://github.com/jgm/pandoc/issues/1950
-- using markdown as a template for itself for interpolation:
doc1 <- P.readMarkdown readeropts md
doc2 <- P.writeMarkdown writeropts1 doc1
doc3 <- P.readMarkdown readeropts doc2
P.makePDF "pdflatex" texopts P.writeLaTeX writeropts2 $
P.setDate (P.text . tshow $ utctDay now) doc3
case content of
Right (Right bs) -> do
liftIO $ L.writeFile "/tmp/generated.pdf" bs
sendByteStringAsFile "demoPDF.pdf" (L.toStrict bs) now
Right (Left err) -> sendResponseStatus internalServerError500 $ tshow err
Left err -> sendResponseStatus internalServerError500 $ P.renderError err

View File

@ -0,0 +1,98 @@
%Based upon https://github.com/benedictdudel/pandoc-letter-din5008
\documentclass[
foldmarks=BTm, % show foldmarks top, middle, bottom
foldmarks=false, % don't print foldmarks
fromalign=left, % letter head on the right
fromphone=true, % show phone number
fromemail=true, % show email
fromlogo=false, % don't show logo in letter head
version=last % latest version of KOMA letter
pagenumber=botright % show pagenumbers on bottom right
]{scrlttr2}
\usepackage[ngerman]{babel}
\usepackage{iftex}
\ifPDFTeX
\usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp} % provide euro and other symbols
\else % if luatex or xetex
$if(mathspec)$
\ifXeTeX
\usepackage{mathspec}
\else
\usepackage{unicode-math}
\fi
$else$
\usepackage{unicode-math}
$endif$
\usepackage{parskip}
\usepackage{graphics}
\usepackage{booktabs}
\usepackage{longtable}
\usepackage[right]{eurosym}
\usepackage[hyphens]{url}
\usepackage{enumitem}
\makeatletter
\setlength{\@tempskipa}{-1.2cm}%
\@addtoplength{toaddrheight}{\@tempskipa}
\makeatother
\setlength{\oddsidemargin}{\useplength{toaddrhpos}}
\addtolength{\oddsidemargin}{-1in}
\setlength{\textwidth}{\useplength{firstheadwidth}}
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
\begin{document}
\setkomavar{fromname}{$author$}
\renewcommand*{\raggedsignature}{\raggedright}
\setkomavar{fromaddress}{
$for(return-address)$
$return-address$$sep$\\
$endfor$
}
\setkomavar{fromphone}{$phone$}
\setkomavar{fromemail}{$email$}
\setkomavar{signature}{$author$}
\setkomavar{date}{$date$}
\setkomavar{place}{$place$}
\setkomavar{subject}{$subject$}
\begin{letter}{%
$for(address)$
$address$$sep$\\
$endfor$
}
\opening{$opening$}
This paragraph is fixed within the template.
Not sure if this is the way to go though.
\begin{description}[leftmargin=!,labelwidth=1.5cm,labelindent=1cm]
\item[Login] $login$
\item[Pin] $pin$
\end{description}
$body$
\closing{$closing$}
\ps $postskriptum$
$if(encludes)$
\setkomavar*{enclseparator}{Anlage}
\encl{$encludes$}
$endif$
\end{letter}
\end{document}

View File

@ -0,0 +1,58 @@
---
### Metadaten, welche hier eingestellt werden:
# Absender
subject: Verlängerung Vorfeldführerschein
author: Fraport AG - Fahrerausbildung (AVN-AR)
phone: +49 69 690-30306
email: fahrerausbildung@fraport.de
place: Frankfurt/Main
return-address:
- 60547 Frankfurt
opening: Sehr geehrte Damen und Herren,
closing: |
Mit freundlichen Grüßen,
Ihre Fahrerausbildung.
encludes:
### Metadaten, welche automatisch ersetzt werden:
date: 11.11.1111
lang: de-de
is-de: NULL
lms-login: 123456
lms-pin: abcdef
# Emfpänger
name: E. M. Pfänger
address:
- Musterfirma GmbH
- E. M. Pfänger
- Musterstraße 11
- 12345 Musterstadt
...
die Gültigkeit Ihres Vorfeldführerscheines läuft demnächst ab.
Durch die erfolgreiche Teilnahme an einem E-Lernen können Sie
die Gültigkeit um 2 Jahre verlängern. Verwenden Sie dazu folgende
Login-Daten.
URL
: <http://www.fraport.de/fahrerausbildung>
Name:
: $name$
Login
: $login$
Pin
: $pin$
Sobald die Frist abgelaufen ist, muss zur Wiedererlangung des Vorfeldführerscheins
erneut der Grundkurs bei der Fahrerausbildung absolviert werden.
Bei Fragen können Sie sich gerne an das Team der Fahrerausbildung wenden.

View File

@ -0,0 +1,91 @@
---
### Metadaten, welche hier eingestellt werden:
# Absender
subject: Verlängerung Vorfeldführerschein
author: Fraport AG - Fahrerausbildung (AVN-AR)
phone: +49 69 690-30306
email: fahrerausbildung@fraport.de
place: Frankfurt/Main
return-address:
- 60547 Frankfurt
opening: Sehr geehrte Damen und Herren,
closing: |
Mit freundlichen Grüßen,
Ihre Fahrerausbildung.
encludes: null
### Metadaten, welche automatisch ersetzt werden:
date: 11.11.1111
lang: de-de
is-de: NULL
lms-login: 123456
lms-pin: abcdef
# Emfpänger
name: E. M. Pfänger
address:
- Musterfirma GmbH
- E. M. Pfänger
- Musterstraße 11
- 12345 Musterstadt
...
$if(is-de)$
<!-- deutsche Version des Briefes -->
[comment]: <> (This is a comment, it will not be included)
die Gültigkeit Ihres Vorfeldführerscheines läuft demnächst ab.
Durch die erfolgreiche Teilnahme an einem E-Lernen können Sie
die Gültigkeit um 2 Jahre verlängern. Verwenden Sie dazu folgende
Login-Daten.
URL
: <http://www.fraport.de/fahrerausbildung>
Name:
: $name$
Login
: $login$
Pin
: $pin$
Sobald die Frist abgelaufen ist, muss zur Wiedererlangung des Vorfeldführerscheins
erneut der Grundkurs bei der Fahrerausbildung absolviert werden.
Bei Fragen können Sie sich gerne an das Team der Fahrerausbildung wenden.
$else$
<!-- englische Version des Briefes -->
your apron diving licence is about to expire soon.
You may renew your apron driving licence by two years through successfully
completing an e-learning course. Please use the following login data.
URL
: <http://www.fraport.de/fahrerausbildung>
Name:
: $name$
Login
: $login$
Pin
: $pin$
Should your apron driving licence expire before completing this
e-learning course, then a renewal requires your full participation
of the basic training course again.
Please do not hesitate to contact the Fraport driving school team, if you need any assistance.
$endif$