PDF 문서 조작하기 in C#
PDF 문서 조작 in C#
PDF 문서를 PDF A 표준 (A 1A 및 A 1B)에 맞게 검증
PDF/A-1a 또는 PDF/A-1b 호환성을 검증하려면 Document 클래스의 Validate 메서드를 사용하세요. 이 메서드는 결과를 저장할 파일의 이름과 필요한 검증 유형 PdfFormat 열거형을 지정할 수 있습니다: PDF_A_1A 또는 PDF_A_1B.
다음 코드 스니펫은 Aspose.PDF.Drawing 라이브러리와 함께 작동합니다.
다음 코드 스니펫은 PDF 문서를 PDF/A-1A로 검증하는 방법을 보여줍니다. 다음 코드 조각은 PDF 문서를 PDF/A-1A로 검증하는 방법을 보여줍니다.
// 완전한 예제와 데이터 파일은 https://github.com/aspose-pdf/Aspose.PDF-for-.NET 에서 확인하십시오.
// 문서 디렉토리 경로.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// 문서 열기
Document pdfDocument = new Document(dataDir + "ValidatePDFAStandard.pdf");
// PDF/A-1a를 위한 PDF 검증
pdfDocument.Validate(dataDir + "validation-result-A1A.xml", PdfFormat.PDF_A_1A);
다음 코드 조각은 PDF 문서를 PDF/A-1B로 검증하는 방법을 보여줍니다.
// 완전한 예제와 데이터 파일은 https://github.com/aspose-pdf/Aspose.PDF-for-.NET 에서 확인하십시오.
// 문서 디렉토리 경로.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// 문서 열기
Document pdfDocument = new Document(dataDir + "ValidatePDFAStandard.pdf");
// PDF/A-1b를 위한 PDF 검증
pdfDocument.Validate(dataDir + "validation-result-A1A.xml", PdfFormat.PDF_A_1B);
목차 작업
기존 PDF에 목차 추가
Aspose.PDF API를 사용하면 PDF를 생성할 때 또는 기존 파일에 목차를 추가할 수 있습니다. Aspose.Pdf.Generator 네임스페이스의 ListSection 클래스를 사용하여 처음부터 PDF를 생성할 때 목차를 만들 수 있습니다. TOC의 요소인 제목을 추가하려면 Aspose.Pdf.Generator.Heading 클래스를 사용하세요.
기존 PDF 파일에 TOC를 추가하려면 Aspose.Pdf 네임스페이스의 Heading 클래스를 사용하세요. 기존 PDF 파일에 목차를 추가하려면 Aspose.Pdf 네임스페이스의 Heading 클래스를 사용하세요.
// 전체 예제와 데이터 파일은 https://github.com/aspose-pdf/Aspose.PDF-for-.NET 에서 확인하세요.
// 문서 디렉토리 경로입니다.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// 기존 PDF 파일을 로드합니다.
Document doc = new Document(dataDir + "AddTOC.pdf");
// PDF 파일의 첫 페이지에 접근합니다.
Page tocPage = doc.Pages.Insert(1);
// TOC 정보를 나타내는 객체를 생성합니다.
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("목차");
title.TextState.FontSize = 20;
title.TextState.FontStyle = FontStyles.Bold;
// TOC의 제목을 설정합니다.
tocInfo.Title = title;
tocPage.TocInfo = tocInfo;
// TOC 요소로 사용될 문자열 객체를 생성합니다.
string[] titles = new string[4];
titles[0] = "첫 페이지";
titles[1] = "두 번째 페이지";
titles[2] = "세 번째 페이지";
titles[3] = "네 번째 페이지";
for (int i = 0; i < 2; i++)
{
// Heading 객체를 생성합니다.
Aspose.Pdf.Heading heading2 = new Aspose.Pdf.Heading(1);
TextSegment segment2 = new TextSegment();
heading2.TocPage = tocPage;
heading2.Segments.Add(segment2);
// heading 객체의 목적지 페이지를 지정합니다.
heading2.DestinationPage = doc.Pages[i + 2];
// 목적지 페이지
heading2.Top = doc.Pages[i + 2].Rect.Height;
// 목적지 좌표
segment2.Text = titles[i];
// TOC를 포함하는 페이지에 heading을 추가합니다.
tocPage.Paragraphs.Add(heading2);
}
dataDir = dataDir + "TOC_out.pdf";
// 문서를 업데이트하여 저장합니다.
doc.Save(dataDir);
다른 TOC 레벨에 대해 다른 TabLeaderType 설정하기
Aspose.PDF는 다른 TOC 레벨에 대해 다양한 TabLeaderType을 설정할 수 있도록 합니다. 다음과 같이 FormatArray의 LineDash 속성에 TabLeaderType 열거형의 적절한 값을 설정해야 합니다.
string outFile = "TOC.pdf";
Aspose.Pdf.Document doc = new Aspose.Pdf.Document();
Page tocPage = doc.Pages.Add();
TocInfo tocInfo = new TocInfo();
//LeaderType 설정
tocInfo.LineDash = TabLeaderType.Solid;
TextFragment title = new TextFragment("목차");
title.TextState.FontSize = 30;
tocInfo.Title = title;
//PDF 문서의 섹션 컬렉션에 리스트 섹션을 추가
tocPage.TocInfo = tocInfo;
//네 레벨 리스트의 형식을 설정하여 왼쪽 여백 설정
//및
//각 레벨의 텍스트 형식 설정
tocInfo.FormatArrayLength = 4;
tocInfo.FormatArray[0].Margin.Left = 0;
tocInfo.FormatArray[0].Margin.Right = 30;
tocInfo.FormatArray[0].LineDash = TabLeaderType.Dot;
tocInfo.FormatArray[0].TextState.FontStyle = FontStyles.Bold | FontStyles.Italic;
tocInfo.FormatArray[1].Margin.Left = 10;
tocInfo.FormatArray[1].Margin.Right = 30;
tocInfo.FormatArray[1].LineDash = TabLeaderType.None;
tocInfo.FormatArray[1].TextState.FontSize = 10;
tocInfo.FormatArray[2].Margin.Left = 20;
tocInfo.FormatArray[2].Margin.Right = 30;
tocInfo.FormatArray[2].TextState.FontStyle = FontStyles.Bold;
tocInfo.FormatArray[3].LineDash = TabLeaderType.Solid;
tocInfo.FormatArray[3].Margin.Left = 30;
tocInfo.FormatArray[3].Margin.Right = 30;
tocInfo.FormatArray[3].TextState.FontStyle = FontStyles.Bold;
//PDF 문서에 섹션 생성
Page page = doc.Pages.Add();
//섹션에 네 개의 제목 추가
for (int Level = 1; Level <= 4; Level++)
{
Aspose.Pdf.Heading heading2 = new Aspose.Pdf.Heading(Level);
TextSegment segment2 = new TextSegment();
heading2.Segments.Add(segment2);
heading2.IsAutoSequence = true;
heading2.TocPage = tocPage;
segment2.Text = "샘플 제목" + Level;
heading2.TextState.Font = FontRepository.FindFont("Arial Unicode MS");
//목차에 제목 추가.
heading2.IsInList = true;
page.Paragraphs.Add(heading2);
}
// PDF 저장
doc.Save(outFile);
목차에서 페이지 번호 숨기기
목차에서 제목과 함께 페이지 번호를 표시하고 싶지 않은 경우, TOCInfo 클래스의 IsShowPageNumbers 속성을 false로 사용할 수 있습니다. 목차에서 페이지 번호를 숨기기 위한 다음 코드 스니펫을 확인하세요:
// 완전한 예제와 데이터 파일은 https://github.com/aspose-pdf/Aspose.PDF-for-.NET 에서 확인하세요.
// 문서 디렉토리의 경로입니다.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
string outFile = dataDir + "HiddenPageNumbers_out.pdf";
Document doc = new Document();
Page tocPage = doc.Pages.Add();
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("Table Of Contents");
title.TextState.FontSize = 20;
title.TextState.FontStyle = FontStyles.Bold;
tocInfo.Title = title;
//Pdf 문서의 섹션 컬렉션에 목록 섹션을 추가합니다
tocPage.TocInfo = tocInfo;
//각 레벨의 왼쪽 여백과 텍스트 형식 설정을 설정하여 네 레벨 목록의 형식을 정의합니다
tocInfo.IsShowPageNumbers = false;
tocInfo.FormatArrayLength = 4;
tocInfo.FormatArray[0].Margin.Right = 0;
tocInfo.FormatArray[0].TextState.FontStyle = FontStyles.Bold | FontStyles.Italic;
tocInfo.FormatArray[1].Margin.Left = 30;
tocInfo.FormatArray[1].TextState.Underline = true;
tocInfo.FormatArray[1].TextState.FontSize = 10;
tocInfo.FormatArray[2].TextState.FontStyle = FontStyles.Bold;
tocInfo.FormatArray[3].TextState.FontStyle = FontStyles.Bold;
Page page = doc.Pages.Add();
//섹션에 네 개의 제목을 추가합니다
for (int Level = 1; Level != 5; Level++)
{ Heading heading2 = new Heading(Level); TextSegment segment2 = new TextSegment(); heading2.TocPage = tocPage; heading2.Segments.Add(segment2); heading2.IsAutoSequence = true; segment2.Text = "this is heading of level " + Level; heading2.IsInList = true; page.Paragraphs.Add(heading2); }
doc.Save(outFile);
목차 페이지 번호 사용자 정의하기
PDF 문서에 목차(TOC)를 추가할 때 페이지 번호를 사용자 정의하는 것이 일반적입니다. 예를 들어, 페이지 번호 앞에 P1, P2, P3 등의 접두사를 추가할 수 있습니다. 이러한 경우 Aspose.PDF for .NET은 다음 코드 샘플에서 보여주는 것처럼 페이지 번호를 사용자 정의할 수 있는 TocInfo 클래스의 PageNumbersPrefix 속성을 제공합니다.
// 완전한 예제와 데이터 파일은 https://github.com/aspose-pdf/Aspose.PDF-for-.NET 에서 확인해주세요.
string inFile = RunExamples.GetDataDir_AsposePdf_WorkingDocuments() + "42824.pdf";
string outFile = RunExamples.GetDataDir_AsposePdf_WorkingDocuments() + "42824_out.pdf";
// 기존 PDF 파일을 불러옵니다
Document doc = new Document(inFile);
// PDF 파일의 첫 페이지에 접근합니다
Aspose.Pdf.Page tocPage = doc.Pages.Insert(1);
// TOC 정보를 나타내는 객체를 생성합니다
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("목차");
title.TextState.FontSize = 20;
title.TextState.FontStyle = FontStyles.Bold;
// TOC의 제목을 설정합니다
tocInfo.Title = title;
tocInfo.PageNumbersPrefix = "P";
tocPage.TocInfo = tocInfo;
for (int i = 1; i<doc.Pages.Count; i++)
{
// Heading 객체를 생성합니다
Aspose.Pdf.Heading heading2 = new Aspose.Pdf.Heading(1);
TextSegment segment2 = new TextSegment();
heading2.TocPage = tocPage;
heading2.Segments.Add(segment2);
// heading 객체의 목적지 페이지를 지정합니다
heading2.DestinationPage = doc.Pages[i + 1];
// 목적지 페이지
heading2.Top = doc.Pages[i + 1].Rect.Height;
// 목적지 좌표
segment2.Text = "페이지 " + i.ToString();
// TOC가 포함된 페이지에 heading을 추가합니다
tocPage.Paragraphs.Add(heading2);
}
// 문서를 저장합니다
doc.Save(outFile);
PDF 만료 날짜 설정 방법
PDF 파일에 접근 권한을 설정하여 특정 사용자 그룹이 PDF 문서의 특정 기능/객체에 접근할 수 있도록 합니다. PDF 파일 접근을 제한하기 위해 일반적으로 암호화를 적용하며, 사용자가 문서를 접근/열람할 때 PDF 파일의 만료에 대한 유효한 알림을 받도록 PDF 파일 만료 설정이 필요할 수 있습니다.
위에서 언급한 요구 사항을 달성하기 위해 JavascriptAction 객체를 사용할 수 있습니다. 다음 코드 스니펫을 확인해 주세요.
// 완전한 예제와 데이터 파일은 https://github.com/aspose-pdf/Aspose.PDF-for-.NET 에서 확인하세요.
// 문서 디렉토리 경로.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Document 객체를 인스턴스화
Aspose.Pdf.Document doc = new Aspose.Pdf.Document();
// PDF 파일의 페이지 컬렉션에 페이지 추가
doc.Pages.Add();
// 페이지 객체의 단락 컬렉션에 텍스트 조각 추가
doc.Pages[1].Paragraphs.Add(new TextFragment("Hello World..."));
// PDF 만료 날짜를 설정하는 JavaScript 객체 생성
JavascriptAction javaScript = new JavascriptAction(
"var year=2017;"
+ "var month=5;"
+ "today = new Date(); today = new Date(today.getFullYear(), today.getMonth());"
+ "expiry = new Date(year, month);"
+ "if (today.getTime() > expiry.getTime())"
+ "app.alert('The file is expired. You need a new one.');");
// PDF 열기 액션으로 JavaScript 설정
doc.OpenAction = javaScript;
dataDir = dataDir + "SetExpiryDate_out.pdf";
// PDF 문서 저장
doc.Save(dataDir);
PDF 파일 생성 진행 상황 결정
고객이 PDF 파일 생성의 진행 상황을 확인할 수 있는 기능을 추가해 달라고 요청했습니다. 이에 대한 응답은 다음과 같습니다.
DocSaveOptions 클래스의 CustomerProgressHandler 필드를 사용하면 PDF 생성 진행 상황을 확인할 수 있습니다. 핸들러에는 다음과 같은 유형이 있습니다:
- DocSaveOptions.ConversionProgessEventHandler
- DocSaveOptions.ProgressEventHandlerInfo
- DocSaveOptions.ProgressEventType
아래 코드 스니펫은 CustomerProgressHandler 사용 방법을 보여줍니다.
// 전체 예제와 데이터 파일은 https://github.com/aspose-pdf/Aspose.PDF-for-.NET 에서 확인해 주세요.
// 문서 디렉토리 경로입니다.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// 문서 열기
Document pdfDocument = new Document(dataDir + "AddTOC.pdf");
DocSaveOptions saveOptions = new DocSaveOptions();
saveOptions.CustomProgressHandler = new UnifiedSaveOptions.ConversionProgressEventHandler(ShowProgressOnConsole);
dataDir = dataDir + "DetermineProgress_out.pdf";
pdfDocument.Save(dataDir, saveOptions);
Console.ReadLine();
// 완벽한 예제와 데이터 파일은 https://github.com/aspose-pdf/Aspose.PDF-for-.NET 에서 확인하세요.
public static void ShowProgressOnConsole(DocSaveOptions.ProgressEventHandlerInfo eventInfo)
{
switch (eventInfo.EventType)
{
case DocSaveOptions.ProgressEventType.TotalProgress:
Console.WriteLine(String.Format("{0} - 변환 진행 상황 : {1}% .", DateTime.Now.ToLongTimeString(), eventInfo.Value.ToString()));
break;
case DocSaveOptions.ProgressEventType.SourcePageAnalized:
Console.WriteLine(String.Format("{0} - 원본 페이지 {1} / {2} 분석됨.", DateTime.Now.ToLongTimeString(), eventInfo.Value.ToString(), eventInfo.MaxValue.ToString()));
break;
case DocSaveOptions.ProgressEventType.ResultPageCreated:
Console.WriteLine(String.Format("{0} - 결과 페이지 {1} / {2} 레이아웃 생성됨.", DateTime.Now.ToLongTimeString(), eventInfo.Value.ToString(), eventInfo.MaxValue.ToString()));
break;
case DocSaveOptions.ProgressEventType.ResultPageSaved:
Console.WriteLine(String.Format("{0} - 결과 페이지 {1} / {2} 내보내기 완료.", DateTime.Now.ToLongTimeString(), eventInfo.Value.ToString(), eventInfo.MaxValue.ToString()));
break;
default:
break;
}
}
C#에서 입력 가능한 PDF 평탄화
PDF 문서는 종종 라디오 버튼, 체크박스, 텍스트 박스, 목록 등과 같은 대화형 입력 가능 위젯을 포함합니다. 다양한 애플리케이션 목적에 맞게 편집할 수 없도록 하기 위해 PDF 파일을 평탄화할 필요가 있습니다. Aspose.PDF는 몇 줄의 코드만으로 C#에서 PDF를 평탄화할 수 있는 기능을 제공합니다:
// 원본 PDF 폼 로드
Document doc = new Document(dataDir + "input.pdf");
// 입력 가능한 PDF 평탄화
if (doc.Form.Fields.Count() > 0)
{
foreach (var item in doc.Form.Fields)
{
item.Flatten();
}
}
dataDir = dataDir + "FlattenForms_out.pdf";
// 업데이트된 문서 저장
doc.Save(dataDir);