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

はじめてのPDFKit

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for shoma.kato shoma.kato
February 10, 2025

 はじめてのPDFKit

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

Avatar for shoma.kato

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Λൃߦ