Notebook

これは日々の作業を通して学んだことや毎日の生活で気づいたことをを記録しておく備忘録である。

HTML ファイル生成日時: 2026/08/10 20:19:44.797 (台灣標準時)

weasyprint を使ってテキストファイルを PDF に変換する方法

weasyprint を使うと、テキストファイルを簡単に PDF ファイルに変換するこ とができるようなので、試しにプログラムを書いてみたでござる。実際には、 HTML ファイルを用意して、それを PDF ファイルに変換するようでござる。

以下のようなコードを準備してみたでござる。


#!/usr/bin/env python3

#
# Time-stamp: <2026/08/10 18:16:39 (UT+08:00) daisuke>
#

# importing argparse module
import argparse

# importing weasyprint module
import weasyprint

# main function
def main ():
    # HTML header
    html_header = f"""
<!DOCTYPE html>
<html lang="___LANG___">
<head>
    <meta charset="UTF-8">
    <style>
        @page {{
            size: ___PAGESIZE___;
            margin: ___MARGIN___mm;
        }}
        body {{
            font-family: '___FONTNAME___', ___FONTTYPE___;
            font-size: ___FONTSIZE___px;
            white-space: pre-line;
            word-break: break-all;
            /* 均等割付 */
            text-align: justify;
            text-align-last: left;
            /* 禁則処理 */
            line-break: strict;
            overflow-wrap: break-word;
            /* ハイフネーション */
            hyphens: auto;
        }}
    </style>
</head>
<body>
    """

    # HTML footer
    html_footer = f"""
</body>
</html>
    """
    
    # initialising a parser
    descr  = f'UTF-8 text file to PDF converter'
    parser = argparse.ArgumentParser (description=descr)

    # choices
    list_lang = [
        'en', \
        'ja', \
        'zh-TW', \
    ]
    list_pagesize = [
        'A1', \
        'A2', \
        'A3', \
        'A4', \
        'A5', \
        'A6', \
    ]
    list_font = [
        'Noto Sans', 'Noto Serif', \
        'Noto Sans CJK JP', 'Noto Serif CJK JP', \
        'Noto Sans TC', 'Noto Serif TC', \
    ]

    # adding arguments
    parser.add_argument ('-i', '--input', default='input.txt', \
                         help='input text file (default: input.txt')
    parser.add_argument ('-o', '--output', default='output.pdf', \
                         help='output PDF file (default: output.pdf)')
    parser.add_argument ('-l', '--lang', default='ja', \
                         choices=list_lang, \
                         help='language (default: ja)')
    parser.add_argument ('-p', '--pagesize', default='A4', \
                         choices=list_pagesize, \
                         help='page size (default: A4)')
    parser.add_argument ('-m', '--margin', type=int, default=15, \
                         help='margin in mm (default: 15)')
    parser.add_argument ('-f', '--fontname', default='Noto Sans CJK JP', \
                         choices=list_font, \
                         help='font name (default: Noto Sans CJK JP)')
    parser.add_argument ('-s', '--fontsize', type=int, default=14, \
                         help='font size in pixel size (default: 14)')

    # parsing arguments
    args = parser.parse_args ()

    # arguments
    file_text = args.input
    file_pdf  = args.output
    lang_name = args.lang
    margin_mm = args.margin
    page_size = args.pagesize
    font_name = args.fontname
    font_size = args.fontsize

    # opening input file
    with open (file_text, 'r') as fh_in:
        # reading input file
        data_text = fh_in.read ()

    # making HTML header
    html_header = html_header.replace ('___LANG___', lang_name)
    html_header = html_header.replace ('___MARGIN___', f'{margin_mm}')
    html_header = html_header.replace ('___PAGESIZE___', page_size)
    html_header = html_header.replace ('___FONTNAME___', font_name)
    html_header = html_header.replace ('___FONTSIZE___', f'{font_size}')
    if ('Sans' in font_name):
        html_header = html_header.replace ('___FONTTYPE___', 'sans-serif')
    elif ('Serif' in font_name):
        html_header = html_header.replace ('___FONTTYPE___', 'serif')

    # making HTML
    data_html = html_header + data_text + html_footer

    # making PDF file
    weasyprint.HTML (string=data_html).write_pdf (file_pdf)
            
# execution of main function
if (__name__ == '__main__'):
    main ()

例えば、以下のようにすれば、テキストファイルを PDF ファイルに変換して くれたでござる。


% text2pdf.py -h
usage: text2pdf.py [-h] [-i INPUT] [-o OUTPUT] [-l {en,ja,zh-TW}]
                   [-p {A1,A2,A3,A4,A5,A6}] [-m MARGIN]
                   [-f {Noto Sans,Noto Serif,Noto Sans CJK JP,Noto Serif CJK JP,Noto Sans TC,Noto Serif TC}]
                   [-s FONTSIZE]

UTF-8 text file to PDF converter

options:
  -h, --help            show this help message and exit
  -i, --input INPUT     input text file (default: input.txt
  -o, --output OUTPUT   output PDF file (default: output.pdf)
  -l, --lang {en,ja,zh-TW}
                        language (default: ja)
  -p, --pagesize {A1,A2,A3,A4,A5,A6}
                        page size (default: A4)
  -m, --margin MARGIN   margin in mm (default: 15)
  -f, --fontname {Noto Sans,Noto Serif,Noto Sans CJK JP,Noto Serif CJK JP,Noto Sans TC,Noto Serif TC}
                        font name (default: Noto Sans CJK JP)
  -s, --fontsize FONTSIZE
                        font size in pixel size (default: 14)

% text2pdf.py -l ja -p A4 -m 20 -f 'Noto Serif CJK JP' -s 16 -i sample.txt -o sample.pdf



Frequently accessed files

  1. Computer___Network/20260127_00.html
  2. Misc___Taiwan/20240207_00.html
  3. Computer___NetBSD/20250301_01.html
  4. Misc___Taiwan/20240819_00.html
  5. Computer___TeX/20231107_00.html
  6. Book___Chinese/20240424_00.html
  7. Computer___TeX/20240414_01.html
  8. Misc___Japan/20240610_00.html
  9. Computer___TeX/20240411_00.html
  10. Computer___Network/20241214_00.html
  11. Computer___TeX/20230726_01.html
  12. Computer___Python/20230803_00.html
  13. Misc___Japan/20240718_00.html
  14. Misc___Taiwan/20240903_01.html
  15. Computer___Network/20230516_00.html
  16. Computer___NetBSD/20230119_00.html
  17. Computer___NetBSD/20250113_00.html
  18. Computer___FreeBSD/20220621_0.html
  19. Computer___TeX/20240414_00.html
  20. Computer___Network/20240130_00.html
  21. Computer___TeX/20240410_00.html
  22. Computer___Python/20250330_00.html
  23. Computer___NetBSD/20220818_1.html
  24. Computer___NetBSD/20250307_00.html
  25. Computer___NetBSD/20240805_03.html
  26. Computer___TeX/20230503_00.html
  27. Computer___Python/20240101_00.html
  28. Computer___NetBSD/20240101_03.html
  29. Computer___Network/20220413_1.html
  30. Computer___NetBSD/20220406_0.html


HTML file generated by Kinoshita Daisuke.