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

C#에서 PDF 편집

Docotic.Pdf를 사용하여 PDF 문서를 수정하세요. 강력한 기능과 직관적인 API를 결합한 C# 및 VB.NET용 PDF 편집 라이브러리입니다.

Docotic.Pdf 라이브러리 9.5.17573-dev 회귀 테스트 14,726건의 테스트 통과 총 NuGet 다운로드 4,765,230
PDF 편집기 아이콘

Docotic.Pdf는 PDF 문서를 편집할 수 있는 다양한 수단을 제공합니다. 다음은 PDF 편집을 위한 라이브러리의 주요 기능 중 일부입니다.

  • 여러 PDF를 하나로 결합하거나 단일 PDF를 여러 파일로 분할합니다.
  • PDF 파일 크기를 줄입니다.
  • 페이지를 재정렬, 삭제, 회전 또는 추출합니다.
  • PDF 메타데이터를 읽거나 변경하거나 삭제합니다.
  • 디지털 서명으로 PDF에 서명합니다.
  • 문서를 암호화하거나 PDF에서 비밀번호를 제거합니다.
  • 주석과 첨부 파일을 추가, 편집 또는 제거합니다.
  • AcroForms에 채우고, 양식 컨트롤을 추가하거나 제거합니다.
  • 양식 필드와 주석을 평면화하여 PDF 콘텐츠의 일부로 만듭니다.
  • PDF 내에서 텍스트를 추가, 삭제 또는 바꿉니다.
  • 이미지를 삽입, 교체 및 크기 조정합니다.
  • 워터마크와 배경을 추가합니다.
  • 스캔한 문서를 편집 및 검색 가능한 텍스트로 변환합니다.

다음 섹션에서는 PDF 편집 기능을 더 자세히 설명하겠습니다. 이 섹션에는 코드 조각과 관련 리소스에 대한 링크도 포함되어 있습니다.

PDF 병합 및 분할

이 섹션에서는 서로 반대되는 목표를 가진 두 가지 기능에 대해 설명합니다.

C# 및 VB.NET에서 PDF 분할 및 병합

PDF 결합

PDF 파일을 통합하면 단일 PDF 문서가 생성됩니다. 병합된 PDF에는 일반적으로 여러 기존 PDF 파일의 관련 정보가 포함됩니다.

다음은 Docotic.Pdf를 사용하여 PDF 파일을 결합하는 방법을 보여주는 코드 조각입니다.

using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.Save("merged.pdf");

코드는 가장 기본적인 케이스를 보여주기 때문에 매우 간단합니다. 더 복잡한 병합 케이스를 설명하는 기사가 있습니다. 예를 들어, 암호화된 문서를 결합하는 방법을 보여줍니다.

PDF 분할

분할은 원본 PDF에서 선택한 페이지를 추출하여 하나 이상의 새 PDF 파일을 만드는 것을 의미합니다. 이 프로세스는 문서의 일부만 공유하려는 경우에 유용합니다.

다음 코드 조각은 PDF의 각 페이지에서 새 문서를 만드는 방법을 보여줍니다.

using var pdf = new PdfDocument("compound.pdf");
for (int i = 0; i < pdf.PageCount; ++i)
{
    using PdfDocument copy = pdf.CopyPages(i, 1);

    // 복사된 페이지에서 글꼴, 이미지, 패턴 등 사용되지 않는 리소스를
    // 참조하는 경우 파일 크기를 줄이는 데 도움이 됩니다.
    copy.RemoveUnusedResources();
    copy.Save(i + ".pdf");
}

전담 문서에서 PDF 분할기를 구현하는 다른 접근 방식에 대해 읽어보세요.

PDF 압축

PDF를 압축할 때는 두 가지 주요 접근 방식이 있습니다. 첫 번째는 파일의 내용을 변경하지 않고 형식만 변경하는 작업만 적용하는 것입니다. 두 번째 접근 방식에는 더 나은 압축을 위해 세부 정보나 문서의 품질을 잃을 수 있는 변경 사항도 포함됩니다.

무손실 PDF 압축

기본적으로 라이브러리는 PDF 객체를 저장하여 더 적은 바이트를 차지하도록 합니다. 이를 위해 사용되지 않는 객체를 제외하고, 서식 없이 객체를 작성하고, 가능한 경우 더 짧은 형식을 사용합니다.

압축을 더욱 개선하기 위해 Docotic.Pdf는 출력 PDF에 객체 스트림도 생성합니다. 이는 가장 압축된 표현으로 객체를 쓰는 또 다른 형태입니다. 객체 스트림은 Flate 알고리즘으로 압축됩니다.

저장 옵션을 사용하여 라이브러리가 객체를 저장하는 방식에 영향을 줄 수 있습니다.

일부 문서에는 중복된 글꼴, 이미지, 색상 프로필 및 기타 개체가 포함되어 있습니다. 이는 일반적으로 증분 업데이트된 문서 및 여러 문서를 병합하여 만든 파일의 경우입니다. PdfDocument.ReplaceDuplicateObjects 메서드를 사용하여 이러한 개체의 중복을 제거하면 출력 크기를 크게 줄일 수 있습니다.

문서의 페이지는 사용되지 않는 리소스를 참조할 수 있습니다. 예를 들어, 이전에는 페이지에 표시되었지만 더 이상 표시되지 않는 이미지입니다. PdfDocument.RemoveUnusedResources 메서드를 사용하여 이러한 리소스를 제거합니다.

PDF에서 이러한 모든 작업을 수행하면 품질을 손상시키지 않고도 파일 크기를 줄일 수 있습니다.

손실 변환

이미지가 있는 파일의 경우 PDF 크기를 줄이는 가장 효과적인 방법 중 하나는 이미지의 압축 체계를 변경하는 것입니다. 예를 들어, 이미지에 JPEG와 같은 손실 압축을 사용하면 크기가 줄어듭니다. 부작용으로 압축 아티팩트와 세부 정보 손실이 이미지에 나타날 수 있습니다.

PDF의 이미지가 필요 이상으로 큰 경우 크기 조정할 수 있습니다. 이렇게 하면 압축이 더 잘 될 수 있습니다. 또 다른 옵션은 이미지를 흑백(바이토널)으로 변환하는 것입니다.

공간을 절약하기 위해 양식 필드와 주석을 평면화할 수 있습니다. 문서에서 편집 가능한 주석과 양식 필드가 더 이상 필요하지 않을 때 이 방법이 합리적입니다.

글꼴은 문서에서 많은 공간을 차지할 수 있습니다. PdfDocument.RemoveUnusedFontGlyphs 메서드는 글꼴에서 사용되지 않는 글리프를 제거하여 출력 크기를 최적화할 수 있습니다. 글꼴 하위 설정은 이 프로세스의 또 다른 이름입니다. 문서에서 글꼴 바이트를 완전히 제거할 수도 있습니다(글꼴 임베드 해제). 문서에 Arial과 같은 인기 있는 글꼴의 바이트가 포함되어 있는 경우 이 방법이 적합할 수 있습니다.

다른 변환은 문서에서 정보를 직접 제거합니다. 메타데이터, 구조 정보 및 개인 애플리케이션 데이터를 제거할 수 있습니다. 이 데이터는 표시되지 않지만 문서 사용자에게 중요하지 않은 경우에만 제거합니다.

더 자세한 내용을 알아보고 몇 가지 코드 예시를 보려면 PDF 파일 크기를 줄이는 방법에 대한 문서를 읽어보세요.

PDF에서 페이지 재정렬

PDF 내에서 페이지 순서를 변경해야 할 이유는 충분합니다. 예를 들어, 관련 정보를 그룹화하거나 문서가 논리적으로 흐르도록 하여 문서의 가독성을 개선해야 할 수도 있습니다.

PDF에서 페이지 재정렬

페이지 병합 및 분할 기능 외에도 Docotic.Pdf는 PDF에서 페이지를 재정렬하는 광범위한 다른 메서드 세트를 제공합니다. C# 코드 조각과 Docotic.Pdf API를 사용하여 PDF 페이지를 구성하는 방법을 보여드리겠습니다.

이 섹션 예제에 대한 완전한 테스트 프로젝트는 샘플 코드의 페이지 및 탐색 그룹에서 찾을 수 있습니다. 저는 스니펫에서 ten-pages.pdf를 사용합니다. 이것은 각 페이지에 Page N 제목이 있는 사소한 테스트 문서입니다.

PDF 페이지 이동

다음 스니펫은 연속적인 페이지 범위를 이동하는 방법을 보여줍니다. 이 코드는 페이지의 전반부를 문서 끝으로 이동합니다.

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.MovePages(0, 5, pdf.PageCount);

pdf.Save("continuous-move.pdf");

임의의 페이지 세트를 이동할 수 있습니다. 다음 코드는 홀수 페이지를 문서의 끝으로 이동합니다.

using var pdf = new PdfDocument("ten-pages.pdf");

int[] indexes = [0, 2, 4, 6, 8];
pdf.MovePages(indexes, pdf.PageCount);

pdf.Save("arbitrary-move.pdf");

한 페이지만 이동하려면 PdfDocument.MovePage 메서드를 사용합니다.

PDF 페이지 바꾸기

두 페이지를 교환하려면 다음 스니펫과 같은 코드를 사용하세요.

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.SwapPages(9, 0);
pdf.SwapPages(8, 1);

pdf.Save("swapped.pdf");

PdfDocument.SwapPages 메서드는 서로의 위치를 ​​차지해야 하는 두 페이지의 인덱스를 허용합니다. 페이지 수가 2가 아닌 경우 MovePages 메서드 중 하나를 사용합니다.

페이지 추가 및 삽입

모든 PdfDocument에는 최소한 한 페이지가 들어 있습니다. 새 문서를 만들면 라이브러리가 암묵적으로 한 페이지를 추가합니다.

다음은 Docotic.Pdf API를 사용하여 PDF에 빈 페이지를 삽입하는 방법입니다. 0에서 PageCount까지 인덱스가 있는 위치에 페이지를 삽입할 수 있습니다.

using var pdf = new PdfDocument();

var newPage = pdf.InsertPage(0);
newPage.Canvas.DrawString("This is the new first page");

pdf.Save("two-pages.pdf");

PDF에 빈 페이지를 추가하려면 PdfDocument.AddPage 메서드를 사용합니다. 이 메서드는 문서 끝에 새 페이지를 추가합니다. pdf.InsertPage(pdf.PageCount) 호출과 동일한 작업을 수행합니다.

다른 문서에서 페이지를 추가하거나 삽입하려면 PDF 앞에 추가 섹션에 설명된 것과 같은 호출 조합을 사용합니다. 호출 조합을 사용하여 PDF에 표지 페이지를 추가할 수 있습니다.

PDF 페이지 복제

라이브러리 API를 사용하면 복제 작업을 두 개의 연속 작업으로 수행할 수 있습니다. 첫 번째는 페이지 복사 작업입니다. PDF 분할 섹션의 코드 예제를 참조하세요.

두 번째는 페이지 붙여넣기 작업입니다. 이 작업에는 PdfDocument.Append 메서드를 사용합니다. 그런 다음 추가된 페이지를 필요한 위치로 이동합니다.

페이지 추출

다음 스니펫은 PDF에서 페이지를 추출하는 방법을 보여줍니다. 소스 문서에서 처음 세 페이지를 추출합니다.

using var pdf = new PdfDocument("ten-pages.pdf");

using (var extracted = pdf.ExtractPages(0, 3))
{
    extracted.RemoveUnusedResources();
    extracted.Save("three-pages.pdf");
}

pdf.Save("seven-pages.pdf");

ExtractPages 메서드는 문서에서 페이지를 제거합니다. 이로 인해 소스 문서에는 7페이지만 남습니다. 라이브러리는 페이지가 하나만 있는 문서에서 페이지를 추출하는 것을 허용하지 않습니다.

추출된 페이지가 있는 문서에서 사용되지 않는 리소스를 제거하는 것이 좋습니다.

PDF에서 페이지 제거

PDF 문서에서 페이지를 삭제하는 방법을 보여주는 스니펫을 확인하세요. 실제로는 RemovePage 메서드의 다른 오버로드를 사용하여 두 페이지를 삭제합니다. 첫 번째 오버로드는 페이지 인덱스를 매개변수로 허용합니다. 두 번째 오버로드는 페이지 객체를 허용합니다.

using var pdf = new PdfDocument("ten-pages.pdf");
pdf.RemovePage(0);
pdf.RemovePage(pdf.Pages[0]);
pdf.Save("without-first-two-pages.pdf");

한 번에 여러 페이지를 제거하려면 PdfDocument.RemovePages 메서드를 사용합니다. 해당 메서드 오버로드는 페이지 인덱스 또는 페이지 객체의 배열로 작동합니다.

디지털 서명

Docotic.Pdf는 PDF에서 디지털 서명을 위한 많은 작업을 구현하며 PDF 문서의 신뢰성과 법적 타당성을 유지하는 데 도움을 줄 수 있습니다. 라이브러리가 할 수 있는 일의 몇 가지 예는 다음과 같습니다.

인증서로 PDF에 서명. PDF에 디지털 서명을 추가하는 것은 서명자의 신원을 확인하고 서명 후 아무도 문서를 변경하지 않았는지 확인하는 방법입니다.

서명 인증. PDF에 추가 제한을 추가하려면 인증 서명으로 서명할 수 있습니다. 서명 후 PDF를 완전히 잠그거나 몇 가지 유형의 변경을 허용할 수 있습니다.

PDF에서 서명 확인. 디지털 서명의 유효성을 확인하여 문서의 서명된 부분이 변경되지 않았는지 확인합니다.

여러 서명 허용. 계약서, 합의서 및 양식은 종종 여러 당사자가 단일 문서에 서명하도록 요구합니다. PDF에 여러 서명을 추가하려면 문서를 증분적으로 저장해야 함.

서명 타임스탬프 포함. 타임스탬핑 권한 URL과 선택적으로 서명 옵션에서 자격 증명을 지정할 수 있습니다. 라이브러리는 수신된 타임스탬프를 서명에 포함합니다.

인증서 내장. 라이브러리는 자동으로 디지털 서명에 서명 인증서를 내장합니다.

디지털 서명 페이지에는 샘플 코드와 각 작업에 대한 자세한 정보가 포함되어 있습니다.

PDF 보호

PDF 보안을 보장하는 데 사용할 수 있는 세 가지 기능이 있습니다. Docotic.Pdf는 양방향으로 이들과 함께 작동할 수 있습니다. 라이브러리는 PDF를 보호하고 보안된 PDF를 잠금 해제할 수 있습니다.

PDF 보안

비밀번호 보호

이 기능을 사용하면 PDF에 대한 액세스를 제한하기 위한 암호를 설정할 수 있습니다. 암호 유형에 따라 PDF는 문서를 열거나 수정하기 위해 올바른 암호가 필요합니다.

PDF에는 두 가지 유형의 비밀번호가 있습니다.

  • 열기 비밀번호(사용자 비밀번호). 이 유형의 비밀번호는 PDF를 열고 보는 데 필요합니다. 올바른 비밀번호가 없으면 적합한 PDF 뷰어가 문서를 열 수 없습니다.
  • 권한 비밀번호(소유자 비밀번호). 이 비밀번호는 PDF에서 권한을 제거하는 데 필요합니다. 소유자 비밀번호로 PDF를 열면 모든 작업이 허용되며, 권한이 PDF 인쇄, 복사 또는 편집과 같은 특정 작업을 제한하더라도 마찬가지입니다.

동일한 PDF 문서에 대해 두 개의 비밀번호를 설정할 수 있습니다. PDF 문서에서 비밀번호를 제거하는 방법을 알아보려면 PDF 파일 암호 해독에 대해 읽어보세요.

암호화

PDF 암호화와 PDF 비밀번호는 함께 작동하여 PDF 내의 민감한 정보가 합법적인 사용자에게만 제공되도록 합니다. 올바른 복호화 키 또는 비밀번호를 가진 사용자만 콘텐츠를 볼 수 있습니다.

Docotic.Pdf는 RC4 40비트, RC4 128비트, AES 128비트 및 AES 256비트 암호화 알고리즘을 사용하여 PDF 파일을 암호화할 수 있습니다.

권한 및 제한

PDF에 인쇄 제한, 텍스트 복사, 문서 편집 등 다양한 권한을 설정할 수 있습니다. 권한은 누군가가 사용자 비밀번호로 PDF를 열 때의 경험에만 영향을 미칩니다. 소유자 비밀번호로 PDF를 여는 사람에게는 어떠한 제한도 적용되지 않습니다.

PDF에서 권한을 제거하려면 먼저 PDF 보안 비밀번호를 제거해야 합니다. C# 및 Docotic.Pdf API를 사용하여 이 작업을 수행하는 방법에 대해 읽어보세요.

PDF 보안 외에도 PDF 무결성을 보장하는 방법을 알아보려면 디지털 서명에 대한 섹션을 읽어보세요.

PDF의 메타데이터

PDF 메타데이터는 문서에 대한 세부 정보를 제공하는 PDF 파일에 포함된 정보입니다. 메타데이터의 두 가지 주요 소스는 PDF 문서 속성과 XMP 메타데이터입니다.

문서 속성은 일반적으로 문서 정보 사전, 파일 정보, 메타데이터 필드, 문서 속성 및 파일 속성이라고도 합니다.

XMP(Extensible Metadata Platform) 메타데이터는 기본적으로 PDF에 포함된 XML 파일입니다. XMP는 모든 메타데이터 속성 집합을 저장할 수 있는 유연한 데이터 모델을 사용합니다. 이 메타데이터는 네임스페이스를 사용하여 관련 속성을 그룹화합니다. 일반적인 네임스페이스로는 XMP Core/XMP Basic 및 Dublin Core가 있습니다.

Docotic.Pdf는 XMP 메타데이터와 문서 속성을 모두 완벽하게 지원합니다. PDF 2.0 표준은 대부분의 문서 정보 사전 속성을 더 이상 사용되지 않는 것으로 표시했습니다. 유일한 예외는 생성 날짜와 수정 날짜입니다.

이 섹션 예제에 대한 전체 테스트 프로젝트는 샘플 코드의 메타데이터 그룹에서 찾을 수 있습니다.

문서 속성

Docotic.Pdf를 사용하여 문서 속성을 편집하는 방법을 알아보세요.

using var pdf = new PdfDocument("file.pdf");
pdf.Info.Author = "An example code";
pdf.Info.Subject = "Showing how to access and change document metadata";
pdf.Info.Title = "Custom title goes here";
pdf.Info.Keywords = "pdf Docotic.Pdf";

pdf.Save("updated-file.pdf");

각 속성에 대한 값을 변경할 수 있지만 기본적으로 라이브러리는 PDF를 저장하기 전에 일부 속성을 자동으로 업데이트합니다. 저장 옵션에서 이를 변경할 수 있습니다.

문서 속성에 지정된 모든 메타데이터를 제거하려면 PdfInfo.Clear 메서드를 사용합니다. 이 메서드는 원하는 경우 사용자 지정 속성만 제거할 수 있습니다.

XMP 메타데이터

이 스니펫은 PDF 문서에서 XMP 메타데이터의 속성을 변경하는 방법을 보여줍니다.

using var pdf = new PdfDocument("file.pdf");

pdf.Metadata.DublinCore.Creators = new XmpArray(XmpArrayType.Ordered);
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("me"));
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("Docotic.Pdf"));
pdf.Metadata.DublinCore.Format = new XmpString("application/pdf");

pdf.Metadata.Pdf.Producer = new XmpString("me too!");

pdf.Save("updated-file.pdf");

이 코드는 Dublin Core와 Adobe PDF 스키마의 속성을 변경합니다. 기본 저장 옵션 때문에 Producer 속성이 덮어쓰여진다는 점에 유의하세요.

XmpMetatada.Save 메서드 중 하나를 사용하여 원시 XMP 메타데이터를 추출할 수 있습니다. 이 메서드는 모든 속성이 포함된 XML을 생성합니다.

문서에서 모든 XMP 메타데이터를 제거하려면 XmpMetadata.Unembed 메서드를 사용합니다.

동기화 메타데이터

XMP 메타데이터와 문서 정보 속성이 해당 속성에 대해 동일한 값을 갖는지 확인하는 것이 좋습니다. 특히 동일한 파일에서 두 메타데이터 소스를 모두 편집하는 경우 더욱 그렇습니다.

PdfDocument.SyncMetadata 메서드를 사용하여 XMP 메타데이터와 문서 정보의 값을 동기화합니다. 두 소스에서 속성이 변경되면 메서드는 한 소스를 다른 소스의 값으로 덮어씁니다. 자세한 내용은 메서드 설명서를 참조하세요.

PDF 북마크

PDF 문서에는 독자가 특정 섹션이나 페이지로 빠르게 이동할 수 있도록 돕는 특수 단축키나 링크가 포함될 수 있습니다. PDF 개요는 북마크의 또 다른 이름입니다.

PDF 개요

뷰어 앱은 일반적으로 책의 목차와 같은 북마크를 표시하지만, 상호 작용합니다. 독자가 북마크를 클릭하면 뷰어 앱이 문서의 지정된 부분으로 이동합니다. 링크 주석을 사용하여 유사한 동작을 달성할 수 있습니다.

다음은 PDF에 북마크를 추가하는 방법을 보여주는 C# 코드 조각입니다.

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
root.AddChild("Fifth page", 4);
root.AddChild("Seventh page", pdf.Pages[6]);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("simple-bookmarks.pdf");

PDF 개요에는 주요 북마크와 하위 북마크가 있어 큰 문서를 구조화하기가 더 쉽습니다. PDF에서 하위 북마크를 만드는 방법은 다음과 같습니다.

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
var evenPages = root.AddChild("Even pages");

evenPages.AddChild("Second page", 1);
evenPages.AddChild("Fourth page", 3);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("even-pages-bookmarks.pdf");

북마크 항목에 글꼴과 색상을 적용할 수 있습니다. 스타일이 있는 개요를 만드는 전체 예를 확인하세요.

PDF에서 북마크를 제거하려면 RemoveChild 또는 RemoveChildAt 메서드를 사용합니다. 루트 노드에서 RemoveAllChildren 메서드를 호출하여 모든 북마크를 제거할 수 있습니다.

파일 첨부

PDF 첨부 파일은 PDF 문서에 포함된 외부 파일입니다. 사람들은 이러한 파일을 일반적으로 내장 파일 및 파일 첨부 파일이라고도 합니다. 이미지, 오디오/비디오 파일, 다른 PDF, Word 문서, Excel 스프레드시트 또는 기타 모든 파일을 첨부할 수 있습니다.

PDF를 첨부하여 결합된 PDF 파일을 만들려면 PDF 문서 병합에 대한 문서를 확인하세요.

다음은 Docotic.Pdf API의 도움으로 PDF에 첨부 파일을 추가하는 방법을 보여주는 C# 코드입니다.

using var pdf = new PdfDocument();

var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.SharedAttachments.Add(excelFile);

pdf.Save("shared-attachment.pdf");

위의 코드는 파일을 공유 첨부 파일로 추가했습니다. 독자는 뷰어의 첨부 파일 패널에서 첨부 파일을 찾을 수 있습니다.

PDF 페이지에 첨부 파일을 추가하는 것도 가능합니다. 이러한 첨부 파일은 다른 주석과 마찬가지로 페이지 내용 내부에서 볼 수 있습니다.

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
page.Canvas.DrawString(20, 100, "Here is this year's figures document:");

var bounds = PdfRectangle.FromLTRB(155, 100, 165, 110);
var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.Pages[0].AddFileAnnotation(bounds, excelFile);

pdf.Save("page-attachment.pdf");

이 섹션의 예제에 대한 완전한 테스트 프로젝트를 찾으려면 샘플 코드의 첨부 파일 그룹을 확인하세요.

PDF에서 첨부 파일을 제거하려면 공유 첨부 파일과 페이지 주석을 모두 열거하고 필요 없는 항목을 제거해야 합니다. 아래 열거 코드의 예를 참조하세요. 모든 공유 주석을 제거하려면 pdf.SharedAttachments.Clear() 호출을 사용할 수 있습니다.

PDF에서 내장된 파일을 추출하려면 컬렉션을 열거해야 합니다. 다음은 예제 코드입니다.

using var pdf = new PdfDocument("file-with-attachments.pdf");

int i = 0;
foreach (var attachment in pdf.SharedAttachments)
{
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

foreach (var widget in pdf.GetWidgets())
{
    var attachment = (widget as PdfFileAttachmentAnnotation)?.File;
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

페이지 라벨

PDF 페이지 라벨은 PDF 문서의 페이지에 할당된 사용자 지정 이름 또는 번호입니다. 표준 페이지 번호와 달리 페이지 라벨에는 문자, 숫자, 심지어 로마 숫자까지 혼합하여 포함될 수 있습니다. 페이지 라벨의 다른 이름은 페이지 식별자와 페이지 이름입니다.

Docotic.Pdf를 사용하여 PDF에 페이지 라벨을 추가하는 방법은 다음과 같습니다.

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.PageLabels.AddRange(0, 3, PdfPageNumberingStyle.LowercaseRoman);
pdf.PageLabels.AddRange(4, PdfPageNumberingStyle.DecimalArabic, string.Empty, 5);
pdf.PageLabels.AddRange(7, PdfPageNumberingStyle.DecimalArabic, "Appendix page ", 1);

pdf.Save("page-labels.pdf");

처음 네 페이지에는 i, ii, iii, iv라는 라벨이 붙습니다. 그 다음 세 개의 라벨은 5, 6, 7입니다. 나머지 페이지에는 Appendix page 1, Appendix page 2, Appendix page 3라는 라벨이 붙습니다.

OCR PDF

일부 PDF 문서에는 스캔된 페이지가 포함되어 있으며, 텍스트를 추출하기 전에 광학 문자 인식(OCR)이 필요합니다. OCR의 또 다른 사용 사례는 사용자 지정 글리프를 유니코드로 매핑하는 PDF에서 텍스트를 추출하는 것입니다.

OCR 스캔된 PDF를 텍스트 추출

OCR 스캔 문서를 만드는 방법을 보여주는 블로그 게시물이 있습니다. 이 게시물에는 검색 불가능한 PDF 예제가 포함되어 있으며 Tesseract OCR, C# 코드 및 Docotic.Pdf를 사용하여 이미지 전용 PDF의 텍스트를 인식하는 방법을 보여줍니다. Docotic.Pdf의 도움으로 스캔된 PDF 파일에 OCR 텍스트 레이어를 추가할 수도 있습니다.

페이지 편집

이 섹션에서는 기존 PDF 페이지의 변경 사항(예:

  • PDF 페이지 회전 방법
  • 페이지 크기 변경 방법
  • 페이지 캔버스에서 벡터 그래픽 사용
  • HTML 콘텐츠 추가)에 대해 설명합니다.

헤더와 푸터, 표, 이미지, 텍스트 문단 등의 구성 요소를 사용하여 PDF 문서를 만드는 방법을 알아보려면 라이브러리의 레이아웃 API에 대해 읽어보세요.

다른 섹션에서 다음에 대한 정보를 확인하세요.

페이지 회전

PDF에서 한 페이지만 회전하는 방법은 C# 코드 조각을 참조하세요.

using var pdf = new PdfDocument("existing.pdf");

pdf.Pages[0].Rotation = PdfRotation.Rotate180;

pdf.Save("rotated.pdf");

코드는 첫 번째 페이지를 180도 회전합니다. PDF 페이지를 0, 90, 270도 회전할 수도 있습니다.

페이지 크기 변경

Docotic.Pdf는 PDF의 페이지 크기를 변경하는 여러 가지 방법을 제공합니다. 가장 간단한 경우, PdfPage 객체의 WidthHeight 속성을 사용하여 원하는 크기를 지정할 수 있습니다. 기존 문서의 경우 문서 페이지 콘텐츠의 크기를 조정하지 않습니다. 그리고 콘텐츠를 제거하지도 않습니다. 지정된 크기의 사각형 밖에 있는 모든 페이지 콘텐츠를 숨길 뿐입니다.

비슷한 접근 방식은 페이지를 자르는 것입니다. 다음과 같이 C# 코드를 사용하여 페이지의 CropBox를 변경할 수 있습니다.

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var cropBoxBefore = page.CropBox;
page.CropBox = new PdfBox(0, cropBoxBefore.Height - 256, 256, cropBoxBefore.Height);

pdf.Save("cropped.pdf");

페이지의 일부를 이미지로 저장하고 싶다면 자르기 상자를 변경하는 것이 가장 좋은 방법입니다.

목표가 모든 내용을 서로 다른 크기의 페이지에 표시되도록 하는 것이라면 스케일링 접근 방식을 사용합니다. 다음 코드 조각에서 페이지에서 XObject를 만듭니다. XObject는 벡터 이미지와 같습니다. 여러 페이지에 동일한 객체를 그려 필요에 따라 스케일링하고 회전할 수 있습니다.

XObject가 준비되면 이전 페이지 내용을 지우고, 페이지 크기를 조정한 다음, 크기가 조정된 페이지에 개체를 그립니다.

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var pageXObject = pdf.CreateXObject(page);

page.Canvas.Clear();
page.Width /= 2;
page.Height /= 2;

page.Canvas.DrawXObject(pageXObject, 0, 0, page.Width, page.Height, 0);

pdf.Save("resized.pdf");

벡터 그래픽

Docotic.Pdf 라이브러리는 선, 곡선, 모양과 같은 벡터 그래픽을 PDF 문서에 추가할 수 있습니다. 그래픽 객체에서 그래픽 경로를 구성할 수 있습니다. 그런 다음 다른 색상 공간의 색상을 사용하여 경로를 채우거나 획을 그릴 수 있습니다.

샘플 코드의 그래픽 그룹에서 그래픽 관련 기능에 대한 예제 코드를 찾아보세요.

PDF에서 그래픽을 추출하는 것도 가능합니다. GetObjects 메서드를 호출하는 것으로 시작한 다음 PdfPageObjectType.Path 유형의 객체에서 정보를 추출합니다. XObject도 중첩된 경로를 포함할 수 있다는 것을 잊지 마세요.

using var pdf = new PdfDocument("existing.pdf");

var options = new PdfObjectExtractionOptions();
var objects = pdf.Pages[0].GetObjects(options);
foreach (var obj in objects)
{
    if (obj.Type == PdfPageObjectType.Path)
    {
        var path = (PdfPath)obj;
        Console.WriteLine($"Found path {path}");
    }
    else if (obj.Type == PdfPageObjectType.XObject)
    {
        var paintedXObject = (PdfPaintedXObject)obj;
        var nestedObjects = paintedXObject.XObject.GetObjects(options);
        // ...
    }
}

PDF 페이지에 HTML 추가

PDF 문서에 HTML 콘텐츠를 오버레이하면 차트나 주가 티커와 같은 동적 요소를 PDF에 추가하는 데 유용할 수 있습니다.

자세한 내용을 알아보고 예제 코드를 다운로드하려면 PDF에 HTML 삽입 방법에 대해 읽어보세요.

PDF 텍스트 편집

이 섹션에서는 PDF의 텍스트를 편집하는 방법, PDF의 텍스트 색상을 변경하는 방법, 새로운 텍스트를 추가하는 방법에 대해 설명합니다.

PDF 편집기가 텍스트를 변경합니다

PDF에서 텍스트를 추출하는 방법에 대한 기사가 있습니다. 주제에 대한 자세한 내용은 기사를 확인하세요.

Docotic.Pdf의 도움으로 텍스트 평면화도 가능합니다.

찾아서 바꾸기

PDF에서 텍스트를 수정하려면 텍스트가 포함된 영역을 찾은 다음 해당 영역의 텍스트를 제거해야 합니다. 마지막 단계는 문서의 동일한 영역에 새 텍스트를 추가하는 것입니다.

PDF 검색은 문서 내부적으로 단어가 어떤 순서로든 포함될 수 있기 때문에 까다로울 수 있습니다. 텍스트도 회전할 수 있습니다. 다행히도 PDF에서 단어나 구문을 검색하는 방법을 보여주는 샘플 코드가 있습니다.

제거할 텍스트의 좌표가 있으면 포함된 페이지 내용을 편집할 때입니다. 라이브러리는 페이지 객체를 열거하고 복사하는 수단을 제공합니다. 따라서 객체를 복사하는 동안 일부 텍스트를 생략할 수 있습니다. 이렇게 하면 기본적으로 텍스트가 제거됩니다. PDF 페이지 내용 편집 예제의 코드는 프로세스의 모든 세부 정보를 보여줍니다. 발견된 좌표를 사용하려면 ShouldRemoveText 메서드를 업데이트해야 합니다.

다음 섹션을 읽고 문서에 새 텍스트를 추가하는 방법을 알아보세요.

자리 표시자 텍스트가 있는 문서를 만든 후 나중에 자리 표시자를 다른 텍스트로 바꾸는 경우 대신 텍스트 상자를 사용할 수 있습니다.

아이디어는 테두리가 없는 읽기 전용 텍스트 상자를 문서에 추가하고 그 안에 플레이스홀더 텍스트를 넣는 것입니다. 나중에 문서를 열고 이름으로 텍스트 상자를 찾은 다음 플레이스홀더를 간단한 호출 box.Text = "new text";로 바꿀 수 있습니다. 더 이상 변경하지 않으려면 바꾼 후 텍스트 상자를 평평하게 만듭니다.

새로운 텍스트 추가

문서에 텍스트를 추가하려면 PdfCanvas 객체의 DrawStringDrawText 메서드를 사용합니다. 이 메서드는 현재 캔버스 글꼴을 사용합니다. 글꼴에는 텍스트의 모든 문자에 대한 글리프가 포함되어야 합니다. PdfFont.ContainsGlyphsForText 메서드를 사용하여 글꼴이 이 요구 사항을 충족하는지 확인합니다.

var canvas = pdf.Pages[0].Canvas;
canvas.Font = pdf.AddFont("NSimSun")
    ?? throw new ArgumentException("Font not found");

canvas.DrawString(10, 50, "Olá. 你好. Hello. This is some new text");

Type1, TrueType, OpenType 글꼴로 그린 유니코드 텍스트를 추가할 수 있습니다. 라이브러리는 시스템에 설치된 글꼴, 14개의 내장 Type1 글꼴을 사용하거나 파일에서 필요한 글꼴을 로드할 수 있습니다.

텍스트 색상 변경

PDF에서 텍스트 색상을 변경하려면 텍스트 제거와 동일한 접근 방식을 사용합니다. 샘플 코드에서 최소한 ReplaceColor 메서드를 변경해야 합니다.

이미지

Docotic.Pdf는 PDF 이미지를 편집하는 데 필요한 모든 것을 제공합니다. 아래는 가장 인기 있는 작업에 대한 C# 코드 조각입니다.

샘플 코드의 이미지 그룹에는 이 섹션의 예제에 대한 완전한 테스트 프로젝트가 포함되어 있습니다.

PDF에 이미지 추가

라이브러리는 GIF/TIFF/PNG/BMP/JPEG 포맷으로 이미지를 가져올 수 있습니다. System.Drawing.Image 객체에서 이미지를 추가할 수도 있습니다.

var canvas = pdf.Pages[0].Canvas;
var image = pdf.AddImage("image.jpg")
    ?? throw new ArgumentException("Cannot add image");

canvas.DrawImage(image, 10, 50);

DrawImage 메서드의 오버로드를 사용하여 회전 각도와 출력 크기를 지정할 수 있습니다. 여러 페이지에 동일한 이미지를 그리려면 이미지를 한 번 추가하고 DrawImage 메서드에 대한 여러 호출에서 동일한 PdfImage 객체를 사용합니다.

이미지를 PDF로 결합

여러 이미지를 하나의 PDF로 결합하는 방법을 보여주는 C# 코드는 다음과 같습니다.

using var pdf = new PdfDocument();

var imagePaths = new string[] { "image.jpg", "another-image.png" };
foreach (var path in imagePaths)
{
    var image = pdf.AddImage(path)
        ?? throw new ArgumentException("Cannot add image");

    var page = pdf.AddPage();
    page.Width = image.Width;
    page.Height = image.Height;

    page.Canvas.DrawImage(image, 0, 0);
}

pdf.RemovePage(0);
pdf.Save("combined-images.pdf");

이 코드는 PDF에 여러 이미지를 추가하여 각 페이지 크기를 해당 이미지 크기에 맞게 변경합니다. 결과를 저장하기 전에 이 코드는 첫 번째로 암묵적으로 추가된 빈 페이지를 제거합니다.

PDF 이미지 추출

우리는 이미지의 품질을 손상시키지 않고 PDF 파일에서 이미지를 추출하기 위해 Docotic.Pdf를 설계했습니다. 라이브러리는 이미지 크기나 압축을 변경하지 않습니다. PDF와 동일한 품질의 이미지를 얻을 수 있습니다.

using var pdf = new PdfDocument("file-with-images.pdf");
int i = 0;
foreach (PdfImage image in pdf.GetImages())
{
    var path = image.Save($"image{i++}");
    Console.WriteLine($"Saved to {path}");
}

이미지 제거 및 교체

PdfPage.RemovePaintedImages 메서드를 사용하여 PDF 페이지에서 모든 이미지 또는 특정 이미지를 제거합니다. 위치, 크기, 변환 또는 기타 매개변수로 이미지를 필터링할 수 있습니다.

using var pdf = new PdfDocument("file-with-images.pdf");
pdf.Pages[0].RemovePaintedImages(
    image =>
    {
        return image.Size.Width > 100;
    }
);

pdf.RemoveUnusedResources();
pdf.Save("no-wide-images.pdf");

위의 C# 코드는 Docotic.Pdf의 도움으로 이미지를 제거하는 방법을 보여줍니다. 이미지를 변경하거나 제거한 후 사용하지 않는 리소스를 제거하는 것이 좋습니다.

PdfImage.ReplaceWith 메서드를 사용하여 PDF 문서 내에서 나타나는 모든 이미지를 바꿉니다.

using var pdf = new PdfDocument("file-with-images.pdf");
var firstImage = pdf.GetImages(false).FirstOrDefault()
    ?? throw new ArgumentException("No images found");

firstImage.ReplaceWith("another-image.png");

pdf.RemoveUnusedResources();
pdf.Save("replaced-image.pdf");

압축 방식 변경

Docotic.Pdf는 PDF 이미지의 압축을 변경하는 방법을 제공합니다. JPEG, CCITT 그룹 3 및 4(팩스), JPEG 2000, zip/deflate 압축 알고리즘을 사용하여 이미지를 다시 압축할 수 있습니다.

초기 압축과 새로운 압축에 따라 변경으로 인해 세부 정보나 이미지 품질이 손실될 수 있습니다. 그러나 손실 변환은 일반적으로 문서 크기를 줄이는 데 도움이 됩니다.

firstImage.RecompressWithJpeg2000(25);

이미지를 다시 압축하는 다른 방법도 있습니다. RecompressWith로 시작하는 이름을 가진 PdfImage 방법을 확인하세요. Uncompress 방법을 사용하여 이미지에서 압축을 제거할 수 있습니다.

이미지 크기 조절

PDF 문서에 있는 일부 이미지가 필요 이상으로 큰 경우, 라이브러리에서 해당 이미지의 크기를 조절하거나 축소해 드립니다.

firstImage.Scale(0.5, PdfImageCompression.Jpeg2000, 25);

위의 코드는 첫 번째 이미지를 양방향으로 두 배 더 작게 만듭니다. 라이브러리는 결과 이미지에 JPEG 2000 압축을 사용합니다.

ResizeTo 메서드 중 하나를 사용하여 결과 너비와 높이에 대한 정확한 값을 지정할 수 있습니다.

일반적으로 이미지 크기를 조정하면 압축률을 변경하는 것보다(위의 섹션 참조) PDF 파일 크기가 더 많이 줄어들지만, 손실이 발생하는 프로세스입니다.

워터마크 및 배경

PDF에 워터마크

PDF 워터마킹은 다음 단계로 구성됩니다.

  • 워터마크 콘텐츠의 컨테이너인 XObject를 만듭니다.
  • 텍스트, 이미지 및 벡터 그래픽으로 객체를 채웁니다.
  • 객체로 PDF 페이지를 스탬프합니다.

PDF에 Confidential 워터마크를 추가하는 C# 코드는 다음과 같습니다.

using var pdf = new PdfDocument("existing.pdf");

var watermark = pdf.CreateXObject();
watermark.DrawOnBackground = true;

var canvas = watermark.Canvas;
canvas.FontSize = 72;
canvas.Brush.Color = new PdfRgbColor(222, 35, 35);
canvas.Brush.Opacity = 45;
canvas.Pen.Color = canvas.Brush.Color;
canvas.Pen.Opacity = canvas.Brush.Opacity;
canvas.Pen.Width = 5;

var padding = 10;
var text = "CONFIDENTIAL";
canvas.DrawString(padding, padding, text);

var textSize = canvas.MeasureText(text);
var watermarkRect = new PdfRectangle(
    padding, padding, textSize.Width, textSize.Height);
canvas.DrawRoundedRectangle(watermarkRect, new PdfSize(padding, padding));

foreach (var page in pdf.Pages)
{
    page.Canvas.DrawXObject(
        watermark,
        (page.Width - watermarkRect.Width) / 2,
        (page.Height - watermarkRect.Height) / 2);
}

pdf.Save("watermarked.pdf");

이 코드는 워터마크 캔버스의 브러시와 펜 속성을 설정합니다. 브러시는 텍스트를 칠하는 데 사용됩니다. 텍스트 크기를 알아내기 위해 코드는 텍스트를 측정합니다. 그런 다음 텍스트 주위에 모서리가 둥근 사각형을 그립니다. 펜은 사각형을 획으로 그리는 데 사용됩니다.

워터마크 콘텐츠가 준비되면 코드는 각 페이지의 중앙에 워터마크를 그립니다.

PDF 배경은 워터마크와 매우 유사합니다. 적어도 거의 같은 방식으로 만들 수 있습니다. PDF에 배경을 추가하려면 위의 코드와 동일하게 하지만 CreateXObject 호출 뒤에 watermark.DrawOnBackground = true;를 추가합니다. 이미지와 같은 불투명한 콘텐츠는 배경을 가릴 수 있다는 점에 유의하세요.

주석

Docotic.Pdf는 PDF 주석에 대한 풍부한 API를 제공합니다. PDF 문서에서 주석을 만들고, 편집하고, 제거할 수 있습니다. 주석을 평평하게하는 것도 가능합니다.

텍스트에 주석을 달기 위해 다음이 있습니다.

  • 스티키 노트 또는 텍스트 주석. PdfPage 클래스의 AddTextAnnotation 메서드를 참조하세요.
  • 강조 표시. AddHighlightAnnotation 메서드를 참조하세요.
  • 취소선. AddStrikeoutAnnotation 메서드를 참조하세요.
  • 밑줄. AddJaggedUnderlineAnnotationAddUnderlineAnnotation 메서드를 참조하세요.

링크를 사용하여 한 페이지에서 다른 페이지 또는 외부 리소스로 이동합니다. PDF 페이지에서 자유형 그리기에 잉크 주석을 사용할 수 있습니다. 문서에서 제거하도록 지정된 부분에 대한 편집 주석이 있습니다. 오디오, 비디오 또는 3D 콘텐츠를 포함할 수도 있습니다.

텍스트 강조

PDF 문서에서 텍스트를 강조 표시하는 방법은 다음과 같습니다.

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
var canvas = page.Canvas;
canvas.FontSize = 30;

var text = "Highlighted text.";
var position = new PdfPoint(10, 50);
canvas.DrawString(position, text);
canvas.DrawString(" Not highlighted.");

var size = canvas.MeasureText(text);
var bounds = new PdfRectangle(position, size);

var color = new PdfRgbColor(145, 209, 227);
var annotationText = "Please pay attention to this part.";
page.AddHighlightAnnotation(annotationText, bounds, color);

pdf.Save("highlighted.pdf");

PDF의 특정 페이지에 링크하려면 다음과 같은 코드를 사용하세요.

using var pdf = new PdfDocument();
var secondPage = pdf.AddPage();
secondPage.Canvas.DrawString(10, 50, "Welcome to the second page.");

var firstPage = pdf.Pages[0];
var canvas = firstPage.Canvas;
var linkRect = new PdfRectangle(10, 50, 100, 60);
canvas.DrawRectangle(linkRect, PdfDrawMode.Stroke);

var options = new PdfTextDrawingOptions(linkRect)
{
    HorizontalAlignment = PdfTextAlign.Center,
    VerticalAlignment = PdfVerticalAlign.Center
};
canvas.DrawText("Go to 2nd page", options);

firstPage.AddLinkToPage(linkRect, 1);

pdf.Save("linked.pdf");

코드에서 작업 영역 주석은 내부 하이퍼링크로 작동합니다. 이러한 영역은 외부 리소스로 이동하고 비탐색 작업도 수행할 수 있습니다.

주석 제거

PDF에서 주석을 제거하려면:

  1. PdfPage.Widgets 속성 또는 PdfDocument.GetWidgets 메서드를 사용하여 위젯 컬렉션에 액세스합니다.
  2. 유형, 속성을 확인하거나 더 이상 필요하지 않은 주석을 결정합니다.
  3. PdfDocument.RemoveWidget 메서드 또는 PdfWidgetCollection 객체의 메서드를 사용하여 주석을 제거합니다.

PDF에서 첨부 파일을 제거하려면 파일 주석과 공유 첨부 파일을 모두 제거해야 합니다.

PDF 삭제

PDF 편집 라이브러리인 Docotic.Pdf는 PDF 문서에서 민감한 정보를 영구적으로 제거하거나 빠르게 검은색으로 칠하는 방법을 제공합니다.

PDF에서 정보를 검은색으로 칠하기

텍스트 삭제

Redact 도구 없이 C#과 Docotic.Pdf만 사용하여 PDF의 텍스트를 검은색으로 칠하는 방법은 다음과 같습니다.

int i = 0;
foreach (var page in pdf.Pages)
{
    foreach (var word in page.GetWords())
    {
        if (i % 3 == 0)
        {
            page.Canvas.AppendRectangle(word.Bounds);
            page.Canvas.FillPath(PdfFillMode.Winding);
        }

        i++;
    }
}

이 코드는 문서의 세 번째 단어마다 검은색 사각형을 그립니다. 사각형 뒤의 텍스트는 문서에 그대로 남아 있으며 나중에 추출할 수 있습니다. 텍스트를 영구적으로 제거하려면 텍스트 바꾸기 섹션의 접근 방식을 사용합니다.

이미지 삭제

검은색 사각형을 사용하여 이미지를 덮을 수도 있습니다. 하지만 더 쉬운 방법은 이미지를 검은색 1 x 1 픽셀 이미지로 바꾸는 것입니다. 이렇게 하면 편집된 이미지가 시각적으로 강조될 뿐만 아니라 원래 이미지 데이터도 제거됩니다.

코드 예제는 이미지 제거 및 교체에 대한 섹션을 확인하세요. 또한 교체 후 PdfDocument.ReplaceDuplicateObjects 메서드를 호출하는 것이 좋습니다.

PDF 양식

Docotic.Pdf는 버튼, 체크박스, 드롭다운 목록, 목록 상자, 라디오 버튼, 텍스트 필드 등 모든 종류의 대화형 요소를 사용하여 Acroform(PDF 양식의 또 다른 이름)을 만들 수 있습니다.

일반적으로 양식 필드를 추가하고 설정하는 데는 몇 줄의 코드만 있으면 됩니다. 예를 들어, PdfPage.AddTextBox 메서드를 호출하기만 하면 PDF에 편집 가능한 필드를 추가할 수 있습니다. 양식 및 주석 그룹의 샘플 코드는 양식을 만들고 사용하는 방법에 대한 자세한 정보를 제공합니다.

PDF 양식을 작성하는 방법

PdfDocument.GetControl 메서드를 사용하여 전체 또는 부분 이름으로 PDF 컨트롤을 찾습니다. 대안은 GetControls 메서드를 사용하여 문서 컨트롤을 열거하는 것입니다. 어느 경우든 컨트롤을 예상 필드 유형으로 캐스팅해야 합니다.

using var pdf = new PdfDocument(@"example-form.pdf");

if (pdf.GetControl("txt-name") is PdfTextBox nameTextBox)
    nameTextBox.Text = "Bit Miracle team";

if (pdf.GetControl("txt-email") is PdfTextBox emailTextBox)
    emailTextBox.Text = "support@bitmiracle.com";

if (pdf.GetControl("check-agree") is PdfCheckBox agreeCheckBox)
    agreeCheckBox.Checked = true;

pdf.Save("filled-form.pdf");

이 코드는 이 PDF 양식 예시를 사용합니다. 코드에서 두 개의 텍스트 필드에 값을 설정하고 체크박스를 체크합니다.

양식 작성을 마치면 모든 필드를 평면화할 수 있습니다.

폼에서 JavaScript 사용

이벤트를 제어하기 위해 동작을 추가할 수 있습니다. PdfControl 클래스는 미리 정의된 이벤트 세트에 대한 액세스를 제공합니다. 이벤트 이름은 On으로 시작합니다(예: OnMouseDown).

다음은 PDF 양식에 JavaScript를 사용하는 예입니다.

using var pdf = new PdfDocument(@"example-form.pdf");
foreach (var field in pdf.GetControls())
    field.OnChange = pdf.CreateJavaScriptAction($"app.alert('{field.Name} changed!',3)");

pdf.Save("javascript-events.pdf");

양식 데이터 형식

PDF를 전자적으로 작성하는 또 다른 방법이 있습니다. 도서관의 FDF to PDF 기능을 사용하여 데이터베이스나 다른 소스에서 PDF 양식을 자동으로 채웁니다.

using var pdf = new PdfDocument(@"example-form.pdf");
pdf.ImportFdf("form-data.fdf");
pdf.Save("auto-populated.pdf");

이 코드는 이 FDF 파일을 사용하여 모든 양식 필드를 한 번에 채웁니다.

PDF를 평평하게 만들기

이 섹션에서는 PDF를 평면화하는 방법에 대해 설명합니다.

PDF 플래트닝

PDF를 평면화할 때 양식 및 주석과 같은 대화형 요소를 정적 콘텐츠로 변환하여 추가 편집을 방지합니다. 평면화된 PDF는 동일하게 보이면서도 상당히 적은 바이트를 차지할 수 있습니다.

양식 및 주석을 평면화합니다

채울 수 있는 PDF를 평면화하려면 PdfDocument.FlattenControls 메서드를 사용합니다. 이 메서드는 모든 양식 필드와 다른 컨트롤을 부모 페이지에 그려 문서에서 소스 컨트롤을 제거합니다.

PDF 양식을 평면화할 때 주석도 평면화하는 것이 합리적입니다. PdfDocument.FlattenWidgets 메서드를 사용하여 컨트롤과 주석을 동시에 평면화합니다.

일부 컨트롤 및/또는 주석만 시각적 표현으로 변환하려는 경우 PdfWidget.Flatten 메서드를 사용합니다. 먼저 필요한 컨트롤 또는 주석을 찾아야 합니다.

텍스트 평평하게 만들기

Docotic.Pdf의 도움으로 PDF 텍스트를 윤곽선으로 변환할 수 있습니다. 일반적으로 이렇게 하는 이유는 글꼴 독립성을 확보하기 위해서입니다. 글꼴이 설치되어 있는지 여부에 관계없이, 평면화된 텍스트는 모든 기기에서 동일하게 보입니다.

하지만 텍스트를 윤곽선으로 변환하면 더 이상 텍스트로 편집할 수 없습니다. 또한, 평면화 프로세스 중에 라이브러리는 텍스트를 벡터 그래픽으로 변환합니다. 이로 인해 파일 크기가 커질 수 있습니다.

PDF 텍스트를 평면화하려면 텍스트를 벡터 경로로 추출하여 새 페이지나 같은 페이지에 복사해야 합니다. 이를 위한 샘플 코드가 있습니다.

저장 옵션

위의 코드 조각에서 추가 인수 없이 PdfDocument.Save 메서드를 사용했습니다. 라이브러리는 이러한 경우 기본 저장 옵션을 사용합니다. 우리는 일반적인 경우에 완벽하게 작동하도록 기본 옵션을 직접 선택했습니다.

그래도 기본 옵션을 재정의해야 하는 경우가 있습니다. 이를 위해 PdfSaveOptions 객체를 만들고, 옵션을 설정하고, 저장 메서드 중 하나에 제공합니다. 더 나아가서 그 경우에 대해 설명하겠습니다.

비밀번호 또는 인증서로 PDF를 보호하려면 암호화 핸들러를 생성하고 EncryptionHandler 속성으로 설정하세요.

같은 PDF에 여러 번 서명하고 싶을 때는 WriteIncrementally 속성을 true로 설정하여 증분 업데이트 모드를 켭니다. 이전에 서명한 파일을 새 주석이나 양식 데이터로 저장할 때도 마찬가지입니다.

Linearize 속성을 true로 설정하여 선형화된(또는 Fast Web View 최적화된) PDF 파일을 생성합니다. 이 최적화를 인식하는 뷰어는 이러한 파일을 더 빨리 표시할 수 있습니다.

일부 메타데이터 필드의 저장 시간 변경을 방지하려면 UpdateProducerUpdateModifiedDate 속성을 false로 설정합니다.