📑

【Python】様々な拡張子のソースコードをまとめてPDFに変換する

2024/08/07に公開

1.はじめに

今回はPythonを使って様々な拡張子のソースコードをまとめてPDFに変換することができるスクリプトを作成しました。

本記事で紹介するスクリプトを使用すると以下のような場面で役に立つかと思います。

  • RAGにソースコードをPDFとして与えて参照させたい
  • 複数のソースコードを一括でPDF変換したい
  • ソースコードを会議などで配布/印刷したい

本記事で紹介するソースコードは以下で公開しております。
https://github.com/is0383kk/SourceFile2PDF

2.ソースコードと結果

先にソースコードと出力されたPDFを紹介します。
なお、実行に必要なライブラリは以下の通りです。

必要なライブラリ バージョン
os
sys
fpdf2 2.7.9
$ python -m pip install fpdf2 

■ ConvertSrc2Pdf_jp.py

import os
import sys
from fpdf import FPDF

class PDF(FPDF):
    # Header and Footer
    # If you can use Header and Footer, you can use the following code
    
    '''
    def header(self):
        self.set_font('IPAexGothic', '', 10)
        self.cell(0, 10, 'src to PDF Converter', 0, 1, 'C')

    def footer(self):
        self.set_y(-15)
        self.set_font('IPAexGothic', '', 8)
        self.cell(0, 10, f'Page {self.page_no()}', 0, 0, 'C')
    '''

def src_to_pdf(src_path, pdf_path):
    # Open src file with UTF-8 encoding
    with open(src_path, 'r', encoding='utf-8') as src_file:
        src_content = src_file.read()

    pdf = PDF()
    pdf.add_font('IPAexGothic', '', os.getcwd()+'/ipaexg.ttf')
    pdf.set_font('IPAexGothic', size=10)
    pdf.add_page()
    pdf.set_auto_page_break(auto=True, margin=15)

    for line in src_content.split('\n'):
        line = line.replace('\t', '    ')
        pdf.cell(w=0, h=pdf.font_size * 1.5 ,text=line.encode('utf-8').decode('utf-8'))
        pdf.ln()
    
    # Convert
    try:
        pdf.output(pdf_path)
        print(f"Success:{src_path} => {pdf_path}")
    except Exception as e:
        print(f"Failed:{pdf_path}")

def convert_all_src_to_pdf(folder):
    for filename in os.listdir(folder):
        if filename.endswith(str(sys.argv[1])):
            src_path = os.path.join(folder, filename)
            file_name = os.path.basename(src_path)
            pdf_name = os.path.splitext(file_name)[0] + ".pdf"
            pdf_path = os.path.join(folder+"/pdf", pdf_name)
            src_to_pdf(src_path, pdf_path)

if __name__ == "__main__":
    # Specify the folder where the src file you want to convert to PDF is located
    target_folder = os.getcwd()

    os.makedirs(target_folder+"/pdf", exist_ok=True)
    convert_all_src_to_pdf(target_folder)

■ 生成されるPDF

今回は「ConvertSrc2Pdf_jp.py」をそのままPDF化してみました。
生成されたPDFは以下のようになります。
https://github.com/is0383kk/SourceFile2PDF/blob/main/pdf/ConvertSrc2Pdf_jp.pdf

3.スクリプトの使用方法

本記事で紹介するスクリプトの使用方法を紹介します。

■ PDF変換したいファイルを配置する

カレントディレクトリ配下に変換元となるソースコードを配置します。
※日本語用フォントが必要です(ipaexg.ttf)
 GitからCloneするとそのまま使えるかと思います。

カレントディレクトリ
 |- ConvertSrc2Pdf_jp.py
 |- ipaexg.ttf(日本語用フォント)
 |- Sample001.java
 |- Sample002.java
※ここでは変換したいソースコードを「Java」ファイルとして説明します。

■ スクリプトを実行する

スクリプトを実行します。
コマンドライン引数にソースコードの拡張子を与えて実行します。

$ python ConvertSrc2Pdf_jp.py .java

■ PDFが生成される

pdfフォルダ配下に変換されたPDFが生成されます。

カレントディレクトリ
|- ConvertSrc2Pdf_jp.py
 |- ipaexg.ttf(日本語用フォント)
 |- Sample001.java
 |- Sample002.java
 |- pdf
   |- Sample001.pdf
   |- Sample002.pdf

付録

ipaexg.ttfが読み込まれない場合

以下手順をお試しください。

  • ipaexg00401」をダウンロードする。
  • ZIPファイルを解凍し、「ipaexg.ttf」をスクリプトを実行するフォルダに配置する。
  • ソースコード内の「ttf」を指定する部分をフルパスに修正する。

【変更前】

pdf.add_font('IPAexGothic', '', os.getcwd()+'/ipaexg.ttf')

【変更後】

pdf.add_font('IPAexGothic', '', r"フルパス")

Discussion