まずは、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()の最終引数fillを0にするだけで塗りつぶしがオフになります。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()のfillにNoneを渡すことで塗りつぶしを無効化します。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 の設定ミス |
lineWidth や strokeWeight を 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 生成コードを書いてみましょう!


コメント