Од текста до PDF-а
12.10.2021Понекад је корисно имати могућност да се једноставна текстуална датотека претвори у PDF. Наравно, текст се може учитати у неки процесор текста као што је Libre Office Writer, али уз CUPS, постоји и далеко једноставније решење, које не захтева покретање спорих графичких апликација за тако једноставан посао.
CUPS између осталог садржи и CLI програм texttopdf, који се може употребити за „штампање“ у PDF. На пример, да бисмо претворили датотеку file.txt у file.pdf, можемо да покренемо:
$ CHARSET=utf-8 /usr/lib/cups/filter/texttopdf 1 1 1 1 1 \ < file.txt > file.pdf
Међутим, овај програм дозвољава и да задамо произвољан фонт уз помоћ датотеке за
задавање кодног распореда. Подразумевано, ове датотеке се налазе у директоријуму
/usr/share/cups/charsets. Простим копирањем датотеке
/usr/share/cups/charsets/pdf.utf-8.simple у датотеку у корисничком
директоријуму, рецимо ~/.config/cups/charsets/pdf.utf-8.custom, и креирањем
симболичке везе од те датотеке до pdf.utf-8 у истом директоријуму, можемо
texttopdf-у задати произвољан фонт, ако поставимо променљиву CUPS_DATADIR
.
$ CUPS_DATADIR=~/.config/cups CHARSET=utf-8 \ /usr/lib/cups/filter/texttopdf 1 1 1 1 1 \ < file.txt > file.pdf
Фонт се може задати на два начина: преко fontconfig-овог имена фонта, или преко апсолутне путање ка .ttf или .otf датотеци. Рецимо:
charset utf8 0000 04FF ltor single /usr/local/share/fonts/iosevkanf/Iosevka_Nerd_Font_Complete.ttf 0500 05FF rtol single /usr/local/share/fonts/iosevkanf/Iosevka_Nerd_Font_Complete.ttf 3000 9FFF ltor double ARPLUmingCN
поставља дати TTF фонт као фонт којим ће бити исписан текст у PDF датотеци.
Недостаци овог приступа су, ипак, што добијени PDF не може да се претражује и што се фонт уграђује у целости. Ово се може отклонити позивањем програма pdftocairo из пакета poppler:
$ pdftocairo file.pdf -pdf file-optimized.pdf
Пошто програм texttopdf функционише као традиционални Уникс алати, односно чита податке са stdin-а и исписује их на stdout, овако се може креирати PDF датотека не само од постојеће текстуалне датотеке, већ и од произвољно добијеног текста послатог на stdin:
$ df -h | CUPS_DATADIR=~/.config/cups CHARSET=utf-8 \ /usr/lib/cups/filter/texttopdf 1 1 1 1 1 \ > df-listing.pdf
Рецимо, може се искористити мој програм table да се форматира CSV датотека и излаз конвертује у PDF. На пример, нека је датотека sales.csv:
"Item","Q1 2020","Q2 2020","Q3 2020","Q4 2020" "Toothpick","15.2","12","","10" "Teapot","1.2","","5","3.5"
Наредбама:
$ table -n sales.csv | CUPS_DATADIR=~/.config/cups CHARSET=utf-8 \ /usr/lib/cups/filter/texttopdf 1 1 1 1 1 \ > sales-unoptimized.pdf $ pdftocairo sales-unoptimized.pdf -pdf sales.pdf
добијамо датотеку sales.pdf:
$ ls -l -rw-r--r-- 1 strajder strajder 191159 12. окт. у 20:24 sales-unoptimized.pdf -rw-r--r-- 1 strajder strajder 12459 12. окт. у 20:25 sales.pdf
Ако наредбу којом позивамо texttopdf „спакујемо“ у алијас, нпр:
alias txt2pdf='CUPS_DATADIR=~/.config/cups CHARSET=utf-8 \ /usr/lib/cups/filter/texttopdf 1 1 1 1 1'
прва наредба добија далеко једноставнији облик:
$ table -n sales.csv | txt2pdf > sales-unoptimized.pdf
Наравно, мислим да не треба ни помињати да цео процес траје знатно брже од самог покретања неког процесора текста.