0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python で CSV を PDF に変換する方法

0
Posted at

CSV ファイルはデータ交換用のシンプルな形式として広く使われていますが、取引先への共有や社内での承認フローにおいては、レイアウトが整った PDF 形式が求められることがあります。表形式のデータを見やすく整形し、編集不可の状態で配布したい場合などが該当します。

この記事では、Spire.XLS for Python を使用して CSV ファイルを PDF に変換する手順を、具体的なコード例とともに解説します。

Spire.XLS for Python の概要

Spire.XLS for Python は、Python 環境から Excel ファイルの読み込み、作成、編集、変換を行うためのライブラリです。.NET向けに開発された Spire.XLSをPython から利用できるようにしたもので、以下のような操作が可能です。

  • Excel ワークブックの読み込みと新規作成
  • セルデータの読み取りと書き込み
  • 数式や書式の設定
  • グラフや画像の操作
  • PDF、CSV、HTML、画像などの各種形式への変換
  • Windows、Linux、macOS での動作

このライブラリには無料版と有料版があります。無料版ではシートあたりの変換可能な行数や列数に上限が設けられています。大規模なファイルを扱う場合は、事前に公式の制限事項を確認する必要があります。

環境の準備

Spire.XLS for Python は PyPI に登録されており、以下のコマンドでインストールできます。

pip install Spire.XLS

インストールが完了したら、Python スクリプト内で必要なクラスをインポートして使用します。

from spire.xls import Workbook
from spire.xls import FileFormat

CSV を PDF に変換する基本的な考え方

Spire.XLS for Python は、CSV ファイルを直接PDFに変換する専用のメソッドは提供していません。そのため、以下の 2 段階の手順で変換を行います。

  1. CSV ファイルを Excel ワークブックとして読み込む
  2. 読み込んだワークブックを PDF として保存する

この方法により、CSV のデータを表形式の PDF 文書として出力できます。また、PDF 出力前に列幅の調整やフォント設定などの整形処理を加えることも可能です。

基本的な変換手順

CSV ファイルをそのまま PDF に変換する

以下のコードは、CSV ファイルを読み込み、そのまま PDF として保存する例です。

from spire.xls import Workbook
from spire.xls import FileFormat

# Workbookオブジェクトの作成
workbook = Workbook()

# CSV ファイルの読み込み
workbook.LoadFromFile("data.csv", ",")

# PDF として保存
workbook.SaveToFile("output.pdf", FileFormat.PDF)

# リソースの解放
workbook.Dispose()

LoadFromFile メソッドの第2引数には、CSV ファイルの区切り文字を指定します。カンマ区切りの場合は ","、タブ区切りの場合は "\t" を指定します。この引数を省略した場合、既定ではカンマ区切りとして扱われます。

区切り文字を指定して読み込む

CSV ファイルによっては、カンマ以外の区切り文字が使われている場合があります。たとえば、タブ区切り(TSV)やセミコロン区切りのファイルを読み込む際は、以下のように区切り文字を明示的に指定します。

from spire.xls import Workbook
from spire.xls import FileFormat

workbook = Workbook()

# タブ区切りファイルの読み込み
workbook.LoadFromFile("data.tsv", "\t")
workbook.SaveToFile("output.pdf", FileFormat.PDF)

workbook.Dispose()

文字コードの指定

日本語の CSV ファイルでは、Shift-JIS や EUC-JP など UTF-8 以外の文字コードで保存されていることがあります。Spire.XLS for Python の LoadFromFile メソッドは、ファイルの文字コードを自動判別しようと試みますが、環境によっては正しく判別されず文字化けが発生することがあります。

そのような場合は、Python の標準機能で事前に文字コードを変換してから読み込む方法があります。

from spire.xls import Workbook
from spire.xls import FileFormat

# Shift-JIS の CSV ファイルを UTF-8 に変換してから読み込む
input_file = "data_sjis.csv"
temp_file = "temp_utf8.csv"

with open(input_file, "r", encoding="shift_jis") as f:
    content = f.read()

with open(temp_file, "w", encoding="utf-8") as f:
    f.write(content)

workbook = Workbook()
workbook.LoadFromFile(temp_file, ",")
workbook.SaveToFile("output.pdf", FileFormat.PDF)
workbook.Dispose()

この方法はライブラリ自体の機能ではなく、Python の標準機能を併用したものです。

PDF 出力のレイアウト調整

CSV ファイルをそのままPDFに変換すると、すべての列が同じ幅で出力され、セル内のデータが途中で途切れて表示されることがあります。これは、CSV ファイルには列幅や書式の情報が含まれていないためです。以下のように、PDF 出力前に列幅やページ設定を調整することで、より見やすい PDF を作成できます。

列幅の自動調整

from spire.xls import Workbook
from spire.xls import FileFormat

workbook = Workbook()
workbook.LoadFromFile("data.csv", ",")

worksheet = workbook.Worksheets[0]

# データが存在する範囲の列幅を自動調整
for col in range(1, worksheet.LastColumn + 1):
    worksheet.AutoFitColumn(col)

# PDF として保存
workbook.SaveToFile("output.pdf", FileFormat.PDF)
workbook.Dispose()

AutoFitColumn メソッドは、指定した列の内容に合わせて列幅を自動的に調整します。行と列のインデックスは1から始まります。

ページ設定の調整

印刷時の用紙サイズや向き、余白を設定することで、PDF 出力のレイアウトを制御できます。

from spire.xls import Workbook
from spire.xls import FileFormat
from spire.xls import PageOrientationType
from spire.xls import PaperSizeType

workbook = Workbook()
workbook.LoadFromFile("data.csv", ",")

worksheet = workbook.Worksheets[0]

# 列幅の自動調整
for col in range(1, worksheet.LastColumn + 1):
    worksheet.AutoFitColumn(col)

# ページ設定
page_setup = worksheet.PageSetup
page_setup.Orientation = PageOrientationType.Landscape  # 横向き
page_setup.PaperSize = PaperSizeType.PaperA4            # A4 サイズ
page_setup.FitToPagesWide = 1                           # 横方向を 1 ページに収める
page_setup.FitToPagesTall = 0                           # 縦方向はページ数を自動調整

workbook.SaveToFile("output.pdf", FileFormat.PDF)
workbook.Dispose()

FitToPagesWide に 1 を指定することで、すべての列が 1 ページの幅に収まるように拡大縮小されます。列数が多いCSVファイルでは、横向き(Landscape)に設定することで可読性が向上する場合があります。

ヘッダー行の書式設定

CSV ファイルの 1 行目を見出し行として扱い、フォントや背景色を設定することで、PDF 出力時の可読性を高めることができます。

from spire.xls import Workbook
from spire.xls import FileFormat

workbook = Workbook()
workbook.LoadFromFile("data.csv", ",")

worksheet = workbook.Worksheets[0]

# 1 行目(ヘッダー行)の書式設定
header_row = worksheet.Rows[0]
header_row.Style.Font.IsBold = True
header_row.Style.Color = "#4472C4"  # 背景色

# 列幅の自動調整
for col in range(1, worksheet.LastColumn + 1):
    worksheet.AutoFitColumn(col)

workbook.SaveToFile("output.pdf", FileFormat.PDF)
workbook.Dispose()

変換時の注意点

無料版の制限

Spire.XLS for Python の無料版では、1シートあたりの変換可能な行数と列数に制限があります。公式ドキュメントによると、無料版は1シートあたり 200 行、30 列までのデータが対象です(バージョンによって異なる可能性があります)。この制限を超えるデータを扱う場合は、pandas など別のライブラリと組み合わせて PDF を生成する方法も検討する必要があります。

データ型の扱い

CSV ファイルにはデータ型の情報が含まれていないため、すべての値が文字列として読み込まれます。たとえば、数値データも文字列として扱われるため、Excel で開いた場合とは表示が異なることがあります。PDF 出力時に数値の表示形式を整えたい場合は、読み込み後にセルの書式を個別に設定する必要があります。

大きな CSV ファイルの処理

行数や列数が多い CSV ファイルを読み込む際、LoadFromFile メソッドはファイル全体をメモリに読み込みます。非常に大きなファイルではメモリ使用量が増加するため、環境によっては処理速度の低下やメモリ不足が発生する可能性があります。

メモリ管理

Workbook オブジェクトは処理後に Dispose メソッドでリソースを解放することが推奨されています。特に複数のファイルを連続して処理する場合は、メモリリークを防ぐために適切な解放処理が必要です。

他のライブラリとの比較

Python で CSV を PDF に変換する方法はいくつか存在します。

方法 特徴
Spire.XLS for Python CSV を Excel ワークブックとして読み込み、PDF 出力。列幅調整やページ設定が可能。無料版は行数・列数に制限あり。
pandas + matplotlib CSV を DataFrame に読み込み、表を描画して PDF 出力。グラフとの組み合わせが容易。
ReportLab PDF を直接生成。自由度が高いが、表組みを自力で実装する必要がある。
csv + fpdf2 標準ライブラリの csv と軽量 PDF ライブラリの組み合わせ。小規模なファイル向け。

Spire.XLS for Python を使用する方法では、CSV を表形式の PDF に変換する際、列幅の自動調整やページ設定などの整形処理をAPIで記述できます。一方で、無料版には行数・列数の制限があるため、大規模なデータを扱う場合は他の方法を選択する必要があります。

実用的なユースケース

以下は、複数の CSV ファイルをまとめて PDF に変換するバッチ処理の例です。特定のディレクトリ内のすべての .csv ファイルを対象とし、列幅の自動調整とページ設定を適用した上で PDF として出力します。

import os
from spire.xls import Workbook
from spire.xls import FileFormat
from spire.xls import PageOrientationType
from spire.xls import PaperSizeType

target_dir = "./csv_files"
output_dir = "./pdf_output"

# 出力先ディレクトリがなければ作成
os.makedirs(output_dir, exist_ok=True)

# ディレクトリ内の全 .csv ファイルを処理
for filename in os.listdir(target_dir):
    if filename.endswith(".csv"):
        workbook = Workbook()
        filepath = os.path.join(target_dir, filename)
        workbook.LoadFromFile(filepath, ",")
        
        worksheet = workbook.Worksheets[0]
        
        # 列幅の自動調整
        for col in range(1, worksheet.LastColumn + 1):
            worksheet.AutoFitColumn(col)
        
        # ページ設定
        page_setup = worksheet.PageSetup
        page_setup.Orientation = PageOrientationType.Landscape
        page_setup.PaperSize = PaperSizeType.PaperA4
        page_setup.FitToPagesWide = 1
        page_setup.FitToPagesTall = 0
        
        output_filename = f"{os.path.splitext(filename)[0]}.pdf"
        output_path = os.path.join(output_dir, output_filename)
        workbook.SaveToFile(output_path, FileFormat.PDF)
        
        workbook.Dispose()

このスクリプトを利用することで、多数の CSV ファイルを一括で整形済みの PDF に変換できます。

まとめ

Spire.XLS for Python を使用すると、CSV ファイルを Excel ワークブックとして読み込み、PDF 形式で出力できます。列幅の自動調整やページ設定、ヘッダー行の書式設定などを組み合わせることで、CSV データを整形された PDF 文書として出力することが可能です。

導入にあたっては、無料版の行数・列数の制限や、文字コードの扱い、メモリ管理について事前に確認することが重要です。また、処理後は Dispose メソッドでリソースを解放することを推奨します。

用途やデータの規模に応じて適切なツールを選択し、効率的なデータ処理を実現してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?