이 페이지에는 자동 번역된 텍스트가 포함될 수 있습니다.

문서 빌드

물론 데이터로 PDF 문서를 생성해야 합니다. 하지만 종종 PDF 파일을 암호로 암호화하고 싶기도 합니다. 그리고 일반적으로 출력 파일에 PDF 메타데이터를 추가하고 싶습니다.

생성기에 PDF 파일 암호화를 지시하는 방법과 문서 작성자 및 키워드를 지정하는 방법을 계속 읽어보세요.

이 문서는 PDF 생성을 위한 Layout API 시리즈의 일부입니다. API가 처음이라면 먼저 Layout API 시작하기 부분을 읽어보세요.

PDF 문서 빌드

Create 및 Generate

Layout API의 진입점은 PdfDocumentBuilder 클래스입니다. 먼저 Create 메서드로 클래스 인스턴스를 만듭니다. PDF를 생성하려면 클래스의 Generate 메서드를 호출합니다.

Generate는 출력을 파일 또는 스트림에 저장할 수 있습니다. 두 버전의 메서드 모두 두 번째 매개 변수로 Action<Document> 형식의 대리자를 필요로 합니다. 대리자에서는 원하는 문서를 설명합니다. 라이브러리는 해당 설명을 기반으로 PDF를 생성합니다.

암호화

출력 PDF를 암호화하려면 Encryption 메서드를 Generate 메서드 전에 호출합니다.

암호화 처리기를 만들고 제공해야 합니다. 암호로 PDF를 암호화하려면 PdfStandardEncryptionHandler 형식의 처리기를 사용합니다.

PdfDocumentBuilder.Create()
    .Encryption(new PdfStandardEncryptionHandler("owner", "user"))
    .Generate("encrypted-with-password.pdf", doc => doc.Pages(_ => { }));

인증서로도 PDF를 암호화할 수 있습니다. PDF 문서 암호화 문서를 확인하세요. 여기에는 암호화 처리기와 PDF 권한에 대한 자세한 정보가 포함되어 있습니다.

PDF 메타데이터

일부 워크플로에서는 출력 PDF에 적절한 PDF 키워드와 PDF 작성자를 지정하는 것이 매우 중요합니다. Layout API는 이를 위한 쉬운 방법을 제공합니다. Info 메서드를 Generate 메서드 전에 호출하고 대리자에 메타데이터 값을 제공합니다.

PdfDocumentBuilder.Create()
    .Info(info =>
    {
        info.Author = $"{Environment.UserName}";
        info.Title = "Generate encrypted PDF with custom metadata";
        info.Keywords = "Metadata keywords encryption";
    })
    .Generate("metadata.pdf", doc => doc.Pages(_ => { }));

옵션

동일한 내용에 대해서도 라이브러리는 서로 다른 내부 구조의 PDF 파일을 만들 수 있습니다. 이러한 옵션은 출력 PDF에 영향을 줍니다.

버전

출력 PDF의 최소 PDF 형식 버전을 설정하려면 Version 메서드를 사용합니다.

PdfDocumentBuilder.Create()
    .Version(PdfVersion.Pdf17)
    .Generate("version.pdf", doc => doc.Pages(_ => { }));

라이브러리는 지정된 것보다 더 높은 버전의 PDF를 만들 수 있다는 점에 유의하세요. 이는 문서 내용에 더 새로운 버전이 필요할 때 발생합니다. 다시 말해, 문서가 지정된 PDF 표준 버전에서 사용할 수 없는 기능을 사용할 때입니다.

객체 스트림

기본적으로 라이브러리는 생성된 PDF에서 객체 스트림을 사용합니다. 이는 더 작고 더 잘 압축된 파일을 만드는 데 도움이 됩니다.

ObjectStreams 메서드를 사용하여 객체 스트림 없이 PDF 파일을 만들도록 API를 지시할 수 있습니다.

PdfDocumentBuilder.Create()
    .ObjectStreams(false)
    .Generate("no-object-streams.pdf", doc => doc.Pages(_ => { }));

규제 요구 사항이 없는 한 객체 스트림을 계속 사용하는 것이 좋습니다. 또는 워크플로의 다른 부분에서 객체 스트림이 있는 문서를 처리할 수 없을 때도 마찬가지입니다.

스트림 공급자

라이브러리는 중간 저장소로 스트림을 사용합니다. PDF를 생성할 때 이미지 및 기타 대용량 개체에 대해 그렇게 합니다. 라이브러리는 스트림 공급자를 통해 스트림을 가져옵니다. 현재 PdfDocumentBuilder 인스턴스와 항상 하나가 연결되어 있습니다.

라이브러리는 기본적으로 PdfMixedStorageStreamProvider를 사용합니다. 이 스트림 공급자 구현은 데이터를 메모리에 유지하는 스트림을 제공합니다. 데이터가 너무 많아지면 이 스트림은 내용을 임시 파일로 플러시합니다. 이를 통해 메모리 사용량을 줄이고 LOH 조각화를 방지할 수 있습니다.

PDF 파일을 생성할 때 IPdfStreamProvider 인터페이스의 자체 구현을 사용할 수 있습니다. 변경 이유 중 하나는 디스크 작업이 느리거나 비용이 많이 들 수 있기 때문입니다. 클라우드 환경이 여기에 해당할 수 있습니다.

다음 코드는 임시 파일 없이 완전히 메모리에서 PDF를 생성하는 방법을 보여줍니다. 이는 기본 옵션보다 훨씬 더 많은 메모리를 필요로 한다는 점에 유의하세요.

using var memoryOnlyProvider = new PdfMemoryStreamProvider();
PdfDocumentBuilder.Create()
    .StreamProvider(memoryOnlyProvider)
    .Generate("created-without-temp-files.pdf", doc => doc.Pages(_ => { }));

라이브러리는 결국 스트림 공급자를 통해 가져온 모든 스트림에 대해 Dispose를 호출합니다. 스트림 공급자 인스턴스는 직접 해제해야 합니다.