//strahinja.org | Профил Блог Програми Текстови Портфолио

Од текста до 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

Наравно, мислим да не треба ни помињати да цео процес траје знатно брже од самог покретања неког процесора текста.