Jak wypełnić formularz PDF w Javie

Jak wypełnić formularz PDF w Java (Poradnik)

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronPDF umożliwia programistom Java programowe wypełnianie formularzy PDF poprzez wczytywanie istniejących plików PDF, uzyskiwanie dostępu do pól formularza za pomocą getForm(), ustawianie wartości za pomocą setFieldValue() oraz zapisywanie wypełnionego dokumentu. To sprawia, że ​​automatyzacja przetwarzania dokumentów w aplikacjach biznesowych jest prostsza.

Szybki start: Wypelnij formularz PDF w Java

```java {title="FillPDFForm.java"} //:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/quickstart.java // 1. Dodaj zależność IronPDF do projektu Maven // 2. Wczytaj swoj formularz PDF PdfDocument form = PdfDocument.fromFile("form.pdf"); // 3. Wypelnij pola formularza form.getForm().setFieldValue("firstname", "John"); // 4. Zapisz wypelniony PDF form.saveAs(Paths.get("filled_form.pdf"));


<div class="hsg-featured-snippet">
<h2>Jak wypełnić formularz PDF w Javie</h2>
<ol>
<li><a class="js-modal-open" data-modal-id="download-modal" href="#download-modal">Zainstaluj bibliotekę IronPDF Java przez Maven</a></li>
<li>Załaduj istniejący PDF, który zawiera pola formularza, używając <code>PdfDocument.fromFile()</code></li>
<li>Uzyskaj dostęp do formularza za pomocą metody <code>getForm()</code></li>
<li>Ustaw wartości pól używając <code>setFieldValue(fieldName, value)</code></li>
<li>Zapisz wypełniony dokument za pomocą <code>saveAs()</code></li>
</ol>
</div>

Ten artykuł omawia, jak programowo wypełniać formularze PDF w Java. Częstym scenariuszem jest, gdy aplikacja zbiera dane użytkownika przez UI, które muszą być zachowane w formacie PDF do archiwizacji, zgodności lub przetwarzania dalszego.

Po przechwyceniu danych wejściowych użytkownika, aplikacje często muszą wstrzykiwać te dane bezpośrednio do istniejących szablonów PDF. Wiele bibliotek PDF dla Java obsługuje to zadanie, w tym [Apache PDFBox](https://pdfbox.apache.org), iText, i IronPDF. Ten przewodnik wyjaśnia, jak używać IronPDF do wypełniania interaktywnych formularzy z polami tekstowymi, polami wyboru, przyciskami radiowymi i listami rozwijanymi. Dla deweloperów budujących powiązane przepływy dokumentów, zobacz przewodnik [tworzenie formularzy PDF od podstaw w Java](https://ironpdf.com/java/how-to/create-forms/).

## Czym jest IronPDF dla Java?

IronPDF to [Java PDF library](https://ironpdf.com/java/) do tworzenia, edytowania i manipulowania dokumentami PDF. Integruje się z każdym projektem Java opartym na Maven i udostępnia czysty interfejs API, który umożliwia osiągnięcie typowych zadań PDF z minimalnym nadmiarem kodu.

Biblioteka pokrywa cały cykl życia PDF: renderowanie HTML do PDF, odczytywanie i zapisywanie danych formularzy, dodawanie podpisów cyfrowych, zastosowanie ustawień bezpieczeństwa, kompresję dokumentów i drukowanie. Dla pracy z formularzami w szczególności, IronPDF daje programowy dostęp do każdego typu pola w dokumencie PDF, zachowując oryginalne formatowanie. To sprawia, że ​​jest dobrze dopasowany do przetwarzania partii formularzy, wstępnego wypełniania szablonów za pomocą rekordów z bazy danych, lub łączenia wypełniania formularzy w większym przepływie pracy Java. Zobacz [dokumentację API IronPDF dla Java](https://ironpdf.com/java/object-reference/api/) dla pełnej listy dostępnych klas i metod.

## Jak zainstalować IronPDF w projekcie Maven?

Dodaj następujący blok zależności do pliku `pom.xml`, aby zainstalować IronPDF for Java.

Otwórz `pom.xml` i wstaw zależność wewnątrz elementu `<dependencies>`, a następnie uruchom `mvn install`, aby pobrać bibliotekę. Dostępne wersje są wymienione na [Maven Central](https://search.maven.org/artifact/com.ironsoftware/ironpdf).

```xml
//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/maven-dependency.xml
<dependency>
    <groupId>com.ironsoftware</groupId>
    <artifactId>ironpdf</artifactId>
    <version>2024.9.1</version>
</dependency>

Po instalacji zaimportuj com.ironsoftware.ironpdf.PdfDocument i com.ironsoftware.ironpdf.render.ChromePdfRenderOptions do swojej klasy Java, aby uzyskać dostęp do API wypełniania formularzy. Dla wskazówek dotyczących wdrożenia na platformach chmurowych, zobacz przewodniki dla AWS, Azure i Google Cloud.

PoradyPodczas pracy z IronPDF w środowisku Docker lub kontenerowym należy ustawić właściwość systemową IronPdf.licenseKey przed pierwszym wywołaniem PdfDocument, aby uniknąć opóźnień w weryfikacji licencji w czasie wykonywania.

Jak stworzyć i wypełnić formularz PDF używając HTML w Java?

Najbardziej niezawodny sposób, aby uzyskać spójnie ustrukturyzowany, wypełnialny PDF, to zdefiniowanie formularza w HTML i renderowanie go przy użyciu IronPDF. Biblioteka konwertuje elementy HTML <input> bezpośrednio na interaktywne pola formularzy PDF.

Poniższy kod tworzy formularz PDF z dwoma polami z ciągu HTML, a następnie wypełnia oba pola:

//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/create-and-fill-form.java
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.render.ChromePdfRenderOptions;
import java.io.IOException;
import java.nio.file.Paths;

public class App {

    public static void main(String[] args) throws IOException {

        // Define an HTML form with two text input fields
        String formHTML = "<html>"
            + "<body>"
            + "<h2>Editable PDF Form</h2>"
            + "<form>"
            + "First name: <br><input type='text' name='firstname' value=''><br>"
            + "Last name: <br><input type='text' name='lastname' value=''>"
            + "</form>"
            + "</body>"
            + "</html>";

        // Enable HTML-to-form-field conversion during rendering
        ChromePdfRenderOptions renderOptions = new ChromePdfRenderOptions();
        renderOptions.setCreatePdfFormsFromHtml(true);

        // Render HTML to PDF and save the blank template
        PdfDocument.renderHtmlAsPdf(formHTML, renderOptions)
            .saveAs(Paths.get("assets/BasicForm.pdf"));

        // Load the template and fill in field values
        PdfDocument form = PdfDocument.fromFile(Paths.get("assets/BasicForm.pdf"));
        form.getForm().setFieldValue("firstname", "Minnie");
        form.getForm().setFieldValue("lastname", "Mouse");

        // Save the completed form to a new file
        form.saveAs(Paths.get("assets/BasicForm_Filled.pdf"));
    }
}
//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/create-and-fill-form.java
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.render.ChromePdfRenderOptions;
import java.io.IOException;
import java.nio.file.Paths;

public class App {

    public static void main(String[] args) throws IOException {

        // Define an HTML form with two text input fields
        String formHTML = "<html>"
            + "<body>"
            + "<h2>Editable PDF Form</h2>"
            + "<form>"
            + "First name: <br><input type='text' name='firstname' value=''><br>"
            + "Last name: <br><input type='text' name='lastname' value=''>"
            + "</form>"
            + "</body>"
            + "</html>";

        // Enable HTML-to-form-field conversion during rendering
        ChromePdfRenderOptions renderOptions = new ChromePdfRenderOptions();
        renderOptions.setCreatePdfFormsFromHtml(true);

        // Render HTML to PDF and save the blank template
        PdfDocument.renderHtmlAsPdf(formHTML, renderOptions)
            .saveAs(Paths.get("assets/BasicForm.pdf"));

        // Load the template and fill in field values
        PdfDocument form = PdfDocument.fromFile(Paths.get("assets/BasicForm.pdf"));
        form.getForm().setFieldValue("firstname", "Minnie");
        form.getForm().setFieldValue("lastname", "Mouse");

        // Save the completed form to a new file
        form.saveAs(Paths.get("assets/BasicForm_Filled.pdf"));
    }
}
JAVA

W pierwszym bloku użyto ChromePdfRenderOptions wraz z setCreatePdfFormsFromHtml(true), aby poinformować silnik renderujący, że ma traktować elementy HTML <input> jako aktywne pola formularza PDF, a nie jako statyczny tekst. Renderowany PDF jest zapisywany jako szablon do ponownego użycia. Drugi blok ładuje ten szablon, wywołuje getForm().setFieldValue() dla każdego pola według nazwy i zapisuje wynik w oddzielnym pliku wyjściowym, pozostawiając oryginalny szablon niezmieniony do wykorzystania w przyszłości.

Jak wygląda wynik?

Pierwszy rendering tworzy PDF z dwoma pustymi polami tekstowymi, w pełni edytowalnymi w dowolnym czytniku PDF.

Prosty formularz PDF z edytowalnymi polami tekstowymi na imię i nazwisko, otoczonymi niebieskimi ramkami, wygenerowany przez IronPDF z kodu HTML

Po uruchomieniu setFieldValue() oba pola zostaną wypełnione dostarczonymi danymi:

IronPDF Java output: PDF form with Minnie in the First name field and Mouse in the Last name field, showing successfully filled form data

Jak wypełnić istniejący formularz PDF, którego nie stworzyłem?

Wiele rzeczywistych ścieżek pracy otrzymuje zewnętrzne szablony PDF (formularze rządowe, dokumenty ubezpieczeniowe, umowy z dostawcami), które już zawierają nazwane pola. Ładowanie i wypełnianie tych pól odbywa się w ten sam sposób: użyj PdfDocument.fromFile(), aby załadować dokument, a następnie getForm().setFieldValue(), aby ustawić każde pole według jego nazwy.

//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/fill-existing-form.java
import com.ironsoftware.ironpdf.PdfDocument;
import java.io.IOException;
import java.nio.file.Paths;

public class FillExistingForm {

    public static void main(String[] args) throws IOException {

        // Load a third-party fillable PDF
        PdfDocument form = PdfDocument.fromFile(Paths.get("templates/application.pdf"));

        // Set text field values by field name
        form.getForm().setFieldValue("applicant_name", "Jane Smith");
        form.getForm().setFieldValue("date_of_birth", "1985-06-14");
        form.getForm().setFieldValue("reference_number", "REF-2024-00421");

        // Save the completed application
        form.saveAs(Paths.get("output/application_filled.pdf"));
    }
}
//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/fill-existing-form.java
import com.ironsoftware.ironpdf.PdfDocument;
import java.io.IOException;
import java.nio.file.Paths;

public class FillExistingForm {

    public static void main(String[] args) throws IOException {

        // Load a third-party fillable PDF
        PdfDocument form = PdfDocument.fromFile(Paths.get("templates/application.pdf"));

        // Set text field values by field name
        form.getForm().setFieldValue("applicant_name", "Jane Smith");
        form.getForm().setFieldValue("date_of_birth", "1985-06-14");
        form.getForm().setFieldValue("reference_number", "REF-2024-00421");

        // Save the completed application
        form.saveAs(Paths.get("output/application_filled.pdf"));
    }
}
JAVA

Aby odkryć nazwy pól w istniejącym PDF, otwórz dokument w Adobe Acrobat Reader, kliknij prawym przyciskiem myszy na dowolne pole i wybierz "Właściwości". Nazwa pola pojawia się na karcie Ogólne. Alternatywnie, iteruj programowo po wszystkich polach:

//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/list-form-fields.java
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.form.FormField;
import java.nio.file.Paths;

public class ListFormFields {

    public static void main(String[] args) throws Exception {

        PdfDocument form = PdfDocument.fromFile(Paths.get("templates/application.pdf"));

        // Print the name and type of every form field
        for (FormField field : form.getForm().getFields()) {
            System.out.println("Field: " + field.getName()
                + " | Type: " + field.getType());
        }
    }
}
//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/list-form-fields.java
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.form.FormField;
import java.nio.file.Paths;

public class ListFormFields {

    public static void main(String[] args) throws Exception {

        PdfDocument form = PdfDocument.fromFile(Paths.get("templates/application.pdf"));

        // Print the name and type of every form field
        for (FormField field : form.getForm().getFields()) {
            System.out.println("Field: " + field.getName()
                + " | Type: " + field.getType());
        }
    }
}
JAVA

PRINTowanie nazw pól przed zapisaniem danych zapobiega cichemu niepowodzeniu setFieldValue() w przypadku niezgodności nazw. Nazwy pól w dokumentach PDF rozróżniają wielkość liter, więc "firstname" i "FirstName" są traktowane jako różne pola.

Zwróć uwagęFunkcja getForm().getFields() w IronPDF zwraca listę obiektów FormField. Każde z nich udostępnia getName(), getType() oraz getValue(). Są one przydatne podczas tworzenia dynamicznych procedur wypełniania formularzy, które odczytują nazwy pól z zewnętrznych źródeł danych, takich jak baza danych lub plik CSV.

Jak wypełnić pola wyboru i przyciski radiowe w Java?

Pola tekstowe akceptują bezpośrednio wartości typu string, ale pola wyboru i przyciski opcji wymagają określonych wartości eksportowanych, które plik PDF definiuje w momencie tworzenia. Należy użyć setFieldValue() wraz z prawidłowym ciągiem wartości eksportowanej dla każdego pola.

//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/fill-checkboxes-radio.java
import com.ironsoftware.ironpdf.PdfDocument;
import java.nio.file.Paths;

public class FillCheckboxesAndRadio {

    public static void main(String[] args) throws Exception {

        PdfDocument form = PdfDocument.fromFile(Paths.get("templates/survey.pdf"));

        // Check a checkbox by setting its exported value (often "Yes" or "On")
        form.getForm().setFieldValue("agree_terms", "Yes");

        // Select a radio button option by its exported value
        form.getForm().setFieldValue("preferred_contact", "email");

        form.saveAs(Paths.get("output/survey_filled.pdf"));
    }
}
//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/fill-checkboxes-radio.java
import com.ironsoftware.ironpdf.PdfDocument;
import java.nio.file.Paths;

public class FillCheckboxesAndRadio {

    public static void main(String[] args) throws Exception {

        PdfDocument form = PdfDocument.fromFile(Paths.get("templates/survey.pdf"));

        // Check a checkbox by setting its exported value (often "Yes" or "On")
        form.getForm().setFieldValue("agree_terms", "Yes");

        // Select a radio button option by its exported value
        form.getForm().setFieldValue("preferred_contact", "email");

        form.saveAs(Paths.get("output/survey_filled.pdf"));
    }
}
JAVA

Wartość eksportowa pola wyboru to zazwyczaj "Yes", "On" lub niestandardowy ciąg znaków ustawiony przez autora formularza. Dla grup przycisków radiowych każda opcja w grupie dzieli tę samą nazwę pola, ale ma unikalną wartość eksportu. Użyj techniki listowania pól z poprzedniej sekcji, aby potwierdzić dokładne wartości eksportu przed zapisaniem zautomatyzowanych procedur wypełniania.

WażneJeśli setFieldValue() nie pojawia się przy zaznaczaniu pola wyboru lub przycisku opcji, prawdopodobnie ciąg wartości eksportu jest nieprawidłowy. Wpisz pole z getFields() i sprawdź getValue() w ręcznie sprawdzonej kopii pliku PDF, aby uzyskać prawidłowy ciąg znaków.

Jak wypełnić listy rozwijane w formularzu PDF przy użyciu Java?

Pola list rozwijanych (zwane także polami kombi) używają tego samego API, co pola tekstowe. Przekaż wartość eksportową opcji jako ciąg znaków do setFieldValue(). Wartość eksportu to zazwyczaj widoczny tekst opcji, jeżeli autor formularza nie zdefiniował oddzielnej wartości podstawowej.

//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/fill-dropdown.java
import com.ironsoftware.ironpdf.PdfDocument;
import java.nio.file.Paths;

public class FillDropdown {

    public static void main(String[] args) throws Exception {

        PdfDocument form = PdfDocument.fromFile(Paths.get("templates/registration.pdf"));

        // Set a dropdown/combo box field to a specific option
        form.getForm().setFieldValue("country", "United States");

        // Set a list box field (multi-select may require comma-separated values)
        form.getForm().setFieldValue("subscription_tier", "Professional");

        form.saveAs(Paths.get("output/registration_filled.pdf"));
    }
}
//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/fill-dropdown.java
import com.ironsoftware.ironpdf.PdfDocument;
import java.nio.file.Paths;

public class FillDropdown {

    public static void main(String[] args) throws Exception {

        PdfDocument form = PdfDocument.fromFile(Paths.get("templates/registration.pdf"));

        // Set a dropdown/combo box field to a specific option
        form.getForm().setFieldValue("country", "United States");

        // Set a list box field (multi-select may require comma-separated values)
        form.getForm().setFieldValue("subscription_tier", "Professional");

        form.saveAs(Paths.get("output/registration_filled.pdf"));
    }
}
JAVA

Gdy wartość eksportu z listy rozwijanej różni się od widocznej etykiety, użyj getFields(), aby sprawdzić dostępne opcje pola. Przekazanie wartości, która nie pasuje do żadnej opcji zdefiniowanej w polu, pozostawia wybór niezmieniony bez wyrzucania wyjątku, więc walidacja wartości eksportu przed partią zapisów unika cichej utraty danych.

PoradyAby sprawdzić wszystkie dostępne opcje w polu kombi, rzuć FormField na FormComboBoxField i wywołaj getOptions(). Zwraca to listę prawidłowych wartości eksportu dla tej listy rozwijanej.

Jak spłaszczyć wypełniony formularz PDF w Java?

Spłaszczenie przekształca wszystkie pola formularza w statyczną, niedadetowalną zawartość. To zapobiega zmianie przesłanych danych przez odbiorców i jest wymagane do wielu przypadków użycia archiwizacji i zgodności. IronPDF obsługuje spłaszczanie formularzy jako część swoich możliwości manipulacji PDF.

//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/flatten-form.java
import com.ironsoftware.ironpdf.PdfDocument;
import java.nio.file.Paths;

public class FlattenForm {

    public static void main(String[] args) throws Exception {

        PdfDocument form = PdfDocument.fromFile(Paths.get("assets/BasicForm_Filled.pdf"));

        // Flatten all form fields -- values become static text
        form.getForm().flatten();

        form.saveAs(Paths.get("output/BasicForm_Archived.pdf"));
    }
}
//:path=/static-assets/pdf/content-code-examples/how-to/java-fill-pdf-form-tutorial/flatten-form.java
import com.ironsoftware.ironpdf.PdfDocument;
import java.nio.file.Paths;

public class FlattenForm {

    public static void main(String[] args) throws Exception {

        PdfDocument form = PdfDocument.fromFile(Paths.get("assets/BasicForm_Filled.pdf"));

        // Flatten all form fields -- values become static text
        form.getForm().flatten();

        form.saveAs(Paths.get("output/BasicForm_Archived.pdf"));
    }
}
JAVA

Po uruchomieniu flatten() w wyjściowym pliku PDF/A nie pozostają żadne interaktywne pola formularza. Rozmiar dokumentu zazwyczaj zmniejsza się, ponieważ warstwy nakładki pól formularzy są usunięte. Spłaszczone pliki PDF są bezpieczne do dystrybucji bez ryzyka edytowania przesłanych wartości przez odbiorców.

Jakie są kolejne kroki w wypełnianiu formularzy PDF w Java?

IronPDF udostępnia skoncentrowane, mało zbiuroaktywizowane API do wypełniania formularzy PDF w Java. Metoda getForm() zapewnia bezpośredni dostęp do pól tekstowych, pól wyboru, przycisków opcji i list rozwijanych. Gdy wymagane jest archiwizowanie, flatten() blokuje wszystkie wypełnione dane jako treść statyczną.

Dla kolejnych etapów przepływu pracy z dokumentami PDF, zapoznaj się z tymi przewodnikami:

Rozpocznij bezpłatny okres próbny IronPDF for Java, aby przetestować wypełnianie formularzy w swoim własnym projekcie. Kiedy będziesz gotowy do wdrożenia, zobacz opcje licencjonowania IronPDF, aby znaleźć plan odpowiedni do potrzeb Twojego zespołu.

Często Zadawane Pytania

Jakie są podstawowe kroki wypełniania formularza PDF w Java?

Dodaj zależność IronPDF Maven, załaduj swój PDF za pomocą PdfDocument.fromFile(), uzyskaj dostęp do pól formularza za pomocą getForm(), wywołaj setFieldValue(fieldName, value) dla każdego pola i zapisz wynik za pomocą saveAs().

Jak odkryć nazwy pól w istniejącym PDF?

Otwórz PDF w Adobe Acrobat Reader, kliknij prawym przyciskiem myszy dowolne pole i wybierz Właściwości. Nazwa pola pojawia się na karcie Ogólne. Alternatywnie, wywołaj getForm().getFields(), aby iterować wszystkie pola i wydrukować każdą z metod getName() i getType() programowo.

Jak wypełnić pola wyboru i przyciski radiowe w Java?

Użyj setFieldValue() z ciągiem eksportowej wartości pola. Wartości eksportowe pól wyboru są zazwyczaj Yes lub On. Dla grup przycisków radiowych, każda opcja dzieli tę samą nazwę pola, ale ma unikalną wartość eksportową. Jeśli pole nie reaguje, sprawdź getValue() na ręcznie zaznaczonej kopii PDF, aby znaleźć poprawny ciąg.

Jak wypełnić pole listy rozwijanej?

Wywołaj setFieldValue(fieldName, optionValue) z eksportową wartością opcji. Wartość eksportowa to zazwyczaj widoczny tekst opcji. Aby programowo wymienić dostępne opcje, rzutuj FormField do FormComboBoxField i wywołaj getOptions().

Czym jest spłaszczanie formularza PDF?

Spłaszczenie konwertuje wszystkie interaktywne pola formularzy na statyczną, nieedytowalną treść. Wywołaj getForm().flatten() przed zapisaniem. Wynikowy PDF nie może być edytowany przez odbiorców, co jest wymagane dla wielu przepływów pracy związanych z archiwizacją i zgodnością.

Czy IronPDF może wypełnić formularze stworzone przez inne narzędzia?

Tak. PdfDocument.fromFile() załadowuje każdy standardowy formularz PDF bez względu na to, jak został utworzony. Użyj getForm().getFields(), aby sprawdzić nazwy pól przed wywołaniem setFieldValue(), ponieważ nazwy pól są rozróżniane dla wielkości liter i różni się w zależności od autora formularza.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Wersja: 2026.5 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu?
Uruchom przykład i zobacz, jak Twój kod HTML zamienia się w plik PDF.