iOS PDFKit 튜토리얼 : 텍스트 주석 및 기타

이것은 텍스트 주석, 문서 자동 저장 및 PencilKit 작업을 다루는 Apple의 PDFkit에 대한 두 번째 기사입니다.

  • 첫 번째 기사는 PDFKit 기본 사항 및 잉크 주석에 관한 것입니다.
  • 세 번째 기사는 장치에서 PDF 문서 작성 및 페이지 삽입 / 제거에 관한 것입니다.

PencilKitiOS 13 출시 직후 앱에서 지원 을 구현하려고 했습니다. 우리는 Apple 기술 지원에 쉽게 할 수있는 방법이 있는지 묻는 티켓을 만들었습니다. 짧은 대답은 아니오 입니다.

네이티브 iOS 마크 업 화면에서 작동하는 방식 PencilKitPDFKit같이 함께 사용할 수 없습니다 .

Apple 기술 지원 답변 :

PencilKit 팀은 개발자가 각 PDFPage에 PKCanvasView를 배치 할 것을 권장합니다. 서명은 약간 다릅니다. PKCanvasView에서 PKDrawing을 가져온 다음 워터 마크처럼 PKDrawing을 PDFPage 내부의 이미지로 렌더링해야합니다.

제안 된 솔루션은 (추가 구현하는 것은 불가능 될 것으로 보인다 PKCanvasView으로 PDFPage). PKDrawing페이지를 확대하고 이전에 추가 된 주석을 지워야하기 때문에 두 번째 부분 (움켜 잡기에 대한 )도 우리 작업에 적합한 방법이 아닌 것 같습니다. 따라서이 튜토리얼의 첫 번째 부분에서 나온 솔루션이 여전히 옳다고 생각합니다.

PKToolPicker잘 맞지 않는 것 같습니다. 외부 기기보기보다 훨씬 좋아 보이지만 완전히 사용자 정의 할 수는 없습니다. 예를 들어 iOS 13에서는 눈금자가 있으며 앱에서 필요하지 않은 경우 ToolPicker에서 제거 할 수 없습니다. 희망, 애플은 향후 릴리스에서 사용자 정의를위한 몇 가지 방법을 추가 할 것입니다.

텍스트 주석

텍스트 주석은 그리기 (잉크)보다 쉬운 것 같습니다. 그러나 문서와 샘플 코드가 부족했기 때문에 (다시!) 쉬운 작업이 아니 었습니다.

따라서 "Hello, world!"를 추가해야한다고 가정 해 보겠습니다. 문서의 마지막 페이지에 텍스트를 추가합니다. 이렇게하려면 아래 코드를 작성하십시오 (이 예에서는 드로잉 뷰 컨트롤러에 있음).

func addDateAnnotation() {
  guard let document = pdfView.document else { return }
  let lastPage = document.page(at: document.pageCount - 1)
  let annotation = PDFAnnotation(bounds: CGRect(x: 100, y: 100, width: 100, height: 20), forType: .freeText, withProperties: nil)
annotation.contents = "Hello, world!"
annotation.font = UIFont.systemFont(ofSize: 15.0)
annotation.fontColor = .blue
annotation.color = .clear
lastPage?.addAnnotation(annotation)
}
  • contents: 표시 할 텍스트,
  • font: 폰트,
  • fontColor: 전경색,
  • color: 배경색.

주석 유형

작업 중 하나에서 특정 유형의 주석을 제거하기 위해 모든 주석 배열을 반복해야했습니다. 우리는 소명을 발견 PDFAnnotationSubtype.freeText하고 annotation.type실제로 다른 결과를 반환 할 것입니다!

PDFAnnotationSubtype.freeText // "/freeText"
annotation.type // "FreeText"

allPageAnnotations.filter { $0.type == "FreeText" }

allPageAnnotations.filter { $0.type == PDFAnnotationSubtype.freeText }

[사용자에게 매우 유용한] 다음 및 이전 버튼을 구현하는 것은 매우 쉽습니다. 스토리 보드에 해당 버튼을 추가하고 다음 메서드 중 하나를 호출하기 만하면됩니다.

pdfView.goToPreviousPage(nil)
// or
pdfView.goToNextPage(nil)

충돌에 대한 오랜 역사 때문에 우리는 자동 저장 기능을 구현하기로 결정했습니다. 각 주석을 성공적으로 그린 ​​후 PDFDocument를 저장하고 다음 코드를 사용했습니다.

pdfDocument.write(to: url)

DispatchQueue.global(qos: .background).async {
pdfDocument.write(to: url)
}

마지막 해결책은 간단한 PDFDocument방법 dataRepresentation과 결합 된 방법 을 사용 하는 것이 었습니다 Timer.

if let data = pdfDocument.dataRepresentation() {
  try? data.write(to: url)
}
  • 의 사본 만들기 PDFDocument,
  • 모든 변경 사항 (주석 추가 / 제거)을 표시되는 문서에 적용 PDFView하고 복사하고 성능으로 인해 완료된 주석 만 추가합니다.
  • 30 초마다 복사본 저장 (예 :)
  • 저장 중 모든 변경 사항 추적 : 저장 중에는 변경 사항을 적용 할 수 없으므로 저장 중에는 변경 내역을 메모리에 저장해야합니다. 파일 크기가 크면 시간이 걸릴 수 있습니다.

이 WWDC 비디오에서 PDFKit에 대한 몇 가지 초기 정보를 찾을 수 있습니다.

  • PSPDFKit. Apple의 PDFKit에 대한 드롭 인 대체 API 기능,
  • 폭싯,
  • PDFTron.

Suggested posts

Swift를 사용하고 타사 라이브러리없이 최신 iOS 입력 레이 오버 생성

Swift를 사용하고 타사 라이브러리없이 최신 iOS 입력 레이 오버 생성

앱에서 개발자는 종종 앱 내의 여러 지점에서 특정 정보를 요구합니다. 이 정보를 요청하려면 레이 오버를 생성하고 애플리케이션 어디에서나이를 트리거해야합니다.

SwiftUI에서 이미지 크기 조정

왜곡없이 이미지 크기를 가로 세로 비율로 조정하는 방법

SwiftUI에서 이미지 크기 조정

Vrbo ™ ️ (Expedia Group ™의 일부) iOS 앱에서 최근 일부 기존 UIKit보기를 SwiftUI로 변환했으며 이미지 크기를 조정할 때 문제가 발생했습니다. 문제는 이미지를 특정 크기로 크기를 조정하고 왜곡없이 종횡비를 유지해야 할 때 발생합니다.