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

C# 및 VB.NET에서 PDF 문서 압축

많은 경우 PDF 문서를 압축하고 최적화하는 것이 일반적인 요구 사항입니다. PDF 문서가 작을수록 네트워크를 통해 전송하기 쉽고 저장 비용도 더 저렴합니다. PDF 파일 크기를 줄이는 것은 보관 목적에 특히 중요합니다.

C# 및 VB.NET에서 PDF 문서 최적화

PDF 문서를 최적화하는 .NET 라이브러리

.NET Framework 및 .NET Core 애플리케이션에서 PDF 문서를 압축하려면 Docotic.Pdf 라이브러리를 사용하세요. 라이브러리의 바이너리를 다운로드하거나 NuGet 패키지를 사용할 수 있습니다. 평가 모드 제한 없이 라이브러리를 사용해 보려면 여기 양식을 사용하여 시간 제한이 있는 무료 라이센스 키를 얻을 수 있습니다.

Docotic.Pdf 라이브러리 9.3.17036-dev 회귀 테스트 14,665건의 테스트 통과 총 NuGet 다운로드 4,191,515

Docotic.Pdf는 다양한 최적화 수단을 제공합니다:

  • PDF 개체 최적화
  • 중복된 PDF 개체 제거(글꼴, 이미지 등)
  • 이미지 압축
  • 하위 글꼴
  • 메타데이터 제거
  • 구조 정보 제거
  • 사용하지 않는 리소스 제거
  • 개인 애플리케이션 데이터 제거
  • 양식 필드 및 주석을 병합합니다.
  • 포함되지 않은 글꼴

위의 모든 기능을 사용하여 PDF 문서에 대한 최상의 압축 비율을 얻을 수 있습니다. 이러한 모든 기술이 실제로 실행되는 모습을 보려면 .NET에서 PDF 문서 압축 샘플을 살펴보세요.

이러한 압축 방법을 더 자세히 검토해 보겠습니다.

PDF 개체 최적화

내부적으로 PDF 파일은 사전, 스트림, 배열 등의 하위 수준 PDF 개체 모음입니다. PDF 파일을 저장할 때 Docotic.Pdf는 기본적으로 다음과 같은 무손실 최적화를 적용합니다:

  • Flate 인코딩으로 PDF 스트림을 압축합니다
  • 사용하지 않는 PDF 개체를 삭제합니다
  • 간접 PDF 개체를 인라인합니다
  • 서식을 지정하지 않고 PDF 개체를 작성합니다
  • PDF 개체를 압축된 개체 스트림으로 압축합니다.

이 샘플은 C#에서 PDF 개체를 최적화하는 방법을 보여줍니다:

using BitMiracle.Docotic.Pdf;

using (var pdf = new PdfDocument("input.pdf"))
{
    var saveOptions = new PdfSaveOptions();

    // 이러한 옵션은 기본적으로 활성화되어 있으며 암시적으로 적용됩니다:
    //saveOptions.Compression = PdfCompression.Flate;
    //saveOptions.RemoveUnusedObjects = true;
    //saveOptions.OptimizeIndirectObjects = true;
    //saveOptions.UseObjectStreams = true;
    //saveOptions.WriteWithoutFormatting = true;

    pdf.Save("compressed.pdf", saveOptions);
}

이러한 모든 최적화는 PDF 문서의 표시되는 내용(텍스트, 이미지, 책갈피 등)에 영향을 주지 않습니다. 이는 출력 PDF 파일에서 PDF 개체가 작성되고 압축되는 방식에만 영향을 미칩니다.

사용하지 않는 PDF 개체를 삭제하는 것은 아래에 설명된 다른 기술에 중요합니다. 사용하지 않는 개체를 유지해야 할 강력한 이유가 없는 한 PdfSaveOptions.RemoveUnusedObjects 속성을 false로 설정하지 마세요.

PDF 문서에서 중복 개체 제거

PDF 문서를 병합하면 생성된 PDF에 중복된 글꼴과 이미지가 포함되는 경우가 많습니다. 중복 개체를 바꾸면 생성된 PDF 파일의 크기를 줄이는 데 도움이 됩니다. 이 작업에 대한 C# 샘플은 다음과 같습니다:

using (var pdf = new PdfDocument("merged.pdf"))
{
    pdf.ReplaceDuplicateObjects();

    pdf.Save("compressed.pdf");
}

이미지를 압축하거나 글꼴 포함을 취소하기 전에 중복된 개체를 제거하는 것이 좋습니다. 그렇지 않으면 동일한 이미지나 글꼴의 복사본을 최적화하기 위해 많은 추가 작업이 수행됩니다.

PdfDocument.ReplaceDuplicateObjects 메서드는 인라인 이미지를 바꾸지 않습니다. 문서에 인라인 이미지가 포함된 경우 먼저 PdfCanvas.MoveInlineImagesToResources 메서드를 사용하세요. 이 메서드는 인라인 이미지를 일반 이미지로 변환한 다음 'ReplaceDuplicateObjects' 메서드로 변환된 이미지도 중복 제거할 수 있습니다.

PDF로 이미지 압축

일반적으로 PDF 이미지 최적화는 래스터 이미지가 포함된 문서에 가장 효과적인 압축 방법입니다.

Docotic.Pdf 라이브러리는 JPEG, CCITT 그룹 3 및 4(팩스), JPEG 2000 및 zip/deflate 압축 알고리즘을 사용하여 PDF 이미지를 다시 압축하는 내장된 방법을 제공합니다. PDF 파일 크기를 더욱 줄이기 위해 이미지 크기를 조정하거나 축소할 수도 있습니다. 또는 타사 도구를 사용하여 이미지를 직접 최적화한 다음 이미지 교체할 수도 있습니다.

예제는 GitHub의 C# 및 VB.NET에서 PDF 문서의 이미지 최적화 샘플을 참조하세요.

하위 집합 글꼴

PDF 문서에는 일반적으로 텍스트를 그리는 데 사용되는 글꼴이 포함되어 있습니다. 포함된 글꼴에는 지원되는 모든 문자 모양에 대한 정보가 포함되는 경우가 많습니다. PDF 문서에서 사용되지 않는 글리프를 제거하면 출력 파일 크기를 크게 줄일 수 있습니다.

이 샘플은 C#에서 PDF 글꼴을 최적화하는 방법을 보여줍니다:

using (var pdf = new PdfDocument("text.pdf"))
{
    pdf.RemoveUnusedFontGlyphs();

    pdf.Save("compressed.pdf");
}

하위 설정은 텍스트 상자나 콤보 상자와 같은 가변 텍스트 컨트롤에 사용되는 글꼴에 영향을 주지 않습니다.

메타데이터 제거

PDF 문서에는 작성자, 키워드, 생성 시간 등에 대한 정보가 포함된 압축되지 않은 XMP 메타데이터가 포함될 수 있습니다. 메타데이터는 PDF 문서의 표시되는 내용에 영향을 주지 않습니다.

이 샘플은 C#의 PDF 파일에서 메타데이터를 제거하는 방법을 보여줍니다:

using (var pdf = new PdfDocument("metadata.pdf"))
{
    XmpMetadata xmp = pdf.Metadata;
    xmp.Unembed();
    pdf.Info.Clear(false);

    pdf.Save("compressed.pdf");
}

구조 정보 제거

PDF 문서에는 논리적 구조에 대한 정보가 포함될 수 있습니다. 해당 정보는 다음 용도로 사용됩니다.

  • 태그가 있는 PDF 문서 생성
  • 보조 장치에서 PDF 문서에 액세스할 수 있도록 만듭니다.

이러한 정보를 제거하면 PDF 파일 크기를 줄이는 데 도움이 됩니다. 그러나 PDF에는 더 이상 보조 장치에 대한 태그가 지정되거나 액세스할 수 없습니다. 이 샘플은 C#에서 PDF의 구조 정보를 삭제하는 방법을 보여줍니다:

using (var pdf = new PdfDocument("tagged.pdf"))
{
    pdf.RemoveStructureInformation();

    pdf.Save("compressed.pdf");
}

PDF에서 사용되지 않는 리소스 제거

PDF 페이지와 XObject는 사용하는 것보다 더 많은 글꼴, 이미지 또는 패턴을 참조할 수 있습니다. PdfDocument.RemoveUnusedResources 메서드를 사용하여 PDF에서 사용되지 않는 리소스를 제거할 수 있습니다. C# 샘플은 다음과 같습니다.

using (var pdf = new PdfDocument("input.pdf"))
{
    pdf.RemoveUnusedResources();

    pdf.Save("compressed.pdf");
}

PDF에서 개인 애플리케이션 데이터 제거

Adobe 소프트웨어로 생성된 PDF 문서에는 개인 응용 프로그램 데이터가 포함될 수 있습니다. 이러한 애플리케이션 데이터는 페이지 단위 사전에 저장됩니다.

이 샘플은 페이지 조각 사전을 제거하여 C#에서 PDF를 정리하고 압축하는 방법을 보여줍니다:

using (var pdf = new PdfDocument("input.pdf"))
{
    pdf.RemovePieceInfo();

    pdf.Save("compressed.pdf");
}

PDF 양식 필드 및 주석을 병합합니다

양식 필드를 병합하여 완성된 양식이 포함된 PDF 문서의 크기를 줄일 수 있습니다. 병합은 양식 필드를 시각적 표현으로 대체합니다. 채워진 값은 유지됩니다. 이 C# 샘플은 모든 PDF 양식 필드를 병합하는 방법을 보여줍니다:

using (var pdf = new PdfDocument("form.pdf"))
{
    pdf.FlattenControls();

    pdf.Save("compressed.pdf");
}

또는 PdfDocument.FlattenWidgets 메서드를 사용하여 모든 주석과 컨트롤을 평면화할 수 있습니다.

또한 PdfWidget.Flatten 메서드를 사용하면 개별 주석이나 컨트롤을 평면화할 수 있습니다.

포함되지 않은 글꼴

PDF 글꼴을 포함하면 맞춤 글꼴이나 희귀 글꼴에 적합합니다. 동시에 Arial 또는 Verdana와 같이 널리 사용되는 글꼴은 정당한 이유 없이 PDF 파일 크기를 늘릴 수 있습니다. 대상 플랫폼에서 사용 가능한 인기 글꼴을 포함 취소할 수 있습니다. 샘플 C# 코드:

using (var pdf = new PdfDocument("input.pdf"))
{
    unembedFonts(pdf);

    pdf.Save("compressed.pdf");
}

/// <summary>
/// 이 메서드는 다음과 같은 글꼴을 포함 취소합니다.
/// * OS에 설치됨
/// * 또는 "항상 포함 해제" 목록에 해당 이름이 포함되어 있습니다.
/// * 해당 이름은 "항상 유지" 목록에 포함되지 않습니다.
/// </summary>
private static void unembedFonts(PdfDocument pdf)
{
    string[] alwaysUnembedList = new string[] { "MyriadPro-Regular" };
    string[] alwaysKeepList = new string[] { "ImportantFontName", "AnotherImportantFontName" };

    foreach (PdfFont font in pdf.GetFonts())
    {
        if (!font.Embedded ||
            font.EncodingName == "Built-In" ||
            Array.Exists(alwaysKeepList, name => font.Name == name))
        {
            continue;
        }

        if (font.Format == PdfFontFormat.TrueType || font.Format == PdfFontFormat.CidType2)
        {
            SystemFontLoader loader = SystemFontLoader.Instance;
            byte[] fontBytes = loader.Load(font.Name, font.Bold, font.Italic);
            if (fontBytes != null)
            {
                font.Unembed();
                continue;
            }
        }
        
        if (Array.Exists(alwaysUnembedList, name => font.Name == name))
            font.Unembed();
    }
}

PDF/A 문서에는 이 기술을 사용하지 마십시오. PDF/A 문서에는 모든 글꼴이 포함되어야 합니다.

대상 운영 체제(Windows, Linux, macOS, iOS, Android) 및 PDF 뷰어(Adobe, Foxit 등)에서 포함되지 않은 글꼴이 있는 PDF 문서를 항상 테스트하십시오.

PDF 크기를 줄이는 다른 방법

위에서 언급한 최적화 방법에는 여러 가지가 있습니다. 그러나 중요하지 않은 내용을 제거하여 PDF 문서를 더욱 압축할 수 있습니다. Docotic.Pdf를 사용하면 PDF 문서에서 다음 개체를 삭제할 수 있습니다.

  • 주석
  • 첨부파일
  • 북마크
  • 양식 필드
  • 페이지
  • 스크립트
  • 투명성

PDF 페이지에서 텍스트, 이미지, 벡터 그래픽을 제거할 수도 있습니다. 텍스트 병합도 가능합니다.

결론

Docotic.Pdf 라이브러리를 사용하여 C# 및 VB.NET에서 PDF를 압축할 수 있습니다. Docotic.Pdf는 많은 효과적인 최적화 수단을 제공합니다.

GitHub에서 전체 C# 및 VB.NET의 PDF 문서 압축 샘플을 다운로드하여 사용해 보세요.

연락처로 문의하시면 PDF 문서에 대한 최상의 압축률을 달성하는 방법에 대해 조언해 드리겠습니다.