pdfで図形を描く際に塗りつぶしなしにする方法:初心者向けガイド

まずは、PDF で図形を描画する際に「塗りつぶし(fill)」を意図的に行わない設定がどのような意味を持つのか、そしてそれを実現するために必要な概念やツールをざっくりと掴んでいきましょう。初心者向けに、特定のプログラミング言語やライブラリに注目しつつ、汎用的な考え方を並べてみます。

1. PDFで図形を描くときの基本パラメータ

PDF ファイルでは図形(パス)を描画するとき、基本的に 塗りつぶし(fill)ストローク(stroke) の二つの属性を設定します。

  • Fill(塗りつぶし)
    • パスの内部領域を特定の色やパターンで埋めます。
    • 何も設定しないとデフォルトで 塗りつぶし付き になります。
  • Stroke(ストローク)
    • パスの境界線を描画します。
    • 線の太さ、スタイル(実線・点線・破線)、カラーストロークなどを指定します。

「塗りつぶしなしにする」= Fill をオフ にし、Stroke のみ を有効化することです。
実際に PDF に描画するには、ライブラリやツールが提供する API でこれらを設定します。
下記では、Python(ReportLab、PyMuPDF)、JavaScript (PDFKit、PDFLib)、Java (PDFBox)、そして SVG から PDF への変換ツールを例に挙げます。

2. Python → ReportLab(低レベル)

ReportLab は Python で PDF を生成する際の代表的なライブラリです。
ステートメントの書き方は比較的直感的です。

from reportlab.pdfgen import canvas
from reportlab.lib import colors

c = canvas.Canvas("output.pdf")

# 線の太さを 2 ポイントにする
c.setLineWidth(2)

# ストロークカラーを赤に設定
c.setStrokeColor(colors.red)

# 塗りつぶしは無効化(色を透明に設定)→ ただし ReportLab では fillColor が自動的に設定されているので
c.setFillColor(colors.white)   # ここで白を入れると見えにくいので実際には setFillColor(None) などが必要
c.setFillColorRGB(1, 1, 1, alpha=0)   # alpha=0 で完全透明に

# 例:矩形を描画
c.rect(100, 600, 200, 100, stroke=1, fill=0)  # fill=0 で塗りつぶしなし

# 例:円を描く(塗りつぶしなし)
c.circle(400, 400, 50, stroke=1, fill=0)

c.showPage()
c.save()

ポイント

  • rect()circle() の最終引数 fill0 にするだけで塗りつぶしがオフになります。
  • setFillColor を透明に設定すると「見えない塗りつぶし」を作成できますが、明示的に fill=0 を設定した方が確実です。

3. Python → PyMuPDF(MuPDF)の使い方

PyMuPDF は fitz とも呼ばれ、MuPDF エンジンを Python で使えるようにしたものです。
図形描画は「パス(Path)」として追加します。

import fitz  # pip install pymupdf

doc = fitz.open()
page = doc.new_page()

# ストローク設定
stroke_color = (1, 0, 0)      # 赤
stroke_width = 2

# 塗りつぶしなしの場合、fill_color は None
path = page.newShape()

# 例:四角形を描く
path.rect(100, 600, 200, 100)          # 座標は (x, y, width, height)
path.finish(stroke=stroke_color, color=stroke_color, width=stroke_width, fill=None)

# 例:円を描く
x, y, r = 400, 400, 50
path.circle(x, y, r)
path.finish(stroke=stroke_color, color=stroke_color, width=stroke_width, fill=None)

doc.save("output.pdf")

ヒント

  • path.finish()fillNone を渡すことで塗りつぶしを無効化します。
  • color パラメータはストロークカラーに使います。
  • stroke パラメータは塗りつぶしカラーとしても受け付けますが、ここでは無視。

4. JavaScript → PDFKit(Node.js)

PDFKit は Node.js 環境で PDF を生成できる人気の高いライブラリです。
図形の描画は rect(), circle(), line(), bezierCurve() などメソッドを連結して行います。

const PDFDocument = require('pdfkit');
const fs = require('fs');

const doc = new PDFDocument();

doc.pipe(fs.createWriteStream('output.pdf'));

// ストロークカラーと太さ
doc.strokeColor('red').lineWidth(2);

// 例:長方形(塗りつぶしなし)
doc.rect(100, 600, 200, 100).stroke();          // stroke() で塗りつぶしなしになる

// 例:円(塗りつぶしなし)
doc.circle(400, 400, 50).stroke();

doc.end();

重要ポイント

  • stroke() メソッドを呼び出すことで、先に描画されたパスに塗りつぶしなしで線を引きます。
  • fill() を呼ばなければ塗りつぶしは適用されません。

5. Java → PDFBox

Apache PDFBox は Java で PDF を操作・生成するためのオープンソースライブラリです。
図形を描くには PDPageContentStream を使い、ストロークを指定します。

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;

import java.io.IOException;

public class DrawShapes {
    public static void main(String[] args) throws IOException {
        PDDocument doc = new PDDocument();
        PDPage page = new PDPage();
        doc.addPage(page);

        try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
            // ストロークカラー(赤)
            contents.setStrokingColor(1.0f, 0.0f, 0.0f); // RGB

            // 線幅
            contents.setLineWidth(2.0f);

            // 塗りつぶしなしで長方形を描画
            contents.addRect(100, 600, 200, 100);
            contents.stroke();

            // 円を描画(塗りつぶしなし)
            contents.addCircle(400, 400, 50);
            contents.stroke();
        }

        doc.save("output.pdf");
        doc.close();
    }
}

観点

  • stroke() を呼び、fill() は呼ばないことで塗りつぶしなしになっています。
  • setStrokingColor()setLineWidth() で線の色と太さを設定。

6. SVG → PDF(Illustrator・Inkscape・Adobe PDF Print)

SVG を PDF 化する場合、ベクターデータそのまま転送されるため、塗りつぶし属性は SVG のままです。
塗りつぶしなしにしたい 圧縮は SVG を生成する段階で行うか、エクスポート前にツール内で設定します。

ツール 設定手順
Inkscape 「図形の属性(Fill & Stroke)」で Fill を「None」に設定 → 「PDF の書き出し」で「オプション(Advanced)」を開き、**「Fill Color」を Transparent か「なし」に変更。
Adobe Illustrator 「図形」→「図形を選択」→「Fill: None」 → ファイル > 書き出し > 高品質 PDF で「塗りつぶしを保持」オプションに注意。
Adobe PDF Print オプション「Adobe PDF ドキュメントオプション」→「塗りつぶしなし」や「線のみ」を選択。

メモ

  • SVG の fill="none" を設定しておくと、多くの変換ツールはそのまま残します。
  • 変換後の PDF で一部のビューアが「塗りつぶしなし」でも背景色を適用してくるため、ベクターの「透明度」も考慮。

7. 典型的なトラブルと対処法

トラブル 原因 対処法
塗りつぶしが残るまま fill 引数を 0 でない、もしくは fill() を呼んでいる fill=0、または stroke() のみ呼ぶ
ストロークが表示されない 線幅が 0 になっている、もしくは strokeWidth の設定ミス lineWidthstrokeWeight を 1〜2 以上に設定
PDF が大量に大きくなる パス数を多く定義し重複描画している 形状を統合(例:一つの path として描く)、showPage() でページ分割
フォントが埋め込まない ストロークの色がフォント属性に影響 PDF 出力で「テキストとフォントを埋め込む」設定

8. より実践的なケース:複数スタイルの図形を一括で描画

初心者だけでなく中級者向けに、複数の図形をループで生成し、塗りつぶしなしでラインスタイルを揃える 方法も紹介します。

例: 10×10 のグリッド上に四角形を描く(Python + ReportLab)

from reportlab.pdfgen import canvas
from reportlab.lib import colors

doc = canvas.Canvas("grid.pdf")
doc.setLineWidth(1)
doc.setStrokeColor(colors.black)

for i in range(10):
    for j in range(10):
        x = 50 + i*70
        y = 500 - j*70
        size = 50
        # 塗りつぶしなし
        doc.rect(x, y, size, size, stroke=1, fill=0)

doc.showPage()
doc.save()

例: 乱数座標で円を描く(JavaScript + PDFKit)

const PDFDocument = require('pdfkit');
const fs = require('fs');
const doc = new PDFDocument();

doc.pipe(fs.createWriteStream('random_circles.pdf'));
doc.strokeColor('blue').lineWidth(1);

for (let i = 0; i < 50; i++) {
  const x = Math.random() * 500 + 50;
  const y = Math.random() * 500 + 50;
  const r = Math.random() * 30 + 10;
  doc.circle(x, y, r).stroke();
}

doc.end();

ポイント

  • 塗りつぶしレベル0 もしくは none で統一すると見た目がきれい。
  • 一貫した線太さ を設定すると、ページ上で図形が読みにくくならず、プロフェッショナルに見えます。

9. まとめ

  • 塗りつぶしなし は、PDF 生成ライブラリの API で fill=0 / fill=None / ストロークのみ呼び出し によって実現します。
  • 各言語やツールごとにシンタックスは異なりますが、共通の概念は「線のみを描く」だけです。
  • SVG→PDF 変換では、SVG で fill="none" を設定しておくことがベスト。
  • 大規模図形を描く場合は、パスをまとめる重複を避けることで PDF ファイルサイズを抑えられます。
  • 途中で何か問題が起きたら、**パス属性(fill, stroke, lineWidth)**だけでなく、ビューアの描画設定も確認しましょう。

初心者の皆さんは、まず一つの図形を描き、「塗りつぶしなし」で確実に出力できるまで試してみてください。その後、複数シェイプ、ループ、カスタムパスなどへステップアップしていくのが最も効率的です。さあ、自分のプロジェクトに合わせた PDF 生成コードを書いてみましょう!

コメント