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 cups # needed for interface with print center
#texlive.combined.scheme-medium # too large for container in LMU build environment. #texlive.combined.scheme-medium # too large for container in LMU build environment.
(texlive.combine { (texlive.combine {
inherit (texlive) scheme-basic xcolor inherit (texlive) scheme-basic xcolor "scrlttr2"
# lualatex # lualatex
luatexbase unicode-math lualatex-math selnolig luatexbase unicode-math lualatex-math selnolig
; ;

View File

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

View File

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

View File

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