TypeScript에서 주석 작업하기

TypeScript에서 주석 작업하기

이 가이드는 TypeScript용 Aspose.PDF FOSS를 사용하여 PDF 주석을 추가, 평탄화 및 검색하는 방법을 보여줍니다. Page 클래스는 주석 하위 유형당 하나의 Add* 메서드를 노출합니다 — 마크업(하이라이트, 밑줄, 취소선, 물결선), 도형(사각형, 원, 선, 다각형, 잉크), 텍스트(스티키 노트, 자유 텍스트), 그리고 링크 — 각각은 나중에 다시 읽거나 평탄화할 수 있는 타입이 지정된 Annotation 핸들을 반환합니다. Node.js 22 이상이 필요합니다.

단계별 가이드

1단계: 패키지 설치

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run build

패키지를 설치한 후에는 새로운 TypeScript 파일에 Document 클래스를 가져와 설치를 확인하십시오 — 이 줄은 오류 없이 해결되어야 합니다:

import { Document } from '@asposefoss/pdf';

2단계: 필요한 클래스 가져오기

파일을 열기 위해 Document을 가져오고, 아래 단계에서 사용되는 주석 유형 서명을 위해 Page을 가져오세요:

import { Document, Page } from '@asposefoss/pdf';

3단계: 마크업 주석 추가

Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly(), 및 Page.AddStrikeOut()은 모두 quads 배열을 사용합니다 — 강조된 텍스트 영역당 8개의 숫자로 이루어진 사각형(x1,y1,x2,y2,x3,y3,x4,y4) 하나 — 그리고 color 및 선택적 contents을 추가합니다. 라이브러리는 네 가지 하위 유형에 대해 나타내기 스트림(/AP)을 자동으로 생성합니다:

import { Document } from '@asposefoss/pdf';

const doc = Document.OpenFile('input.pdf');
const page = doc.Pages[0];

page.AddHighlight({
  quads: [72, 700, 300, 700, 72, 685, 300, 685],
  color: [1, 1, 0],
  contents: 'Yellow highlight',
});
page.AddUnderline({
  quads: [72, 660, 300, 660, 72, 645, 300, 645],
  color: [0, 0, 1],
});
page.AddStrikeOut({
  quads: [72, 620, 300, 620, 72, 605, 300, 605],
  color: [1, 0, 0],
});

doc.WriteTo('annotated.pdf');

4단계: 도형 및 잉크 주석 추가

Page.AddSquare()와 Page.AddCircle()은 경계 rect와 color(스트로크) 및 선택적 fill를 사용합니다. Page.AddLine()는 4개의 숫자로 이루어진 line(x1,y1,x2,y2)와 선택적 화살표 끝을 사용합니다. Page.AddInk()은 paths를 사용합니다 — 평면 점-쌍 배열의 배열이며, 펜 스트로크당 하나씩입니다:

page.AddSquare({ rect: [100, 500, 220, 560], color: [0.8, 0, 0], fill: [1, 1, 0.5], width: 2 });
page.AddCircle({ rect: [250, 500, 370, 560], color: [0, 0.5, 0], width: 2 });
page.AddLine({
  line: [100, 470, 370, 470],
  color: [0, 0, 0.7],
  width: 2,
  startEnding: 'OpenArrow',
  endEnding: 'ClosedArrow',
});
page.AddInk({
  paths: [[100, 400, 130, 430, 160, 390, 190, 420]],
  color: [0.6, 0, 0.6],
  width: 2,
});

5단계: 스티키 노트와 자유 텍스트 추가

Page.AddTextNote()은 클릭 가능한 아이콘을 배치하여 댓글 팝업을 엽니다. Page.AddFreeText()은 rect 안에 페이지에 직접 텍스트를 그립니다:

page.AddTextNote({
  rect: [400, 700, 420, 720],
  icon: 'Note',
  author: 'Reviewer',
  contents: 'This is a sticky-note annotation.',
});

page.AddFreeText({
  rect: [400, 600, 550, 660],
  contents: 'FreeText sample',
  fontSize: 10,
  align: 'center',
  fill: [1, 1, 0.8],
  width: 1,
});

6단계: 주석을 정적 콘텐츠로 평면화

모든 주석 핸들은 Add* 호출에 의해 반환되며, Flatten() 메서드를 통해 주석의 외관을 페이지의 콘텐츠 스트림에 삽입하고 /Annots에서 제거합니다. 평탄화 후에는 뷰어에서 클릭하거나 편집할 수 있는 것이 남지 않습니다:

const note = page.AddFreeText({
  rect: [210, 535, 470, 590],
  contents: 'Sticky note — flattened into the page.',
  fontSize: 11,
  align: 'left',
});

note.Flatten(); // -> boolean; bakes the annotation, unwires itself from /Annots

단계 7: 주석 텍스트 검색

Page.SearchAnnotationText() and Page.SearchAnnotations() 양쪽 방향 모두에서 서로 겹치지 않습니다: SearchAnnotationText() 리터럴 주석 메타데이터와 일치합니다 (/Contents, /T, /Subj), 반면에 SearchAnnotations() 와 일치합니다 rendered 마크업 주석의 텍스트와 같은 FreeText:

const metadataHits = page.SearchAnnotationText('confidential');
for (const hit of metadataHits) {
  console.log(hit.key, hit.value); // e.g. 'Contents', 'confidential'
}

const renderedHits = page.SearchAnnotations('confidential');
console.log(renderedHits.length);

일반적인 문제 및 해결책

Page.AddHighlight() (또는 다른 마크업 방법) 이 잘못된 위치에 그려집니다. quads 은 8개의 숫자로 구성된 평면 배열입니다 (x1,y1,x2,y2,x3,y3,x4,y4), 아니면 rect — 4개의 숫자로 이루어진 사각형을 전달하면 퇴화된 사각형이거나 사각형이 누락됩니다. 강조된 텍스트 한 줄당 하나의 사각형을 생성하십시오.

플래튼된 주석도 여전히 클릭할 수 있습니다. Flatten() 반환된 객체에 대해 호출되어야 합니다. Add* 호출하고, 문서는 저장되어야 합니다 (doc.WriteTo() / doc.Save()) 평탄화 후 — 변경 사항은 파일이 다시 기록될 때까지 메모리 내에만 존재합니다.

SearchAnnotationText() 페이지에 텍스트가 표시되어 있음에도 검색 결과가 반환되지 않습니다. 이는 주석 메타데이터 필드만 검색합니다 (/Contents, /T, /Subj) — 주석 자체 외관에서 렌더링된 가시적인 마크업 텍스트 (예: a FreeText body) 은(는) 에 의해 찾아집니다 SearchAnnotations() 대신, 일반 페이지 콘텐츠는 검색하지 않으며 (사용 Page.GetText() or Page.Search() 그때 사용하십시오).

주석을 검색할 때 삭제 표시가 표시되지 않습니다. Page.AddRedact() 를 생성합니다 RedactAnnotation, 여기에서 다루는 마크업/도형/텍스트 주석과는 구별되는 하위 유형 — 다음을 참조하십시오 Redaction 가이드.

자주 묻는 질문

Page은(는) 몇 개의 주석 하위 유형을 지원합니까?

라이브러리는 markup (highlight, underline, strikeout, squiggly), shapes (square, circle, line, polygon, ink), text (sticky note, free text), links 및 stamps에 대한 appearance를 생성합니다 — 또한 파일 첨부 및 redaction 주석도 포함되며, 이들은 각각 별도의 사용 방법 가이드에서 다룹니다.

페이지에 이미 존재하는 주석을 읽을 수 있나요?

예 — Page.Annotations은(는) 기존 주석을 검사, 편집 또는 평탄화할 수 있는 타입이 지정된 핸들의 배열로 반환하며, Page.RemoveAnnotation(a)은(는) 하나를 제거합니다.

주석을 평탄화하는 것과 redaction을 적용하는 것의 차이점은 무엇인가요?

Flatten() 주석을 고정합니다 appearance 페이지에 삽입하고 주석 객체를 제거하지만, 그 아래의 텍스트나 이미지 내용은 손대지 않습니다. ApplyRedactions() 내용 스트림을 파괴적으로 다시 작성하여 가려진 콘텐츠 자체가 사라집니다 — 자세한 내용은 Redaction guide를 참조하십시오.

저장/열기 라운드 트립 동안 주석이 보존됩니까?

예 — doc.WriteTo() / doc.Save() 이전에 추가된 주석은 PDF에 기록되고 다음 Document.Open() / Document.OpenFile()에서 올바르게 읽어집니다.

참조

 한국어