PDFで長方形を塗りつぶしなしに描く方法:簡単操作ガイド

PDFで長方形を塗りつぶしなしに描く方法:簡単操作ガイド

PDFを扱うとき、図形を描画して見た目を整えることはよくあるタスクです。
「図形は描画するけど塗りつぶしはしたくない」――それは描画オプションの一つとして「枠線だけ」を表示したい場合です。
ここでは、実際にPDFに長方形を描く際に「塗りつぶし無し(stroke だけ)」を実装するためのステップと、代表的なライブラリ(Python:ReportLab、Java:iText、Java:PDFBox)のサンプルコードを紹介します。
さらに、Adobe Acrobat で手動で行う方法や、よくある質問にも触れますので、PDF作成に不慣れな方でも安心です。

このガイドを読めば、PDFに「塗りつぶしなし」の長方形を描く基本的な手順がわかり、実際のアプリケーションで簡潔に実装できるようになるはずです。


1. まずは「塗りつぶしなし」の意味を理解しよう

PDF では図形を描く際に stroke(枠線)fill(塗りつぶし) の二つが主要な描画属性です。

  • stroke だけ指定した場合:図形の境界線だけが描画され、中身は透明。
  • fill だけ指定した場合:図形の中が塗りつぶされ、線は描画されない。
  • 両方指定した場合:境界線 + 塗りつぶしの両方が描画されます。

今回の目的は「長方形の枠線だけを描く」ことです。

ポイントstroke を実行し、fill を実行しないか、フラグとしてsetFillColor(null) などを行う。


2. PDF の描画モデルを把握する

PDF の描画命令は PostScript(PS)のようなページ描画言語 で構成されます。
長方形を描くには以下のような手順があります(擬似コード):

1. moveTo(x, y)        // 長方形の左下角へ
2. lineTo(x+width, y)   // 右下角へ
3. lineTo(x+width, y+height) // 右上角へ
4. lineTo(x, y+height) // 左上角へ
5. closePath()         // 終了点へ戻す
6. stroke()            // 線で描く

また、長方形を塗りつぶす場合は fill() を呼びます。
この stroke() を呼び出すことでのみ枠線が描画され、fill() を呼ばない限り中身は透明になります。


3. Python(ReportLab)で長方形を塗りつぶし無しに描く

ReportLab は Python で PDF を生成する代表的なライブラリです。
canvas オブジェクトを使って簡単に図形を描けます。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.colors import HexColor

def draw_rectangle_without_fill(output_path, rect_spec):
    c = canvas.Canvas(output_path, pagesize=A4)

    # 長方形の設定:位置 (x, y) とサイズ
    x, y, width, height = rect_spec

    # 線の太さと色
    c.setLineWidth(2)            # 2pt の太さ
    c.setStrokeColor(HexColor('#FF0000'))  # 赤色

    # 塗りつぶしなしで長方形を描く
    c.rect(x, y, width, height, stroke=1, fill=0)  # stroke=1, fill=0

    c.showPage()
    c.save()

# 例:横位置 50mm、縦位置 50mm、幅 100mm、高さ 70mm
rect = (50 * 2.834645, 50 * 2.834645, 100 * 2.834645, 70 * 2.834645)  # mm → pt
draw_rectangle_without_fill("output.pdf", rect)

重要ポイント

  • rect(..., stroke=1, fill=0)stroke をオン、fill をオフに設定。
  • setStrokeColorsetLineWidth は線の色・太さを決定。
  • 位置は PDF の座標系で、デフォルトは左下が原点、単位はポイント(1pt ≈ 0.3528mm)です。

4. Java(iText 7)で描く方法

iText は Java と .NET で PDF を生成するのに広く使われるライブラリです。
iText7 では Canvas オブジェクトと DeviceGray などの色クラスを利用します。

import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Rectangle;
import com.itextpdf.kernel.colors.Color;
import com.itextpdf.kernel.colors.DeviceRgb;

public class RectangleWithoutFill {
    public static void main(String[] args) throws Exception {
        String dest = "output.pdf";
        PdfWriter writer = new PdfWriter(dest);
        PdfDocument pdf = new PdfDocument(writer);
        Document doc = new Document(pdf);

        // 長方形を作成
        Rectangle rect = new Rectangle(50, 50, 100, 70); // 位置 & サイズ
        rect.setStrokeColor(new DeviceRgb(255, 0, 0));   // 赤
        rect.setStrokeWidth(2);                          // 2pt
        rect.setFill(Color.TRANSPARENT);                 // 塗りつぶし無し

        // 画像として配置
        com.itextpdf.layout.element.Image img = new com.itextpdf.layout.element.Image(rect);
        doc.add(img);

        doc.close();
    }
}

補足事項

  • setFill(Color.TRANSPARENT) で塗りつぶし色を透明に設定。
  • StrokeColorStrokeWidth で枠線を制御。
  • PDFBox や iText では Rectangle クラスをそのまま描画すると図形自体ではなく画像として扱われるため、上記のように Image へ変換するテクニックがあります。

5. PDFBox(Java)で枠線だけを描画する

PDFBox は Apache 社がメンテナンスしている 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.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;

import java.io.IOException;

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

        try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
            // 線の色・太さ
            contents.setStrokingColor(new PDColor(new float[]{1, 0, 0}, PDDeviceRGB.INSTANCE)); // 赤
            contents.setLineWidth(2);

            // 長方形描画(stroke だけ)
            float x = 50, y = 50, width = 100, height = 70;
            contents.addRect(x, y, width, height); // まず長方形パスを追加
            contents.stroke(); // 線で描く
            // contents.fill(); // ここでは呼びません
        }

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

ポイント

  • contents.addRect(x, y, width, height) で長方形パスを作成。
  • contents.stroke() だけを呼び出すことで枠線のみが描かれる。
  • contents.fill() を呼ばなければ fill はされない。

6. Adobe Acrobat で「塗りつぶし無し」を手動で描く方法

Adobe Acrobat の「編集」→「注釈とコメント」で図形を描く際、設定メニューから「塗りつぶし」色を 透明 に設定すれば枠線だけが描画されます。

手順は以下の通りです。

  1. 注釈ツール長方形 を選択。
  2. 画面右側に スタイル パネルが表示されるはず。
  3. 「線の色」を設定(例:黒)し、「塗りつぶし」 色を 透明 に設定(色選択で透明アイコンを押す)。
  4. PDF 上に長方形をドラッグしてサイズを決定。

この方法は PDF を生成するアプリがなくても、既存の PDF に後から枠線だけを描く際に便利です。


7. よくある質問(FAQ)

質問 回答
Q1:stroke=1, fill=0 を使わないといけない? 多くのライブラリではデフォルトで stroke がオン・fill がオフです。fill は明示的に呼ぶまで描画されませんが、確実にするために fill=0 を指定すると安全です。
Q2:SVG で PDF への埋め込み時に同じように枠線だけにしたい場合は SVG で <rect fill="none" stroke="#ff0000" stroke-width="2" /> と設定すれば、PDF 生成ツール(Inkscape、GhostScript 等)で書きだすと枠線だけになります。
Q3:線が太くなりすぎると文字が重なる setLineWidth で太さを調整し、setStrokingColor で適切な色を。文字と図形が重なる場合は図形の位置を微調整するか、透過度を調整して視認性を保ちます。
Q4:PDF 内の既存図形の塗りつぶしだけ取り除きたい PDFBox で PDPageContentStream を既存コンテンツに追加し、q / Q の保存・復元を利用して「fill」を無効にする手法があります。詳細は ContentStreamProcessor を利用してください。
Q5:長方形を描いた後に別の図形を描きたい PDPageContentStream で描画は順序が重要です。最初に長方形を描き、その後に別図形を描くと正しくレイヤー付きで表示されます。

8. まとめ

  • 「塗りつぶしなし」は stroke を有効にし、fill を無効にするだけ
  • ReportLab(Python)、iText(Java)、PDFBox(Java)ではそれぞれ短いコードで実装できます。
  • Adobe Acrobat でも手動で透明塗りつぶしを設定すれば同じ結果。
  • カスタム描画が必要な場合は PDF の描画命令setLineWidthsetStrokeColorrectstroke)を覚えておきましょう。
  • 生成した PDF は、閲覧者や印刷時に枠線だけが残るので、図表や注釈としても使えます。

これで「PDFに塗りつぶしなしで長方形を描く」技術が確実に身につき、プロジェクトにスムーズに組み込めるようになるはずです。ぜひコピペで試してみてくださいね。

コメント