123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443 |
- //
- // KMMainViewController+Action.swift
- // PDF Reader Pro
- //
- // Created by wanjun on 2022/12/15.
- //
- import Foundation
- extension KMNThumbnailBaseViewController {
-
- private func undoDeleteIndexPaths(deleteIndexPath: Set<IndexPath>) {
- var changeIndex:IndexSet = []
- for targetIndexPath in deleteIndexPath {
- changeIndex.insert(targetIndexPath.item)
- }
- showDocument?.removePage(at: changeIndex)
- refreshDatas()
- collectionView.reloadData()
- }
-
- private func undoInsertPages(insertPages:[CPDFPage],deleteIndexs: [Int]) {
- var indexpaths = Set<IndexPath>()
- for (i, page) in insertPages.enumerated() {
- let index = deleteIndexs[i]
- showDocument?.insertPageObject(page, at: UInt(index))
- indexpaths.insert(IndexPath(item: index, section: 0))
- }
- refreshDatas()
- collectionView.reloadData()
- collectionView.scrollToItems(at: indexpaths, scrollPosition: .centeredVertically)
- collectionView.selectionIndexPaths = indexpaths
- }
-
- private func undoRotatePages(indexPaths: Set<IndexPath>, rotateAngle: Int) {
- var tIndexPaths: Set<IndexPath> = []
- tIndexPaths = indexPaths
- for targetIndexPath in indexPaths {
- if let page = showDocument?.page(at: UInt(targetIndexPath.item)) {
- var pageRotate = page.rotation + rotateAngle
- if(pageRotate == -90) {
- pageRotate = 270
- } else if (pageRotate == 450) {
- pageRotate = 90
-
- }
- page.rotation = pageRotate
- }
- }
-
- collectionView.reloadItems(at: tIndexPaths) // Ensure correct type conversion
- collectionView.selectionIndexPaths = tIndexPaths
- }
-
- private func undoReplacePages(replacePages:[CPDFPage],orgPages:[CPDFPage]) {
-
- }
-
- private func undomovePages(movePages:[CPDFPage],orgIndexs:[Int]) {
-
- }
-
- private func undoReversePages(indexs: IndexSet) {
-
- }
-
- func insertFileComplete(newSelectIndexs: Set<IndexPath>){
- refreshDatas()
- collectionView.reloadData()
-
- collectionView.selectionIndexPaths = newSelectIndexs
-
- if newSelectIndexs.isEmpty { return }
-
- let firstIndexPath = newSelectIndexs.first
- collectionView.scrollToItems(at: [firstIndexPath ?? IndexPath(item: 0, section: 0)], scrollPosition: .top)
- }
-
- public func insertFormPages(insertPages: [CPDFPage],pageDex:Int) {
- var pageIndexDex: Int = pageDex
- var indexpaths = Set<IndexPath>()
-
- let page = insertPages.first
- if page?.document == showDocument {
- for (i, page) in insertPages.enumerated() {
- let isSuccessFul:Bool = showDocument?.insertPageObject(page, at: UInt(pageIndexDex+i)) == true
- if(isSuccessFul == true) {
- indexpaths.insert(IndexPath(item: pageIndexDex+i, section: 0))
- }
- }
- } else {
- if let pasteDocument = page?.document {
- var indexs: IndexSet = IndexSet()
- for (i, page) in insertPages.enumerated() {
- indexs.insert(Int(pasteDocument.index(for: page)))
- indexpaths.insert(IndexPath(item: pageIndexDex+i, section: 0))
- }
-
- let isSuccessFul:Bool = showDocument?.importPages(indexs, from: pasteDocument, at: UInt(pageIndexDex)) == true
- if(isSuccessFul == false){
- return
- }
- }
- }
-
- refreshDatas()
- collectionView.reloadData()
- collectionView.scrollToItems(at: indexpaths, scrollPosition: .centeredVertically)
- collectionView.selectionIndexPaths = indexpaths
- }
-
- public func insertBlankSize(pageSize: CGSize,pageDex:Int) {
- var indexpaths = Set<IndexPath>()
- let isSuccessFul = showDocument?.insertBlankPage(pageSize: pageSize, at: pageDex)
- if(isSuccessFul == true) {
- indexpaths.insert(IndexPath(item: pageDex, section: 0))
- }
-
- refreshDatas()
- collectionView.reloadData()
- collectionView.scrollToItems(at: indexpaths, scrollPosition: .centeredVertically)
- collectionView.selectionIndexPaths = indexpaths
- }
-
- public func insertImageFilePath(imagePath:String,pageDex:Int)->Bool{
- var isSuccessFul:Bool = false
- if (FileManager.default.fileExists(atPath: imagePath)) {
- if let image = NSImage(contentsOfFile: imagePath) {
- isSuccessFul = showDocument?.km_insertPage(image.size, withImage: imagePath, at: UInt(pageDex)) == true
- }
- }
- return isSuccessFul
- }
- public func rotatePages(indexPaths: Set<IndexPath>, rotateAngle: Int) {
- var tIndexPaths: Set<IndexPath> = []
- tIndexPaths = indexPaths
- for targetIndexPath in indexPaths {
- if let page = showDocument?.page(at: UInt(targetIndexPath.item)) {
- var pageRotate = page.rotation + rotateAngle
- if(pageRotate == -90) {
- pageRotate = 270
- } else if (pageRotate == 450) {
- pageRotate = 90
-
- }
- page.rotation = pageRotate
-
- let cellView = collectionView.item(at: targetIndexPath) as? KMNThumbnailCollectionViewItem
- if(cellView != nil) {
- cellView?.thumbnailMode.removeCacheImage()
- }
- }
- }
-
- collectionView.reloadItems(at: tIndexPaths) // Ensure correct type conversion
- collectionView.selectionIndexPaths = tIndexPaths
- }
-
- public func reversePages(indexs: IndexSet) {
- if let doc = showDocument {
- var theIdxs = indexs
- var res = false
- for _ in 0 ..< indexs.count {
- guard let first = theIdxs.first else {
- break
- }
- guard let last = theIdxs.last else {
- break
- }
- if first == last {
- break
- }
- res = doc.exchangePage(at: UInt(first), withPageAt: UInt(last))
- if res {
- theIdxs.remove(first)
- theIdxs.remove(last)
-
- }
- }
- if res {
- refreshDatas()
- let selected_indexpaths = KMNTools.indexsToIndexpaths(indexs: indexs)
-
- collectionView.reloadItems(at: selected_indexpaths)
-
- collectionView.selectionIndexPaths = selected_indexpaths
- }
- }
- }
-
- public func replacePages(of targetIndexpaths: Set<IndexPath>, with documents: [CPDFDocument]) {
- if (targetIndexpaths.count == 0 || documents.count == 0) {
- KMPrint("replace invalid.")
- return
- }
- var index = targetIndexpaths.sorted().first!.item
- var tIndexPaths: Set<IndexPath> = []
-
- var indexSet = KMNTools.indexpathsToIndexs(indexpaths: targetIndexpaths)
-
- showDocument?.removePage(at: indexSet)
-
- for document in documents {
- for i in 0 ..< document.pageCount {
- let page = document.page(at: i)
- showDocument?.insertPageObject(page, at: UInt(index))
- tIndexPaths.insert(IndexPath(item: index, section: 0))
- index += 1
- }
- thumbnailBaseViewDelegate?.insertPDFThumbnailViewControlle?(pageEditVC: self, pdfDocment: document)
- }
-
- refreshDatas()
- collectionView.reloadData()
- collectionView.selectionIndexPaths = tIndexPaths
- }
-
- public func deletePages(indexpaths:Set<IndexPath>) {
- var changeIndex:IndexSet = []
- var deletePages:[CPDFPage] = []
-
- for targetIndexPath in indexpaths {
- let dex = targetIndexPath.item
- deletePages.append(showDocument?.page(at: UInt(targetIndexPath.item)) ?? CPDFPage())
- changeIndex.insert(targetIndexPath.item)
- }
- showDocument?.removePage(at: changeIndex)
- refreshDatas()
- collectionView.reloadData()
- }
-
- public func movePages(pages:[CPDFPage],destinationDex:Int) {
- var destinationIndex = destinationDex
-
- for dragPage in dragLocalityPages {
- let dragIndex = dragPage.pageIndex()
- if destinationIndex > dragIndex {
- destinationIndex -= 1
- showDocument?.movePage(at: dragIndex, withPageAt: UInt(destinationIndex))
- } else {
- showDocument?.movePage(at: dragIndex, withPageAt: UInt(destinationIndex))
- }
- destinationIndex += 1
- }
-
- var selectIndexPaths: Set<IndexPath> = []
-
- for dragPage in dragLocalityPages {
- let dragIndex = dragPage.pageIndex()
- selectIndexPaths.insert(IndexPath(item: Int(dragIndex), section: 0))
- }
-
- refreshDatas()
- collectionView.reloadData()
- collectionView.selectionIndexPaths = selectIndexPaths
- if selectIndexPaths.isEmpty { return }
- let firstIndexPath = selectIndexPaths.first
- collectionView.scrollToItems(at: [firstIndexPath ?? IndexPath(item: 0, section: 0)], scrollPosition: .top)
- }
-
- public func insertFromFilePath(fileNames:[String],formDex:Int,indexDex:UInt,selectIndexs:Set<IndexPath>,completionBlock:@escaping (Set<IndexPath>)->Void)-> Void {
- let path = fileNames[formDex]
- var insertDex = indexDex
- var tSelectIndex = selectIndexs
-
- let pathExtension = URL(fileURLWithPath: path).pathExtension.lowercased()
- if pathExtension == "pdf", let pdf = CPDFDocument(url: URL(fileURLWithPath: path)) {
- if pdf.isLocked {
- KMNBaseWindowController.checkPassword(url: pdf.documentURL, type: .owner) { success, resultPassword in
- if (resultPassword.isEmpty == false) {
- pdf.unlock(withPassword: resultPassword)
-
- for i in 0 ..< pdf.pageCount {
- let insertPage = pdf.page(at: i)
- self.showDocument?.insertPageObject(insertPage, at: insertDex)
- tSelectIndex.insert(IndexPath(item: Int(insertDex), section:0))
- insertDex += 1
- }
-
- var tFormDex = formDex
- tFormDex += 1
- self.thumbnailBaseViewDelegate?.insertPDFThumbnailViewControlle?(pageEditVC: self, pdfDocment: pdf)
- if(tFormDex < fileNames.count) {
- return self.insertFromFilePath(fileNames: fileNames, formDex: tFormDex, indexDex: indexDex, selectIndexs: tSelectIndex,completionBlock: completionBlock)
- } else {
- self.insertFileComplete(newSelectIndexs: tSelectIndex)
- return completionBlock(tSelectIndex)
- }
- }
- }
- } else {
- for i in 0 ..< pdf.pageCount {
- let insertPage = pdf.page(at: i)
- showDocument?.insertPageObject(insertPage ?? CPDFPage(), at: insertDex)
- tSelectIndex.insert(IndexPath(item: Int(insertDex), section:0))
- insertDex += 1
- }
- var tFormDex = formDex
- tFormDex += 1
- thumbnailBaseViewDelegate?.insertPDFThumbnailViewControlle?(pageEditVC: self, pdfDocment: pdf)
- if(tFormDex < fileNames.count) {
- return insertFromFilePath(fileNames: fileNames, formDex: tFormDex, indexDex: indexDex, selectIndexs: tSelectIndex,completionBlock: completionBlock)
- } else {
- insertFileComplete(newSelectIndexs: tSelectIndex)
- return completionBlock(tSelectIndex)
- }
-
- }
- } else if supportDragFileTypes().contains(pathExtension) {
- if KMConvertPDFManager.supportImages().contains(pathExtension) {
- let isSueccessFul = insertImageFilePath(imagePath: path, pageDex: Int(indexDex))
- if(isSueccessFul) {
- tSelectIndex.insert(IndexPath(item: Int(insertDex), section:0))
- insertDex += 1
- }
-
- var tFormDex = formDex
- tFormDex += 1
- if(tFormDex < fileNames.count) {
- return insertFromFilePath(fileNames: fileNames, formDex: tFormDex, indexDex: indexDex, selectIndexs: tSelectIndex,completionBlock: completionBlock)
- } else {
- insertFileComplete(newSelectIndexs: tSelectIndex)
- return completionBlock(tSelectIndex)
- }
-
- } else {
- KMNConvertTool.convertOffice(filePath: path) { convertPDFPath in
- if (convertPDFPath != nil) {
- let pathExtension = URL(fileURLWithPath: convertPDFPath!).pathExtension.lowercased()
- if pathExtension == "pdf", let pdf = CPDFDocument(url: URL(fileURLWithPath: convertPDFPath!)) {
- for i in 0 ..< pdf.pageCount {
- let insertPage = pdf.page(at: i)
- self.showDocument?.insertPageObject(insertPage, at: insertDex)
- tSelectIndex.insert(IndexPath(item: Int(insertDex), section:0))
- insertDex += 1
- }
- self.thumbnailBaseViewDelegate?.insertPDFThumbnailViewControlle?(pageEditVC: self, pdfDocment: pdf)
-
- var tFormDex = formDex
- tFormDex += 1
- if(tFormDex < fileNames.count) {
- return self.insertFromFilePath(fileNames: fileNames, formDex: tFormDex, indexDex: indexDex, selectIndexs: tSelectIndex,completionBlock: completionBlock)
- } else {
- self.insertFileComplete(newSelectIndexs: tSelectIndex)
- return completionBlock(tSelectIndex)
- }
-
- }
- }
- }
- }
- }
- }
-
- public func extractPages(indexpaths: Set<IndexPath>, oneDocumentPerPage: Bool, callback: @escaping KMResultBlock) {
- let pageIndexs = KMNTools.indexpathsToIndexs(indexpaths: indexpaths)
- let oneDocument = !oneDocumentPerPage
- let document = self.showDocument!
- /// 提取的页面
- var extractPages: Array<CPDFPage> = []
- for i in pageIndexs {
- extractPages.append(document.page(at: UInt(i)))
- }
-
- if (oneDocument) { /// 提取为一个文档
- var fileName = document.documentURL.deletingPathExtension().lastPathComponent
- fileName.append(" pages ")
- fileName.append(KMNTools.newParseSelectedIndexs(selectedIndex: pageIndexs.sorted()))
- fileName.append(".pdf")
- NSPanel.savePanel(self.view.window!, true) { panel in
- panel.nameFieldStringValue = fileName
- } completion: { response, url, isOpen in
- if (response != .OK) {
- callback(.cancel)
- return
- }
-
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
- DispatchQueue.global().async {
- var success = false
- let pdf = CPDFDocument.init()
- success = pdf!.extractAsOneDocument(withPages: extractPages, savePath: url!.path)
- DispatchQueue.main.async {
- if (success == false) {
- callback(.failure)
- return
- }
-
- if (isOpen == false) {
- NSWorkspace.shared.activateFileViewerSelecting([url!])
- } else {
- NSDocumentController.shared.km_safe_openDocument(withContentsOf: url!, display: true) { _, _, _ in
- }
- }
- callback(.success, [url!])
- }
- }
- }
- }
- } else {
- let panel = NSOpenPanel()
- panel.canChooseFiles = false
- panel.canChooseDirectories = true
- panel.canCreateDirectories = true
- panel.allowsMultipleSelection = false
- panel.beginSheetModal(for: self.view.window!) { response in
- if response != .OK {
- callback(.cancel)
- return
- }
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
- let outputURL = panel.url
- DispatchQueue.global().async {
- let folderName = String((document.documentURL.lastPathComponent.split(separator: ".")[0])) + "_extract"
-
- var filePath = URL(fileURLWithPath: outputURL!.path).appendingPathComponent(folderName).path
- var i = 1
- let testFilePath = filePath
- while FileManager.default.fileExists(atPath: filePath) {
- filePath = testFilePath + "\(i)"
- i += 1
- }
-
- try? FileManager.default.createDirectory(atPath: filePath, withIntermediateDirectories: false, attributes: nil)
-
- var successArray: [URL]?
- successArray = document.extractPerPageDocument(withPages: extractPages, folerPath: filePath)
-
- DispatchQueue.main.async {
- if successArray!.count == 0 {
- callback(.failure)
- return
- }
- NSWorkspace.shared.activateFileViewerSelecting(successArray!)
- callback(.success, successArray ?? NSURL())
- }
- }
- }
- }
- }
- }
- }
|