PDF 문서 조작
PDF A 표준을 위한 PDF 문서 유효성 검사 (A 1A 및 A 1B)
PDF/A-1a 또는 PDF/A-1b 호환성을 위한 PDF 문서의 유효성을 검사하려면, Document 클래스의 validate(..) 메서드를 사용하십시오. 이 메서드는 결과가 저장될 파일의 이름과 필요한 유효성 검사 유형인 PdfFormat 열거형: PDF_A_1A 또는 PDF_A_1B를 지정할 수 있습니다.
출력 XML 형식은 사용자 지정 Aspose 형식입니다. XML에는 Problem이라는 이름을 가진 태그들이 모여 있으며, 각 태그에는 특정 문제에 대한 세부 정보가 포함되어 있습니다. Problem 태그의 ObjectID 속성은 이 문제가 관련된 특정 객체의 ID를 나타냅니다. Clause 속성은 PDF 사양의 해당 규칙을 나타냅니다.
public static void ValidatePDFDocumentForPDF_A_Standard() {
// 문서 열기
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// PDF/A-1a 검증
pdfDocument.validate(_dataDir + "validation-result-A1A.xml", PdfFormat.PDF_A_1A);
// 업데이트된 PDF 파일 저장
// document.save(_dataDir + "UpdatedFile_output.pdf");
}
TOC 작업하기
기존 PDF에 TOC 추가
aspose.pdf 패키지의 ListSection 클래스는 PDF 문서를 처음부터 생성할 때 목차를 생성할 수 있게 해줍니다. 목차의 요소인 제목을 추가하려면 aspose.pdf.Heading 클래스를 사용하십시오.
기존 PDF 파일에 TOC를 추가하려면 com.aspose.pdf 패키지의 Heading 클래스를 사용하십시오. com.aspose.pdf 패키지는 새로운 PDF 파일을 생성하고 기존 PDF 파일을 조작할 수 있습니다. 기존 PDF에 목차를 추가하려면 com.aspose.pdf 패키지를 사용합니다.
다음 코드 스니펫은 기존 PDF 파일 내에 목차를 생성하는 방법을 보여줍니다.
public static void AddTOCtoExistingPDF() {
// 기존 PDF 파일 로드
Document document = new Document(_dataDir + "sample.pdf");
// PDF 파일의 첫 번째 페이지에 접근
Page tocPage = document.getPages().insert(1);
// 목차 정보를 나타내는 객체 생성
com.aspose.pdf.TocInfo tocInfo = new com.aspose.pdf.TocInfo();
com.aspose.pdf.TextFragment title = new com.aspose.pdf.TextFragment("Table Of Contents");
title.getTextState().setFontSize(20);
title.getTextState().setFontStyle(com.aspose.pdf.FontStyles.Bold);
// 목차 제목 설정
tocInfo.setTitle(title);
tocPage.setTocInfo(tocInfo);
// 목차 요소로 사용될 문자열 객체 생성
String[] titles = new String[4];
titles[0] = "First page";
titles[1] = "Second page";
titles[2] = "Third page";
titles[3] = "Fourth page";
for (int i = 0; i < 4; i++) {
// Heading 객체 생성
com.aspose.pdf.Heading heading2 = new com.aspose.pdf.Heading(1);
com.aspose.pdf.TextSegment segment2 = new com.aspose.pdf.TextSegment();
heading2.setTocPage(tocPage);
heading2.getSegments().add(segment2);
// Heading 객체의 목적지 페이지 지정
heading2.setDestinationPage(document.getPages().get_Item(i + 2));
// 목적지 페이지
heading2.setTop(document.getPages().get_Item(i + 2).getRect().getHeight());
// 목적지 좌표
segment2.setText(titles[i]);
// 목차가 포함된 페이지에 heading 추가
tocPage.getParagraphs().add(heading2);
}
// 업데이트된 문서 저장
document.save("TOC_Output_Java.pdf");
}
서로 다른 TOC 레벨에 대해 다른 TabLeaderType 설정
Aspose.PDF는 또한 서로 다른 TOC 레벨에 대해 다른 TabLeaderType을 설정할 수 있습니다. 다음과 같이 FormatArray의 LineDash 속성을 TabLeaderType 열거형의 적절한 값으로 설정해야 합니다.
public static void SetDifferentTabLeaderTypeForTOCLevels() {
String outFile = "TOC.pdf";
Document document = new Document();
Page tocPage = document.getPages().add();
TocInfo tocInfo = new TocInfo();
// 리더 유형 설정
tocInfo.setLineDash(TabLeaderType.Solid);
TextFragment title = new TextFragment("목차");
title.getTextState().setFontSize(30);
tocInfo.setTitle(title);
// Pdf 문서의 섹션 컬렉션에 목록 섹션 추가
tocPage.setTocInfo(tocInfo);
// 각 레벨의 왼쪽 여백과 텍스트 포맷 설정을 통해 네 레벨 목록의 형식 정의
tocInfo.setFormatArrayLength(4);
tocInfo.getFormatArray()[0].getMargin().setLeft(0);
tocInfo.getFormatArray()[0].getMargin().setRight(30);
tocInfo.getFormatArray()[0].setLineDash(TabLeaderType.Dot);
tocInfo.getFormatArray()[0].getTextState().setFontStyle(FontStyles.Bold | FontStyles.Italic);
tocInfo.getFormatArray()[1].getMargin().setLeft(10);
tocInfo.getFormatArray()[1].getMargin().setRight(30);
tocInfo.getFormatArray()[1].setLineDash(TabLeaderType.None);
tocInfo.getFormatArray()[1].getTextState().setFontSize(10);
tocInfo.getFormatArray()[2].getMargin().setLeft(20);
tocInfo.getFormatArray()[2].getMargin().setRight(0);
tocInfo.getFormatArray()[2].getTextState().setFontStyle(FontStyles.Bold);
tocInfo.getFormatArray()[3].setLineDash(TabLeaderType.Solid);
tocInfo.getFormatArray()[3].getMargin().setLeft(30);
tocInfo.getFormatArray()[3].getMargin().setRight(30);
tocInfo.getFormatArray()[3].getTextState().setFontStyle(FontStyles.Bold);
// Pdf 문서에 섹션 생성
Page page = document.getPages().add();
// 섹션에 네 개의 머리글 추가
for (int Level = 1; Level <= 4; Level++) {
com.aspose.pdf.Heading heading2 = new com.aspose.pdf.Heading(Level);
TextSegment segment2 = new TextSegment();
heading2.getSegments().add(segment2);
heading2.setAutoSequence(true);
heading2.setTocPage(tocPage);
segment2.setText("샘플 머리글" + Level);
heading2.getTextState().setFont(FontRepository.findFont("Arial UnicodeMS"));
// 목차에 머리글 추가.
heading2.setInList(true);
page.getParagraphs().add(heading2);
}
// PDF 저장
document.save(outFile);
}
TOC에서 페이지 번호 숨기기
TOC에서 제목과 함께 페이지 번호를 표시하고 싶지 않은 경우, TOCInfo 클래스의 IsShowPageNumbers 속성을 false로 사용할 수 있습니다. 다음 코드 스니펫을 확인하여 목차에서 페이지 번호를 숨기는 방법을 확인하세요:
public static void HidePageNumbersInTOC() {
String outFile = _dataDir + "HiddenPageNumbers_out.pdf";
Document doc = new Document();
Page tocPage = doc.getPages().add();
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("Table Of Contents");
title.getTextState().setFontSize(20);
title.getTextState().setFontStyle(FontStyles.Bold);
tocInfo.setTitle(title);
// Pdf 문서의 섹션 컬렉션에 목록 섹션 추가
tocPage.setTocInfo(tocInfo);
// 각 수준의 왼쪽 여백 및 텍스트 형식 설정을 설정하여 4개 수준 목록의 형식 정의
tocInfo.setShowPageNumbers(false);
tocInfo.setFormatArrayLength(4);
tocInfo.getFormatArray()[0].getMargin().setRight(0);
tocInfo.getFormatArray()[0].getTextState().setFontStyle(FontStyles.Bold | FontStyles.Italic);
tocInfo.getFormatArray()[1].getMargin().setLeft(30);
tocInfo.getFormatArray()[1].getTextState().setUnderline(true);
tocInfo.getFormatArray()[1].getTextState().setFontSize(10);
tocInfo.getFormatArray()[2].getTextState().setFontStyle(FontStyles.Bold);
tocInfo.getFormatArray()[3].getTextState().setFontStyle(FontStyles.Bold);
Page page = doc.getPages().add();
// 섹션에 4개의 제목 추가
for (int Level = 1; Level != 5; Level++) {
Heading heading2 = new Heading(Level);
TextSegment segment2 = new TextSegment();
heading2.setTocPage(tocPage);
heading2.getSegments().add(segment2);
heading2.setAutoSequence(true);
segment2.setText("this is heading of level " + Level);
heading2.setInList(true);
page.getParagraphs().add(heading2);
}
doc.save(_dataDir + outFile);
}
TOC 추가 시 페이지 번호 사용자 정의
PDF 문서에 TOC를 추가할 때 TOC의 페이지 번호를 사용자 정의하는 것이 일반적입니다. 예를 들어, P1, P2, P3 등과 같이 페이지 번호 앞에 접두사를 추가해야 할 수도 있습니다. 이러한 경우, Aspose.PDF for Java는 TocInfo 클래스의 PageNumbersPrefix 속성을 제공하여 다음 코드 샘플과 같이 페이지 번호를 사용자 정의할 수 있습니다.
public static void CustomizePageNumbersWhileAddingTOC() {
String inFile = _dataDir + "sample.pdf";
String outFile = _dataDir + "42824_out.pdf";
// 기존 PDF 파일 로드
Document doc = new Document(inFile);
// PDF 파일의 첫 번째 페이지에 접근
Page tocPage = doc.getPages().insert(1);
// TOC 정보를 나타내는 객체 생성
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("Table Of Contents");
title.getTextState().setFontSize(20);
title.getTextState().setFontStyle(FontStyles.Bold);
// TOC 제목 설정
tocInfo.setTitle(title);
tocInfo.setPageNumbersPrefix("P");
tocPage.setTocInfo(tocInfo);
for (int i = 1; i < doc.getPages().size(); i++) {
// Heading 객체 생성
Heading heading2 = new Heading(1);
TextSegment segment2 = new TextSegment();
heading2.setTocPage(tocPage);
heading2.getSegments().add(segment2);
// Heading 객체의 대상 페이지 지정
heading2.setDestinationPage(doc.getPages().get_Item(i + 1));
// 대상 페이지
heading2.setTop(doc.getPages().get_Item(i + 1).getRect().getHeight());
// 대상 좌표
segment2.setText("Page " + i);
// TOC가 포함된 페이지에 Heading 추가
tocPage.getParagraphs().add(heading2);
}
// 업데이트된 문서 저장
doc.save(outFile);
}
PDF 파일에 레이어 추가
레이어는 PDF 문서에서 여러 가지 방법으로 사용될 수 있습니다. 다국어 파일을 배포하고자 할 때 각 언어의 텍스트가 다른 레이어에 나타나고 배경 디자인이 별도의 레이어에 나타나기를 원할 수 있습니다. 애니메이션이 별도의 레이어에 나타나는 문서를 생성할 수도 있습니다. 예를 들어, 파일에 라이선스 계약서를 추가하고 사용자가 계약 조건에 동의하기 전까지 내용을 보지 못하게 하고 싶을 때 사용할 수 있습니다.
Aspose.PDF for Java는 PDF 파일에 레이어를 추가하는 것을 지원합니다.
PDF 파일에서 레이어를 작업하려면 다음 API 멤버를 사용하십시오.
Layer 클래스는 레이어를 나타내며 다음과 같은 속성을 포함합니다:
- Name – 레이어의 이름.
- Id – 레이어의 ID.
- Contents – 레이어 연산자의 목록.
Layer 객체가 정의되면, 이를 Page 객체의 Layers 컬렉션에 추가하십시오. PDF 문서에 레이어를 추가하는 방법을 보여주는 코드입니다.
public static void AddLayersToPDFFile() {
Document doc = new Document();
Page page = doc.getPages().add();
Layer layer = new Layer("oc1", "빨간 선");
layer.getContents().add(new com.aspose.pdf.operators.SetRGBColorStroke(1, 0, 0));
layer.getContents().add(new com.aspose.pdf.operators.MoveTo(500, 700));
layer.getContents().add(new com.aspose.pdf.operators.LineTo(400, 700));
layer.getContents().add(new com.aspose.pdf.operators.Stroke());
page.setLayers(new ArrayList<Layer>());
page.getLayers().add(layer);
layer = new Layer("oc2", "초록 선");
layer.getContents().add(new com.aspose.pdf.operators.SetRGBColorStroke(0, 1, 0));
layer.getContents().add(new com.aspose.pdf.operators.MoveTo(500, 750));
layer.getContents().add(new com.aspose.pdf.operators.LineTo(400, 750));
layer.getContents().add(new com.aspose.pdf.operators.Stroke());
page.getLayers().add(layer);
layer = new Layer("oc3", "파란 선");
layer.getContents().add(new com.aspose.pdf.operators.SetRGBColorStroke(0, 0, 1));
layer.getContents().add(new com.aspose.pdf.operators.MoveTo(500, 800));
layer.getContents().add(new com.aspose.pdf.operators.LineTo(400, 800));
layer.getContents().add(new com.aspose.pdf.operators.Stroke());
page.getLayers().add(layer);
doc.save("output.pdf");
PDF 만료 설정
PDF 만료 기능은 PDF 파일이 유효한 기간을 설정합니다. 특정 날짜에 누군가가 접근하려고 하면, 파일이 만료되었고 새 파일이 필요하다는 설명이 포함된 팝업이 표시됩니다.
Aspose.PDF를 사용하면 PDF 파일을 생성하고 편집할 때 만료를 설정할 수 있습니다.
아래 코드 스니펫은 PDF 파일의 만료 날짜를 설정하는 방법을 보여줍니다. JavaScript를 사용해야 하며, 타사 구성 요소(예: OwnerGuard)로 저장된 파일은 해당 유틸리티 없이는 다른 워크스테이션에서 볼 수 없습니다.
PDF 파일은 만료 날짜가 있는 기존 파일을 사용하여 PDF OwnerGuard를 사용하여 생성할 수 있습니다. 그러나 새로운 파일은 PDF OwnerGuard가 설치된 워크스테이션에서만 열 수 있습니다. PDF OwnerGuard가 없는 워크스테이션은 ExpirationFeatureError를 반환합니다. 예를 들어, OwnerGuard가 설치된 경우 PDF Reader는 파일을 열지만 Adobe Acrobat은 오류를 반환합니다.
public static void SetPDFExpiration() {
Document document = new Document(_dataDir+"sample.pdf");
JavascriptAction javaScript = new JavascriptAction(
"var year=2020;" +
"var month=4;" +
"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.');"
);
document.setOpenAction(javaScript);
document.save(_dataDir + "JavaScript-Added.pdf");
}