Java에서 PDF 파일을 인쇄하는 방법

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

IronPDF for Java를 사용하면 사용자 상호 작용 여부와 관계없이 프로그래밍 방식으로 PDF 파일을 인쇄할 수 있습니다. Java 애플리케이션에서 물리적 프린터로 PDF를 직접 보내고, 복사본 수 및 페이지 범위와 같은 프린트 설정을 제어하며, 문서 프린트 워크플로를 자동화할 수 있습니다. Enterprise 문서 관리 시스템 빌드하거나 송장 생성 자동화 여부에 관계없이, IronPDF는 Java의 인쇄 기반 시설과 깔끔하게 통합되는 인쇄 기능을 제공합니다. 또한 PDF 디지털 서명 또는 이미지를 PDF로 변환과 같은 다른 PDF 작업과 함께 사용할 수도 있습니다.

IronPDF for Java 인쇄 워크플로우, 프로그래밍 방식으로 PDF 문서가 프린터로 전송되는 과정

빠른 시작: Java에서 PDF 파일 인쇄

  1. 프로젝트에 IronPDF 종속성 추가
  2. License.setLicenseKey()로 라이선스 키를 설정하세요.
  3. PdfDocument을(를) 사용하여 PDF를 로드하거나 생성합니다.
  4. 대화 상자를 통한 인쇄에 pdf.print()을(를), 직접 인쇄에 pdf.printWithoutDialog()을(를) 호출합니다.
  5. 선택한 또는 기본 프린터로 PDF 전송
 :title=Quickstart
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/quickstart.java
import com.ironsoftware.ironpdf.*;

public class PrintPDFQuickstart {
    public static void main(String[] args) {
        // Apply your license key
        License.setLicenseKey("YOUR-LICENSE-KEY");

        // Create a PDF from HTML
        PdfDocument pdf = PdfDocument.renderHtmlAsPdf("<h1>Invoice #12345</h1><p>Total: $100.00</p>");

        // Print with dialog (interactive)
        pdf.print();

        // Or print without dialog (automated)
        // pdf.printWithoutDialog();
    }
}
 :title=Quickstart
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/quickstart.java
import com.ironsoftware.ironpdf.*;

public class PrintPDFQuickstart {
    public static void main(String[] args) {
        // Apply your license key
        License.setLicenseKey("YOUR-LICENSE-KEY");

        // Create a PDF from HTML
        PdfDocument pdf = PdfDocument.renderHtmlAsPdf("<h1>Invoice #12345</h1><p>Total: $100.00</p>");

        // Print with dialog (interactive)
        pdf.print();

        // Or print without dialog (automated)
        // pdf.printWithoutDialog();
    }
}
JAVA

사용자 상호 작용을 통해 PDF를 인쇄하려면 어떻게 해야 하나요?

인쇄하려는 PDF 문서를 로드한 후 pdf.print()을(를) 호출합니다. 이 메서드는 표준 인쇄 대화 상자를 열어, 사용자가 프린터, 페이지 범위, 기타 옵션을 선택하고 작업을 전송할 수 있도록 합니다. 이는 운영 체제의 네이티브 인쇄 기능에 통합되어, 네트워크 프린터 및 가상 프린터를 포함한 각 기계에 설치된 모든 프린터가 자동으로 대화 상자에 표시됩니다.

//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/interactive-printing.java
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import java.io.IOException;

public class InteractivePrinting {
    public static void main(String[] args) {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        try {
            // Option 1: Create a new PDF from HTML
            PdfDocument pdf = PdfDocument.renderHtmlAsPdf("<h1>Monthly Report</h1><p>Sales data...</p>");

            // Option 2: Load an existing PDF file
            // PdfDocument pdf = PdfDocument.fromFile(Paths.get("report.pdf"));

            // Print the PDF with a print dialog for user interaction
            pdf.print();

            System.out.println("Print job sent to selected printer");

        } catch (IOException e) {
            System.err.println("Error printing PDF: " + e.getMessage());
        }
    }
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/interactive-printing.java
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import java.io.IOException;

public class InteractivePrinting {
    public static void main(String[] args) {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        try {
            // Option 1: Create a new PDF from HTML
            PdfDocument pdf = PdfDocument.renderHtmlAsPdf("<h1>Monthly Report</h1><p>Sales data...</p>");

            // Option 2: Load an existing PDF file
            // PdfDocument pdf = PdfDocument.fromFile(Paths.get("report.pdf"));

            // Print the PDF with a print dialog for user interaction
            pdf.print();

            System.out.println("Print job sent to selected printer");

        } catch (IOException e) {
            System.err.println("Error printing PDF: " + e.getMessage());
        }
    }
}
JAVA

인쇄 대화 상자는 작업을 프린터로 전송하기 전에 사용자가 선택한 설정을 허용합니다.

IronPDF Java가 시스템 인쇄 대화 상자와 통합된 인쇄 대화 상자, 프린터 선택, 페이지 범위, 복사본 수 옵션 표시

대화 기반 인쇄는 언제 사용해야 하나요?

대화 기반 인쇄는 사용자에게 프린터 선택, 페이지 범위, 복사본 수, 용지 방향 등과 같은 설정을 제어할 수 있는 기능을 제공합니다. 이 접근 방식은 데스크톱 애플리케이션, 문서 관리 시스템 또는 작업 전 설정을 검토하고 조정해야 하는 모든 시나리오에 적합합니다.

다음 상황에서는 일반적으로 print()이(가) 필요합니다:

  • 인쇄 미리보기 기능을 포함한 데스크톱 애플리케이션
  • 사용자들이 특정 페이지 범위를 선택하는 문서 워크플로 시스템
  • 다양한 목적을 위해 다른 프린터를 사용하는 사무 환경
  • 사용자 확인이 필요한 민감한 문서 인쇄 애플리케이션

인쇄 전에 여러 PDF를 병합해야 하는 애플리케이션의 경우, 문서를 먼저 결합한 다음 결과를 인쇄 대화 상자에 전달하십시오. 웹 콘텐츠에서 인쇄 준비가 된 PDF를 생성하는 방법에 대한 IronPDF의 Java용 HTML to PDF 튜토리얼을 검토하십시오.

인쇄 대화 상자는 어떤 구성을 노출합니까?

표준 Java 인쇄 대화 상자는 페이지 방향, 미디어 크기, 인쇄 품질, 집계 순서 등을 포함하여 운영 체제 수준의 전체 인쇄 속성을 나타냅니다. IronPDF는 속성 협상을 위해 기본 javax.print API에 의존하므로 사용할 수 있는 옵션은 각 프린터에서 보고된 기능에 따라 다릅니다. Windows에서는 네이티브 Win32 인쇄 대화 상자가 나타납니다; Linux 및 macOS에서는 GTK 또는 Cocoa 대화 상자가 대신 사용됩니다. Java 애플리케이션에서는 사용자 정의 UI 코드를 작성할 필요가 없습니다. 운영 체제가 표시를 자동으로 처리하기 때문입니다.


사용자 입력 없이 PDF 파일을 인쇄하려면 어떻게 해야 하나요?

printWithoutDialog() 메서드는 인쇄 대화 상자를 생략하고 문서를 기본 프린터로 바로 보냅니다. 워크플로 중 어느 시점에서도 사용자 상호작용이 필요하지 않습니다. 이는 서버측 애플리케이션, 배치 처리 시스템 및 일관되고 비확인 출력이 목표인 예약된 워크플로에 적합합니다.

//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/automated-printing.java
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.LocalDateTime;

public class AutomatedPrinting {
    public static void main(String[] args) {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        try {
            // Create a batch of invoices
            for (int i = 1; i <= 10; i++) {
                String html = String.format(
                    "<h1>Invoice #%d</h1>" +
                    "<p>Date: %s</p>" +
                    "<p>Amount: $%.2f</p>",
                    i, LocalDateTime.now(), i * 100.0
                );

                // Render HTML to PDF
                PdfDocument pdf = PdfDocument.renderHtmlAsPdf(html);

                // Print directly without showing dialog
                pdf.printWithoutDialog();

                System.out.println("Printed invoice #" + i);

                // Save a copy for records
                pdf.saveAs(Paths.get("invoices/invoice_" + i + ".pdf"));
            }

        } catch (IOException e) {
            System.err.println("Printing error: " + e.getMessage());
        }
    }
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/automated-printing.java
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.LocalDateTime;

public class AutomatedPrinting {
    public static void main(String[] args) {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        try {
            // Create a batch of invoices
            for (int i = 1; i <= 10; i++) {
                String html = String.format(
                    "<h1>Invoice #%d</h1>" +
                    "<p>Date: %s</p>" +
                    "<p>Amount: $%.2f</p>",
                    i, LocalDateTime.now(), i * 100.0
                );

                // Render HTML to PDF
                PdfDocument pdf = PdfDocument.renderHtmlAsPdf(html);

                // Print directly without showing dialog
                pdf.printWithoutDialog();

                System.out.println("Printed invoice #" + i);

                // Save a copy for records
                pdf.saveAs(Paths.get("invoices/invoice_" + i + ".pdf"));
            }

        } catch (IOException e) {
            System.err.println("Printing error: " + e.getMessage());
        }
    }
}
JAVA

위 루프는 각 송장을 HTML 템플릿에서 렌더링하고 즉시 기본 프린터에 보내줍니다. 아무 대화 상자도 루프를 차단하지 않기 때문에 전체 배치는 중단 없이 완료됩니다.

자동 인쇄를 서버에 배포하기 전에 슈퍼헤드를 설정한 기계에 기본 프린터가 구성되어 있는지 확인하십시오. 헤드리스 Linux 서버에서는 CUPS 또는 PDF 파일로 출력할 수 있는 가상 프린터가 유용합니다.

무음 인쇄의 장점은 무엇인가요?

무음 인쇄 기능은 사용자 입력을 없애 완전 자동화된 워크플로우를 가능하게 합니다. 핵심 이점은 다음과 같습니다:

  • 속도: 사용자 상호작용이 필요 없으므로 대량 배치 처리 시 더 빠릅니다
  • 일관성: 항상 동일한 인쇄 설정을 적용합니다
  • 자동화: 예약된 작업 및 백그라운드 서비스에 적합합니다
  • 통합: 기존 자동화된 워크플로에 수정 없이 적합합니다

대형 문서를 처리할 때는, IronPDF의 Java용 PDF 압축 기능을 적용하여 프린터로 전송하기 전에 파일 크기를 줄이세요. 이는 인쇄 시간과 리소스 사용량을 줄입니다.

직접 인쇄는 언제 가장 효과적일까요?

인쇄가 수동 개입 없이 발생해야 하는 자동화된 문서 워크플로, 예약된 인쇄 작업 또는 백엔드 서비스에는 printWithoutDialog()을(를) 사용하십시오. 일반적인 사용 사례에는 다음이 포함됩니다:

  • POS 시스템: 거래 후 영수증 자동 인쇄
  • 보고서 생성: 하루 또는 주간 보고서를 예약하고 인쇄합니다
  • 레이블 인쇄: 창고 관리 시스템에서 배송 레이블 인쇄
  • 문서 처리: 배치 계약서 또는 법적 문서 인쇄

인쇄 전에 Java에서 워터마크를 추가하거나 콘텐츠를 스탬프해야 하는 애플리케이션의 경우, PDF를 먼저 처리한 다음 프린터로 직접 보내십시오.


Icon Quote related to 직접 인쇄는 언제 가장 효과적일까요?

이 종류의 라이브러리 중 가장 좋아하는 것은 IronPDF입니다. PDF 파일을 빠르고 효율적으로 조작할 수 있습니다. 또한 PDF/A 형식으로 내보내기 및 PDF 문서의 디지털 서명과 같은 많은 유용한 기능을 가지고 있습니다.

Milan Jovanovic related to 직접 인쇄는 언제 가장 효과적일까요?

Milan Jovanovic

마이크로소프트 MVP

사례 연구 보기
Icon Quote related to 직접 인쇄는 언제 가장 효과적일까요?

IronOCR 덕분에 연간 $40,000를 수동 프로세싱에서 절약하고 생산성을 높이며 고부가가치 작업에 자원을 활용할 수 있습니다. 강력히 추천합니다.

Brent Matzelle related to 직접 인쇄는 언제 가장 효과적일까요?

브렌트 마첼

최고 기술 책임자, OPYN

사례 연구 보기
Icon Quote related to 직접 인쇄는 언제 가장 효과적일까요?

IronSuite는 우리의 운영에서 중요한 역할을 합니다. 이것들은 사업 전반에 걸쳐 효율성을 높이는 도구로, 평면도 생성 및 재고 관리 개선을 포함합니다.

David Jones related to 직접 인쇄는 언제 가장 효과적일까요?

데이비드 존스

리드 소프트웨어 엔지니어, Agorus Build

사례 연구 보기

자동화된 워크플로에서 인쇄 오류를 어떻게 처리해야 하나요?

대화 상자 없이 인쇄할 때는 적절한 오류 처리가 중요합니다. 프린터 가용성 문제, 용지 걸림, 연결 문제 등이 배치를 중단시킬 수 있습니다. try-catch 블록으로 인쇄 호출을 감싸고 재시도 전략을 구현하여 일시적인 오류 발생 시 워크플로를 계속 운영할 수 있습니다.

//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/retry-print-handler.java
import com.ironsoftware.ironpdf.*;
import java.io.IOException;
import java.util.logging.*;

public class RobustPrintHandler {
    private static final Logger logger = Logger.getLogger(RobustPrintHandler.class.getName());

    public static void safePrint(PdfDocument pdf, int maxRetries) {
        int attempts = 0;
        boolean success = false;

        while (attempts < maxRetries && !success) {
            try {
                attempts++;
                pdf.printWithoutDialog();
                success = true;
                logger.info("Print successful on attempt " + attempts);

            } catch (Exception e) {
                logger.warning("Print attempt " + attempts + " failed: " + e.getMessage());

                if (attempts < maxRetries) {
                    try {
                        // Wait before retrying
                        Thread.sleep(2000);
                    } catch (InterruptedException ie) {
                        Thread.currentThread().interrupt();
                    }
                } else {
                    // Max retries reached
                    logger.severe("Print failed after " + maxRetries + " attempts");
                }
            }
        }
    }
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/retry-print-handler.java
import com.ironsoftware.ironpdf.*;
import java.io.IOException;
import java.util.logging.*;

public class RobustPrintHandler {
    private static final Logger logger = Logger.getLogger(RobustPrintHandler.class.getName());

    public static void safePrint(PdfDocument pdf, int maxRetries) {
        int attempts = 0;
        boolean success = false;

        while (attempts < maxRetries && !success) {
            try {
                attempts++;
                pdf.printWithoutDialog();
                success = true;
                logger.info("Print successful on attempt " + attempts);

            } catch (Exception e) {
                logger.warning("Print attempt " + attempts + " failed: " + e.getMessage());

                if (attempts < maxRetries) {
                    try {
                        // Wait before retrying
                        Thread.sleep(2000);
                    } catch (InterruptedException ie) {
                        Thread.currentThread().interrupt();
                    }
                } else {
                    // Max retries reached
                    logger.severe("Print failed after " + maxRetries + " attempts");
                }
            }
        }
    }
}
JAVA

safePrint 메서드는 시도 사이에 2초 간격을 두고 최대 maxRetries 번까지 재시도합니다. 각 시도는 기록되므로 특정 작업으로 실패를 추적할 수 있습니다. 재시도 제한에 도달하면 메서드는 심각한 메시지를 기록합니다. 그 이후에는 애플리케이션에서 문서를 디스크에 저장하거나, 나중에 대기열에 두거나, 관리자에게 알릴 수 있습니다.

중요한Java 표준 라이브러리의 일부인 javax.print API는 IronPDF의 인쇄 통합을 지원합니다. 저수준 프린터 검색 및 속성 구성을 위해 Oracle 웹사이트의 Java SE javax.print 문서를 참조하십시오.

어떤 로깅 및 모니터링 관행을 따라야 하나요?

프로덕션 인쇄 워크플로를 구현할 때 다음 관행을 고려하십시오:

  1. 프린터 모니터링: 장치가 오프라인인 상태에서 큐에 대기하지 않도록 인쇄 작업 전 프린터 상태 확인
  2. 큐 관리: 단일 프린터 과부하를 방지하기 위해 인쇄 큐 모니터링
  3. 감사 로깅: 규제 준수를 위한 각 인쇄 작업 (타임스탬프, 문서 이름, 프린터 및 결과) 기록
  4. 대체 옵션: 기본 프린터가 사용할 수 없을 때 대체 프린터를 설정하거나 파일로 저장

복잡한 인쇄 요구 사항에 대해서는 Java에서 PDF 양식 생성하거나 HTML 템플릿 으로 문서를 생성한 후 인쇄하기 전 IronPDF의 기능을 탐색하십시오. Apache PDFBox 프로젝트는 또한 Java가 기본 PDF 사양과 상호작용하는 방법을 이해하기 위한 유용한 참고 자료입니다.

인쇄 작업 대기열을 어떻게 구성해야 하나요?

고수량 시스템의 경우 인쇄 작업 제출과 실행을 분리하여 프린터 포화 상태를 방지합니다. 귀하의 애플리케이션이 PdfDocument 객체를 큐에 추가하고 전용 인쇄 스레드가 이를 큐에서 제거하고 전송하는 생산자-소비자 패턴은 애플리케이션이 과부하 중에도 응답성을 유지합니다. Java의 BlockingQueue이(가) java.util.concurrent에서 여기에서 잘 작동합니다: 프린트 스레드는 루프에서 queue.take()을(를) 호출하며, 각 문서가 도착할 때마다 인쇄하고 결과를 기록합니다. 이 패턴은 또한 우선 순위 레벨, 속도 제한 설정 또는 재시도 예산을 소진한 작업을 위한 데드 레터 큐 추가를 단순하게 만듭니다.


Java에서 PDF를 인쇄하는 다음 단계는?

이 가이드는 사용자 제어가 필요한 데스크톱 애플리케이션을 위한 print()을 통한 상호작용 인쇄와 자동화된 배치 워크플로를 위한 printWithoutDialog()을 통한 무음 인쇄라는 두 가지 접근 방식을 다루었습니다. 두 방법 모두 Java의 표준 인쇄 기반 인프라와 통합되어 있으며, 운영 체제에 설치된 모든 프린터와 함께 작동합니다.

프로젝트에 IronPDF를 추가하고 인쇄를 시작하려면, 무료 체험을 시작하십시오. 신용 카드가 필요하지 않습니다. 배포할 준비가 되었을 때, 팀 또는 조직용 라이선스 옵션을 확인하십시오.

IronPDF로 무엇을 할 수 있는지 준비되셨습니까? 자세한 튜토리얼 페이지는 여기에서 확인해보세요: Java Print PDF 튜토리얼

자주 묻는 질문

자바에서 인쇄 대화 상자를 사용하여 PDF 파일을 인쇄하려면 어떻게 해야 하나요?

PdfDocument.fromFile()로 PDF를 로드하거나 renderHtmlAsPdf()로 하나를 생성한 다음, pdf.print()을 호출합니다. 이때 사용자가 프린터, 페이지 범위, 복사본 수 및 기타 설정을 선택한 후 작업이 전달됩니다.

Java에서 대화 상자를 표시하지 않고 PDF를 인쇄하려면 어떻게 해야 합니까?

IronPDF의 printWithoutDialog() 메서드를 사용하십시오. 이는 PDF를 사용자 상호작용 없이 기본 프린터에 직접 보내므로 배치 처리, 서버 측 서비스, 예약된 인쇄 작업에 적합합니다.

IronPDF로 Java에서 PDF를 인쇄하기 위한 전제 조건은 무엇입니까?

Maven 또는 Gradle을 통해 Java 프로젝트에 IronPDF를 종속성으로 추가한 다음 인쇄 전에 License.setLicenseKey()를 호출하세요. 이 라이브러리는 Java의 javax.print 인프라와 통합되며 운영 체제에 설치된 모든 프린터와 함께 작동합니다.

인쇄하기 전에 HTML에서 PDF를 생성하려면 어떻게 합니까?

PdfDocument.renderHtmlAsPdf()로 HTML 문자열이나 URL을 호출하세요. 이 메서드는 PdfDocument를 반환하므로 디스크에 저장하기 전에 바로 print() 또는 printWithoutDialog()에 전달할 수 있습니다.

IronPDF for Java의 print()와 printWithoutDialog()의 차이점은 무엇입니까?

print()는 작업이 실행되기 전에 사용자가 프린터를 선택하고 설정을 구성할 수 있도록 상호작용 시스템 대화 상자를 엽니다. printWithoutDialog()는 모든 대화 상자를 건너 뛰고 작업을 기본 프린터로 직접 라우팅합니다. print()는 데스크톱 애플리케이션에 사용하고 printWithoutDialog()는 자동화되거나 서버 측 워크플로에 사용합니다.

기존 PDF 파일을 로드하고 IronPDF로 인쇄할 수 있습니까?

네. PdfDocument.fromFile(Paths.get("yourfile.pdf"))을 사용하여 모든 표준 PDF를 로드한 다음, 인쇄 메서드 중 하나를 호출하세요. IronPDF는 파일 경로, 바이트 배열 및 입력 스트림에서 PDF를 로드하는 것을 지원합니다.

Java 배치 워크플로우에서 인쇄 오류와 재시도를 어떻게 처리하나요?

try-catch 블록으로 printWithoutDialog()를 감쌉니다. 실패 시, 오류를 기록하고 Thread.sleep()을 사용하여 잠시 후에 재시도합니다. 시도 카운터를 추적하고 최대 재시도 횟수에 도달하면 중대한 수준의 메시지를 기록하여 모니터링 시스템이 지속적인 실패를 알릴 수 있도록 합니다.

IronPDF for Java는 헤드리스 Linux 서버에서 작동하나요?

네. 헤드리스 서버에서 CUPS와 같은 가상 프린터를 PDF 또는 파일 출력 대상으로 구성합니다. IronPDF의 printWithoutDialog()는 OS에 정의된 기본 프린터로 작업을 전송하므로 CUPS로 관리되는 모든 프린터 대상으로 지원됩니다.

Darrius Serrant
풀스택 소프트웨어 엔지니어 (웹 운영)

다리우스 세런트는 마이애미 대학교에서 컴퓨터 과학 학사 학위를 받았으며, Iron Software에서 풀 스택 웹 운영 마케팅 엔지니어로 근무하고 있습니다. 어린 시절부터 코딩에 매료되었던 그는 컴퓨팅이 신비로우면서도 접근하기 쉬운 분야라고 생각했고, 창의력과 문제 해결 능력을 발휘하기에 완벽한 매체라고 여겼습니다.

Iron Software에서 다리우스는 새로운 것을 만들고 복잡한 개념을 단순화하여 더 쉽게 이해할 수 있도록 하는 것을 즐깁니다. 그는 사내 개발자로서 학생들을 가르치는 데에도 자원하여 차세대 인재들과 전문 지식을 공유하고 있습니다.

다리우스에게 있어 그의 일은 가치 있고 실질적인 영향을 미치기 때문에 보람 있는 일입니다.

시작할 준비 되셨나요?
버전: 2026.6 방금 출시
Still Scrolling Icon

아직도 스크롤하고 계신가요?

빠른 증거를 원하시나요?
샘플을 실행하세요 HTML이 PDF로 변환되는 것을 지켜보세요.