Skip to content

フォームフィールドの作成

PDF ドキュメントにインタラクティブなフォームフィールドを追加します。PDF Oxide は標準的な AcroForm ウィジェットをすべてサポートしています。テキストフィールド、チェックボックス、ラジオボタングループ、コンボボックス(ドロップダウン)、リストボックス、プッシュボタンです。

バインディング対応状況(v0.3.38)。 FluentPageBuilderRust、Python、Node/TypeScript、C#、Go、WASMtext_fieldcheckboxcombo_boxradio_grouppush_button を公開しています(DocumentBuilder → AcroForm ウィジェットを参照)。このページで紹介する低レベルかつ Rust 専用の PdfWriter::text_field / checkbox などは、ウィジェットごとの追加オプション(複数行テキスト、パスワードフィールド、リストボックス、枠線の色)を公開しています。AcroForm をきめ細かく制御したい場合に使用してください。既存フォームの入力フラット化はすべてのバインディングで動作します。フォームフィールドの編集PDF フォームへの入力を参照してください。

クイック例

Rust

use pdf_oxide::writer::{PdfWriter, TextFieldWidget, CheckboxWidget};
use pdf_oxide::geometry::Rect;

let mut writer = PdfWriter::new();
{
    let mut page = writer.add_letter_page();
    page.add_text("Name:", 72.0, 720.0, "Helvetica", 12.0);
    page.text_field("name", Rect::new(130.0, 716.0, 200.0, 20.0));
    page.add_text("I agree to terms:", 72.0, 690.0, "Helvetica", 12.0);
    page.checkbox("agree", Rect::new(200.0, 686.0, 15.0, 15.0));
    page.finish();
}
writer.save("form.pdf")?;

Python

from pdf_oxide import DocumentBuilder

(DocumentBuilder()
    .letter_page()
        .at(72, 720).text("Name:")
        .text_field("name", 130, 716, 200, 20)
        .at(72, 690).text("I agree to terms:")
        .checkbox("agree", 200, 686, 15, 15, False)
    .done()
    .save("form.pdf"))

Node / TypeScript

import { DocumentBuilder } from "pdf-oxide";

await new DocumentBuilder()
  .letterPage()
    .at(72, 720).text("Name:")
    .textField("name", 130, 716, 200, 20)
    .at(72, 690).text("I agree to terms:")
    .checkbox("agree", 200, 686, 15, 15, false)
  .done()
  .save("form.pdf");

C#

DocumentBuilder.Create()
    .LetterPage()
        .At(72, 720).Text("Name:")
        .TextField("name", 130, 716, 200, 20)
        .At(72, 690).Text("I agree to terms:")
        .Checkbox("agree", 200, 686, 15, 15, false)
    .Done()
    .Save("form.pdf");

Go

builder := pdfoxide.NewDocumentBuilder()
builder.LetterPage().
    At(72, 720).Text("Name:").
    TextField("name", 130, 716, 200, 20, "").
    At(72, 690).Text("I agree to terms:").
    Checkbox("agree", 200, 686, 15, 15, false).
    Done()
_ = builder.Save("form.pdf")

C++

#include <pdf_oxide/pdf_oxide.hpp>

auto builder = pdf_oxide::DocumentBuilder::create();
auto page = builder.letter_page();
page.at(72, 720).text("Name:")
    .text_field("name", 130, 716, 200, 20)
    .at(72, 690).text("I agree to terms:")
    .checkbox("agree", 200, 686, 15, 15, false);
page.done();
builder.save("form.pdf");

Swift

import PdfOxide

let builder = try DocumentBuilder.create()
let page = try builder.letterPage()
try page.at(72, 720); try page.text("Name:")
try page.textField("name", 130, 716, 200, 20)
try page.at(72, 690); try page.text("I agree to terms:")
try page.checkbox("agree", 200, 686, 15, 15, checked: false)
try page.done()
try builder.save("form.pdf")

Dart

import 'package:pdf_oxide/pdf_oxide.dart';

final builder = DocumentBuilder.create();
builder.letterPage()
    .at(72, 720).text("Name:")
    .textField("name", 130, 716, 200, 20)
    .at(72, 690).text("I agree to terms:")
    .checkbox("agree", 200, 686, 15, 15, false)
    .done();
builder.save("form.pdf");

R

library(pdfoxide)

builder <- pdf_builder_create()
page <- pdf_builder_letter_page(builder)
pdf_page_at(page, 72, 720); pdf_page_builder_text(page, "Name:")
pdf_page_text_field(page, "name", 130, 716, 200, 20)
pdf_page_at(page, 72, 690); pdf_page_builder_text(page, "I agree to terms:")
pdf_page_checkbox(page, "agree", 200, 686, 15, 15, checked = FALSE)
pdf_page_done(page)
pdf_builder_save(builder, "form.pdf")

Julia

using PdfOxide

builder = DocumentBuilder()
page = letter_page(builder)
at(page, 72, 720); text(page, "Name:")
text_field(page, "name", 130, 716, 200, 20)
at(page, 72, 690); text(page, "I agree to terms:")
checkbox(page, "agree", 200, 686, 15, 15, false)
done(page)
save(builder, "form.pdf")

Zig

const pdf_oxide = @import("pdf_oxide");

var builder = try pdf_oxide.DocumentBuilder.create();
defer builder.deinit();
var page = try builder.letterPage();
try page.at(72, 720);
try page.text("Name:");
try page.textField("name", 130, 716, 200, 20, null);
try page.at(72, 690);
try page.text("I agree to terms:");
try page.checkbox("agree", 200, 686, 15, 15, false);
try page.done();
try builder.save("form.pdf");

Objective-C

#import "POXPdfOxide.h"
NSError *err = nil;

POXDocumentBuilder *builder = [POXDocumentBuilder createWithError:&err];
POXPageBuilder *page = [builder letterPageWithError:&err];
[page at:72 y:720 error:&err]; [page text:@"Name:" error:&err];
[page textFieldName:@"name" x:130 y:716 w:200 h:20 defaultValue:nil error:&err];
[page at:72 y:690 error:&err]; [page text:@"I agree to terms:" error:&err];
[page checkboxName:@"agree" x:200 y:686 w:15 h:15 checked:NO error:&err];
[page done:&err];
[builder saveToPath:@"form.pdf" error:&err];

Elixir

{:ok, builder} = PdfOxide.builder()
{:ok, page} = PdfOxide.builder_letter_page(builder)
PdfOxide.page_at(page, 72, 720); PdfOxide.page_text(page, "Name:")
PdfOxide.page_text_field(page, "name", 130, 716, 200, 20)
PdfOxide.page_at(page, 72, 690); PdfOxide.page_text(page, "I agree to terms:")
PdfOxide.page_checkbox(page, "agree", 200, 686, 15, 15, false)
PdfOxide.page_done(page)
PdfOxide.builder_save(builder, "form.pdf")

ウィジェットの種類

TextFieldWidget — テキスト入力

単一行または複数行のテキスト入力フィールドです。

use pdf_oxide::writer::TextFieldWidget;
use pdf_oxide::geometry::Rect;

// Basic text field
let field = TextFieldWidget::new("username", Rect::new(72.0, 700.0, 200.0, 20.0));

// Fully configured text field
let field = TextFieldWidget::new("email", Rect::new(72.0, 670.0, 250.0, 20.0))
    .with_value("user@example.com")
    .with_default_value("")
    .with_max_length(100)
    .required()
    .with_tooltip("Enter your email address")
    .with_font("Helv", 12.0)
    .with_text_color(0.0, 0.0, 0.0)
    .with_border_color(0.5, 0.5, 0.5)
    .with_background_color(1.0, 1.0, 0.95);

// Password field (characters are masked)
let password = TextFieldWidget::new("password", Rect::new(72.0, 640.0, 200.0, 20.0))
    .password();

// Multi-line text area
let notes = TextFieldWidget::new("notes", Rect::new(72.0, 550.0, 300.0, 80.0))
    .multiline();

主なメソッド:

メソッド 説明
.with_value(s) 現在のテキスト値を設定
.with_default_value(s) リセット時の値を設定
.with_max_length(n) 最大文字数
.required() 必須フィールドとしてマーク
.read_only() 編集を禁止
.password() 入力文字をマスク
.multiline() 複数行を許可
.with_tooltip(s) ホバー時のツールチップテキスト
.with_font(name, size) フォントとサイズを設定
.with_text_color(r, g, b) テキストの色を設定(0.0〜1.0 の RGB)
.with_border_color(r, g, b) 枠線の色を設定
.with_background_color(r, g, b) 背景色を設定

CheckboxWidget — チェックボックス

オン/オフの状態を切り替えるフィールドです。

use pdf_oxide::writer::CheckboxWidget;
use pdf_oxide::geometry::Rect;

// Basic checkbox
let cb = CheckboxWidget::new("agree", Rect::new(72.0, 700.0, 15.0, 15.0));

// Pre-checked checkbox with custom export value
let cb = CheckboxWidget::new("newsletter", Rect::new(72.0, 680.0, 15.0, 15.0))
    .checked()
    .with_export_value("subscribed")
    .with_tooltip("Subscribe to newsletter");

主なメソッド:

メソッド 説明
.checked() 初期状態をチェック済みに設定
.with_export_value(s) フォーム送信時に送られる値
.with_tooltip(s) ホバー時のツールチップテキスト
.read_only() 切り替えを禁止

RadioButtonGroup — ラジオボタン

互いに排他的な選択肢のグループです。グループ内のすべてのボタンは同じフィールド名を共有し、1 つを選択すると他は選択解除されます。

use pdf_oxide::writer::RadioButtonGroup;
use pdf_oxide::geometry::Rect;

let group = RadioButtonGroup::new("color")
    .add_button("Red", Rect::new(72.0, 700.0, 15.0, 15.0))
    .add_button("Green", Rect::new(72.0, 680.0, 15.0, 15.0))
    .add_button("Blue", Rect::new(72.0, 660.0, 15.0, 15.0))
    .with_selected("Green");  // Pre-select "Green"

主なメソッド:

メソッド 説明
.add_button(value, rect) ラジオの選択肢を追加
.with_selected(value) 選択肢をあらかじめ選択
.no_toggle_off() すべての選択肢を解除することを禁止

ComboBoxWidget — ドロップダウン

任意で編集可能なテキストを持つドロップダウン選択フィールドです。

use pdf_oxide::writer::ComboBoxWidget;
use pdf_oxide::writer::form_fields::ChoiceOption;
use pdf_oxide::geometry::Rect;

let combo = ComboBoxWidget::new("country", Rect::new(72.0, 700.0, 200.0, 20.0))
    .add_option("US", "United States")
    .add_option("GB", "United Kingdom")
    .add_option("DE", "Germany")
    .add_option("JP", "Japan")
    .with_selected("US");

主なメソッド:

メソッド 説明
.add_option(value, label) 選択可能な選択肢を追加
.with_selected(value) 選択肢をあらかじめ選択
.editable() カスタム値の入力を許可
.sorted() 選択肢をアルファベット順に並べ替え

ListBoxWidget — 複数選択リスト

単一選択または複数選択が可能なスクロール可能なリストフィールドです。

use pdf_oxide::writer::ListBoxWidget;
use pdf_oxide::geometry::Rect;

let list = ListBoxWidget::new("languages", Rect::new(72.0, 600.0, 200.0, 80.0))
    .add_option("rust", "Rust")
    .add_option("python", "Python")
    .add_option("go", "Go")
    .add_option("typescript", "TypeScript")
    .multi_select()
    .with_selected("rust");

主なメソッド:

メソッド 説明
.add_option(value, label) 選択可能な選択肢を追加
.with_selected(value) 選択肢をあらかじめ選択
.multi_select() 複数項目の選択を許可
.sorted() 選択肢をアルファベット順に並べ替え

PushButtonWidget — ボタン

アクション(送信、リセット、JavaScript)をトリガーするクリック可能なボタンです。

use pdf_oxide::writer::PushButtonWidget;
use pdf_oxide::geometry::Rect;

let submit = PushButtonWidget::new("submit", Rect::new(72.0, 500.0, 100.0, 30.0))
    .with_label("Submit")
    .submit_form("https://example.com/submit");

let reset = PushButtonWidget::new("reset", Rect::new(180.0, 500.0, 100.0, 30.0))
    .with_label("Reset")
    .reset_form();

応用例

完全な登録フォーム

use pdf_oxide::writer::{
    PdfWriter, PdfWriterConfig,
    TextFieldWidget, CheckboxWidget, RadioButtonGroup,
    ComboBoxWidget, PushButtonWidget,
};
use pdf_oxide::geometry::Rect;

let config = PdfWriterConfig::default()
    .with_title("Registration Form")
    .with_author("HR Department");

let mut writer = PdfWriter::with_config(config);
{
    let mut page = writer.add_letter_page();

    // Title
    page.add_text("Employee Registration Form", 72.0, 740.0, "Helvetica-Bold", 18.0);

    // Personal Information
    page.add_text("First Name:", 72.0, 700.0, "Helvetica", 12.0);
    page.add_text_field(
        TextFieldWidget::new("first_name", Rect::new(170.0, 696.0, 200.0, 20.0))
            .required()
    );

    page.add_text("Last Name:", 72.0, 670.0, "Helvetica", 12.0);
    page.add_text_field(
        TextFieldWidget::new("last_name", Rect::new(170.0, 666.0, 200.0, 20.0))
            .required()
    );

    page.add_text("Email:", 72.0, 640.0, "Helvetica", 12.0);
    page.add_text_field(
        TextFieldWidget::new("email", Rect::new(170.0, 636.0, 250.0, 20.0))
            .required()
            .with_tooltip("Work email address")
    );

    // Department dropdown
    page.add_text("Department:", 72.0, 610.0, "Helvetica", 12.0);
    page.add_combo_box(
        ComboBoxWidget::new("department", Rect::new(170.0, 606.0, 200.0, 20.0))
            .add_option("eng", "Engineering")
            .add_option("sales", "Sales")
            .add_option("hr", "Human Resources")
            .add_option("ops", "Operations")
    );

    // Employment type radio buttons
    page.add_text("Employment Type:", 72.0, 570.0, "Helvetica", 12.0);
    page.add_text("Full-time", 95.0, 550.0, "Helvetica", 10.0);
    page.add_text("Part-time", 95.0, 530.0, "Helvetica", 10.0);
    page.add_text("Contract", 95.0, 510.0, "Helvetica", 10.0);
    page.add_radio_group(
        RadioButtonGroup::new("employment_type")
            .add_button("fulltime", Rect::new(72.0, 548.0, 15.0, 15.0))
            .add_button("parttime", Rect::new(72.0, 528.0, 15.0, 15.0))
            .add_button("contract", Rect::new(72.0, 508.0, 15.0, 15.0))
            .with_selected("fulltime")
    );

    // Agreement checkbox
    page.add_text("I agree to the terms and conditions", 95.0, 470.0, "Helvetica", 10.0);
    page.add_checkbox(
        CheckboxWidget::new("agree_terms", Rect::new(72.0, 468.0, 15.0, 15.0))
            .with_export_value("agreed")
    );

    // Submit button
    page.add_push_button(
        PushButtonWidget::new("submit", Rect::new(72.0, 420.0, 120.0, 30.0))
            .with_label("Submit Form")
    );

    page.finish();
}

writer.save("registration_form.pdf")?;

既存の PDF へのフォームフィールドの追加

既存の PDF ドキュメントにフィールドを追加するには DocumentEditor を使用します。

use pdf_oxide::editor::DocumentEditor;
use pdf_oxide::writer::TextFieldWidget;
use pdf_oxide::geometry::Rect;

let mut editor = DocumentEditor::open("template.pdf")?;

let field = TextFieldWidget::new("signature", Rect::new(72.0, 100.0, 250.0, 25.0))
    .with_tooltip("Sign here");

editor.add_form_field(0, field)?;  // Add to page 0
editor.save("signed_template.pdf")?;

関連ページ