Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はじめてのPDFKit

shoma.kato
February 10, 2025

 はじめてのPDFKit

PDFKitに関して様々なTipsを紹介します

shoma.kato

February 10, 2025
Tweet

More Decks by shoma.kato

Other Decks in Technology

Transcript

  1. © ZOZO, Inc. 2 גࣜձࣾZOZO ϒϥϯυιϦϡʔγϣϯ։ൃຊ෦ FAANS෦ ϑϩϯτΤϯυϒϩοΫ Ճ౻ ঵ਅ

    • X: @shoma10170806 • 2023೥4݄: ZOZOೖࣾʢ2೥໨ʣ • γϣοϓελοϑͷൢചαϙʔτπʔϧ
 ʮFAANSʯͷiOSΞϓϦΛ։ൃ • ത࢜ޙظ՝ఔʹࡏֶதɹը૾ॲཧͳͲͷݚڀʹैࣄ
  2. © ZOZO, Inc. 9 PDFDocumentͷಡΈࠐΈ Section1: PDFKitΛ༻͍ͨදࣔ extension URLSession {

    func data(with url: URL) async throws -> (Data, URLResponse) { try await data(from: url) } } private func loadPdfDocument() async { var pdfDocument: PDFDocument? do { let (data, _) = try await URLSession.shared.data(with: pdfUrl) if let document = PDFDocument(data: data), document.pageCount > 0 { self.pdfDocument = document } } catch { // ಡΈࠐΈΤϥʔͷ৔߹ } }
  3. © ZOZO, Inc. private func loadPdfDocument() async { var pdfDocument:

    PDFDocument? do { let (data, _) = try await URLSession.shared.data(with: pdfUrl) if let document = PDFDocument(data: data), document.pageCount > 0 { self.pdfDocument = document } } catch { // ಡΈࠐΈΤϥʔͷ৔߹ } } 10 PDFDocumentͷಡΈࠐΈ Section1: PDFKitΛ༻͍ͨදࣔ pdfUrl: https:// xxx.pdf extension URLSession { func data(with url: URL) async throws -> (Data, URLResponse) { try await data(from: url) } }
  4. © ZOZO, Inc. private func loadPdfDocument() async { var pdfDocument:

    PDFDocument? do { let (data, _) = try await URLSession.shared.data(with: pdfUrl) if let document = PDFDocument(data: data), document.pageCount > 0 { self.pdfDocument = document } } catch { // ಡΈࠐΈΤϥʔͷ৔߹ } } extension URLSession { func data(with url: URL) async throws -> (Data, URLResponse) { try await data(from: url) } } 11 PDFDocumentͷಡΈࠐΈ Section1: PDFKitΛ༻͍ͨදࣔ ɾdata͔ΒPDFDocumentΛੜ੒ ɾϖʔδ਺: 1Ҏ্
  5. © ZOZO, Inc. 12 PDFͷදࣔ let pdfView = PDFView() pdfView.document

    = document pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor ① PDFViewʹPDFDocumentͷૠೖ Section1: PDFKitΛ༻͍ͨදࣔ
  6. © ZOZO, Inc. 13 PDFͷදࣔ ① PDFViewʹPDFDocumentͷૠೖ ② දࣔํ๏ͷઃఆ let

    pdfView = PDFView() pdfView.document = document pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor Section1: PDFKitΛ༻͍ͨදࣔ
  7. © ZOZO, Inc. let pdfView = PDFView() pdfView.document = document

    pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor 14 PDFͷදࣔ ① PDFViewʹPDFDocumentͷૠೖ ② දࣔํ๏ͷઃఆ ③ PDFͷαΠζΛࣗಈͰௐ੔ Section1: PDFKitΛ༻͍ͨදࣔ
  8. © ZOZO, Inc. let pdfView = PDFView() pdfView.document = document

    pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor 15 PDFͷදࣔ ① PDFViewʹPDFDocumentͷૠೖ ② දࣔํ๏ͷઃఆ ④ ॖখαΠζͷ࠷খ஋ͷܾఆ ③ PDFͷαΠζΛࣗಈͰௐ੔ Section1: PDFKitΛ༻͍ͨදࣔ
  9. © ZOZO, Inc. let pdfView = PDFView() pdfView.document = document

    pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor 16 PDFͷදࣔ ① PDFViewʹPDFDocumentͷૠೖ ② දࣔํ๏ͷઃఆ ④ ॖখαΠζͷ࠷খ஋ͷܾఆ ③ PDFͷαΠζΛࣗಈͰௐ੔ Section1: PDFKitΛ༻͍ͨදࣔ
  10. © ZOZO, Inc. 18 ζϨ ɾζϨͷݪҼ - PDFͷαΠζ - தԝἧ͑

    Section1: PDFKitΛ༻͍ͨදࣔ ॳظঢ়ଶʹ͓͚ΔPDFදࣔҐஔͷζϨ ਖ਼ৗ ॳظදࣔʢζϨʣ
  11. © ZOZO, Inc. 19 ζϨ ɾζϨͷݪҼ - PDFͷαΠζ - தԝἧ͑

    Section1: PDFKitΛ༻͍ͨදࣔ ॳظঢ়ଶʹ͓͚ΔPDFදࣔҐஔͷζϨ ॳظঢ়ଶ: PDFࠨ্͕ը໘಺ ਖ਼ৗ ॳظදࣔʢζϨʣ
  12. © ZOZO, Inc. 20 ζϨͷվળํ๏ if let firstPage = document.page(at:

    0) { pdfView.go( to: firstPage.bounds(for: pdfView.displayBox), on: firstPage ) } Section1: PDFKitΛ༻͍ͨදࣔ
  13. © ZOZO, Inc. 21 if let firstPage = document.page(at: 0)

    { pdfView.go( to: firstPage.bounds(for: pdfView.displayBox), on: firstPage ) } ① PDFDocumentͷ1ϖʔδΛऔಘ ② 1ϖʔδ໨ͷࠨ্͕දࣔ͞ΕΔΑ͏ʹҠಈ Section1: PDFKitΛ༻͍ͨදࣔ ζϨͷվળํ๏
  14. © ZOZO, Inc. 24 ϖʔδ൪߸ͷऔಘํ๏ let document: PDFDocument? let pdfView

    = PDFView() let totalPage = document.pageCount NotificationCenter.default .addObserver(forName: .PDFViewPageChanged, object: pdfView, queue: .main) { _ in Task { @MainActor in let pageNumber = pdfView.currentPage?.pageRef?.pageNumber } } ࠨଆ: ݱࡏͷϖʔδ൪߸ ӈଆ: ૯ϖʔδ਺ ① ૯ϖʔδ਺ͷऔಘ
  15. © ZOZO, Inc. 25 ϖʔδ൪߸ͷऔಘํ๏ let document: PDFDocument? let pdfView

    = PDFView() let totalPage = document.pageCount NotificationCenter.default .addObserver(forName: .PDFViewPageChanged, object: pdfView, queue: .main) { _ in Task { @MainActor in let pageNumber = pdfView.currentPage?.pageRef?.pageNumber } } ࠨଆ: ݱࡏͷϖʔδ൪߸ ӈଆ: ૯ϖʔδ਺ ① ૯ϖʔδ਺ͷऔಘ ② ϖʔδͷมߋ؂ࢹɾ൪߸औಘ
  16. © ZOZO, Inc. 26 ϖʔδ൪߸ͷऔಘํ๏ let document: PDFDocument? let pdfView

    = PDFView() let totalPage = document.pageCount NotificationCenter.default .addObserver(forName: .PDFViewPageChanged, object: pdfView, queue: .main) { _ in Task { @MainActor in let pageNumber = pdfView.currentPage?.pageRef?.pageNumber } } ࠨଆ: ݱࡏͷϖʔδ൪߸ ӈଆ: ૯ϖʔδ਺ ① ૯ϖʔδ਺ͷऔಘ ② ϖʔδͷมߋ؂ࢹɾ൪߸औಘ
  17. © ZOZO, Inc. 27 ϖʔδ൪߸औಘͷ໰୊఺ ɾԣ௕ͷPDF - ը໘্ʹෳ਺ຕͷPDF - ϖʔδ൪߸:

    2͔Βදࣔ͞ΕΔ ॳظঢ়ଶ: ϖʔδ൪߸Λ1ʹ͢Δ ※ Πϝʔδը૾
  18. © ZOZO, Inc. 29 ॳظঢ়ଶͷ൑ఆํ๏ UIScrollView extension PDFView { func

    scrollView() -> UIScrollView? { return self.subviews.compactMap { $0 as? UIScrollView }.first } } ɾoffset͕0: ϖʔδ൪߸1 PDFView: offset͸औಘͰ͖ͳ͍ ϫʔΫΞϥ΢ϯυ
  19. © ZOZO, Inc. 30 ॳظঢ়ଶͷ൑ఆํ๏ if let scrollView = pdfView.scrollView()

    { scrollView.publisher(for: \.contentOffset) .sink { [weak pdfView] contentOffset in Task { @MainActor in guard let pdfView = pdfView else { return } if contentOffset.y <= 0.0 { currentPage = 1 } else if let pageNumber = pdfView.currentPage?.pageRef?.pageNumber, pageNumber != currentPage { NotificationCenter.default.post( name: .PDFViewPageChanged, object: pdfView ) } } } } ① UIScrollViewͷݕग़ ② offSetͷpublisherΛൃߦ
  20. © ZOZO, Inc. if let scrollView = pdfView.scrollView() { scrollView.publisher(for:

    \.contentOffset) .sink { [weak pdfView] contentOffset in Task { @MainActor in guard let pdfView = pdfView else { return } if contentOffset.y <= 0.0 { currentPage = 1 } else if let pageNumber = pdfView.currentPage?.pageRef?.pageNumber, pageNumber != currentPage { NotificationCenter.default.post( name: .PDFViewPageChanged, object: pdfView ) } } } } 31 ॳظঢ়ଶͷ൑ఆํ๏ ③ ϖʔδ൪߸ͷߋ৽ ① UIScrollViewͷݕग़ ② offSetͷpublisherΛൃߦ
  21. © ZOZO, Inc. if let scrollView = pdfView.scrollView() { scrollView.publisher(for:

    \.contentOffset) .sink { [weak pdfView] contentOffset in Task { @MainActor in guard let pdfView = pdfView else { return } if contentOffset.y <= 0.0 { currentPage = 1 } else if let pageNumber = pdfView.currentPage?.pageRef?.pageNumber, pageNumber != currentPage { NotificationCenter.default.post( name: .PDFViewPageChanged, object: pdfView ) } } } } 32 ॳظঢ়ଶͷ൑ఆํ๏ ③ ϖʔδ൪߸ͷߋ৽ ① UIScrollViewͷݕग़ ② offSetͷpublisherΛൃߦ
  22. © ZOZO, Inc. if let scrollView = pdfView.scrollView() { scrollView.publisher(for:

    \.contentOffset) .sink { [weak pdfView] contentOffset in Task { @MainActor in guard let pdfView = pdfView else { return } if contentOffset.y <= 0.0 { currentPage = 1 } else if let pageNumber = pdfView.currentPage?.pageRef?.pageNumber, pageNumber != currentPage { NotificationCenter.default.post( name: .PDFViewPageChanged, object: pdfView ) } } } } 33 ॳظঢ়ଶͷ൑ఆํ๏ ③ ϖʔδ൪߸ͷߋ৽ ① UIScrollViewͷݕग़ ② offSetͷpublisherΛൃߦ