123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- //
- // KMBatchImageToPDFView.swift
- // PDF Reader Pro
- //
- // Created by lizhe on 2025/1/15.
- //
- import Cocoa
- import KMComponentLibrary
- class KMBatchImageToPDFView: KMBatchSettingItemView {
- @IBOutlet weak var titleLabel: NSTextField!
- @IBOutlet weak var titleContentView: NSView!
-
- @IBOutlet weak var subTitleLabel: NSTextField!
- @IBOutlet weak var newPDFDocumentButton: ComponentRadio!
- @IBOutlet weak var mergeAllButton: ComponentCheckBox!
- @IBOutlet weak var appendToFileButton: ComponentRadio!
- @IBOutlet weak var selectFileInputButton: ComponentInput!
- @IBOutlet weak var selectFileInputAddonButton: ComponentInputAddon!
-
- @IBOutlet weak var textRecognitionSettingLabel: NSTextField!
- @IBOutlet weak var recognizeTextButton: ComponentCheckBox!
- @IBOutlet weak var languageSelectButton: ComponentSelect!
-
- @IBOutlet weak var lineView: ComponentDivider!
-
- @IBOutlet weak var OCRPlan1Button: ComponentRadio!
- @IBOutlet weak var OCRPlan1ButtonWidthConstraint: NSLayoutConstraint!
- @IBOutlet weak var OCRPlan2Button: ComponentRadio!
- @IBOutlet weak var OCRPlan2ButtonWidthConstraint: NSLayoutConstraint!
- @IBOutlet weak var extractTextButton: ComponentCheckBox!
-
- @IBOutlet weak var applyButton: ComponentButton!
-
- var model: KMBatchImageToPDFModel = KMBatchImageToPDFModel()
- var selectIndex = 0
- var password: String = ""
-
- override func draw(_ dirtyRect: NSRect) {
- super.draw(dirtyRect)
- // Drawing code here.
- }
-
- override func updateUILanguage() {
- self.subTitleLabel.stringValue = KMLocalizedString("Output")
- self.newPDFDocumentButton.properties.text = KMLocalizedString("New PDF Document")
- self.newPDFDocumentButton.reloadData()
-
- self.mergeAllButton.properties.text = KMLocalizedString("Merge All")
- self.mergeAllButton.reloadData()
-
- self.appendToFileButton.properties.text = KMLocalizedString("Append to Existing File")
- self.appendToFileButton.reloadData()
-
- self.textRecognitionSettingLabel.stringValue = KMLocalizedString("Text Recognition Settings")
-
- self.recognizeTextButton.properties.text = KMLocalizedString("Recognize text if needed")
- self.recognizeTextButton.reloadData()
-
- self.OCRPlan1Button.properties.text = KMLocalizedString("OCR Plan 1 (Online)")
- self.OCRPlan1Button.toolTip = KMLocalizedString("The OCR service works via an internet connection. We would suggest you to perform OCR using a VPN connection while the service is limited.")
- self.OCRPlan1Button.reloadData()
- self.OCRPlan1ButtonWidthConstraint.constant = self.OCRPlan1Button.properties.propertyInfo.viewWidth
-
-
- self.OCRPlan2Button.properties.text = KMLocalizedString("OCR Plan 2 (Offline)")
- self.OCRPlan2Button.toolTip = KMLocalizedString("The OCR service works via an internet connection. We would suggest you to perform OCR using a VPN connection while the service is limited.")
- self.OCRPlan2Button.reloadData()
- self.OCRPlan2ButtonWidthConstraint.constant = self.OCRPlan2Button.properties.propertyInfo.viewWidth
-
- self.extractTextButton.properties.text = KMLocalizedString("Extract Text (.txt)")
- self.extractTextButton.reloadData()
-
- self.applyButton.properties.buttonText = KMLocalizedString("Apply")
-
- }
-
- override func updateUIThemeColor() {
- self.titleContentView.border(ComponentLibrary.shared.getComponentColorFromKey("colorBorder/divider"), 0.5, 0)
-
- titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-medium")
- titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
-
- subTitleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
- subTitleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
-
- textRecognitionSettingLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
- textRecognitionSettingLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
- }
-
- override func setup() {
-
- self.newPDFDocumentButton.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: false, checkboxType: .normal)
- self.newPDFDocumentButton.setTarget(self, action: #selector(newPDFDocumentButtonAction))
- self.mergeAllButton.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: false,checkboxType: .normal)
- self.mergeAllButton.setTarget(self, action: #selector(mergeAllButtonAction))
- self.appendToFileButton.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: false, checkboxType: .normal)
- self.appendToFileButton.setTarget(self, action: #selector(appendToFileButtonAction))
- self.recognizeTextButton.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: false, checkboxType: .normal)
- self.recognizeTextButton.setTarget(self, action: #selector(OCRButtonAction))
- let inputWithAddonProperty = ComponentInputProperty(size: .s,
- state: .normal,
- isError: false,
- showPrefix: false,
- showSuffix: false,
- showClear: false,
- isDisabled: true,
- placeholder: KMLocalizedString("Select File..."),
- text: "",
- creatable: false)
- selectFileInputButton.properties = inputWithAddonProperty
- selectFileInputButton.properties.propertyInfo.cornerRadius_topRight = 0
- selectFileInputButton.properties.propertyInfo.cornerRadius_bottomRight = 0
- selectFileInputButton.properties.isDisabled = true
- selectFileInputButton.reloadData()
- selectFileInputAddonButton.properties = ComponentInputAddonProperty(size: .s,
- state: .normal,
- addOnBefore: false,
- onlyRead: false,
- addonType: .imageWithColor,
- iconImage: NSImage(named: "KMFolderIcon"))
- selectFileInputAddonButton.properties.isDisabled = true
- selectFileInputAddonButton.reloadData()
- selectFileInputAddonButton.setTarget(self, action: #selector(addFilesButtonAction))
- self.languageSelectButton.properties = ComponentSelectProperties(size: .s, state: .normal, isDisabled: false, isError: false, leftIcon: false, placeholder: nil, errorText: nil, creatable: false, text: KMLocalizedString("", comment: ""))
- self.languageSelectButton.delegate = self
- self.OCRPlan1Button.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: true, text: KMLocalizedString("OCR Plan 1 (Online)"), checkboxType: .normal)
- OCRPlan1Button.setTarget(self, action: #selector(OCRPlan1ButtonAction))
- self.OCRPlan1Button.reloadData()
- self.OCRPlan1ButtonWidthConstraint.constant = self.OCRPlan1Button.properties.propertyInfo.viewWidth
- self.OCRPlan2Button.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: true, text: KMLocalizedString("OCR Plan 2 (Offline)"), checkboxType: .normal)
- OCRPlan2Button.setTarget(self, action: #selector(OCRPlan2ButtonAction))
- self.OCRPlan2Button.reloadData()
- self.OCRPlan2ButtonWidthConstraint.constant = self.OCRPlan2Button.properties.propertyInfo.viewWidth
- self.extractTextButton.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: false, checkboxType: .normal)
- extractTextButton.setTarget(self, action: #selector(extractTextButtonAction))
- applyButton.properties = ComponentButtonProperty(type: .primary, size: .m, showRightIcon: true, keepPressState: false)
- applyButton.setTarget(self, action: #selector(saveButtonClicked(_:)))
-
- self.lineView.properties = ComponentDividerProperty()
-
- super.setup()
- }
-
- override func reloadData() {
- self.updateLanguages()
-
- self.newPDFDocumentButton.properties.checkboxType = self.model.isNewPDF ? .selected : .normal
- self.newPDFDocumentButton.reloadData()
- self.mergeAllButton.properties.isDisabled = !self.model.isNewPDF
- self.mergeAllButton.reloadData()
-
- self.appendToFileButton.properties.checkboxType = self.model.isAppendToExistingFile ? .selected : .normal
- self.appendToFileButton.reloadData()
- self.selectFileInputButton.properties.isDisabled = !self.model.isAppendToExistingFile
- self.selectFileInputButton.reloadData()
- self.selectFileInputAddonButton.properties.isDisabled = !self.model.isAppendToExistingFile
- self.selectFileInputAddonButton.reloadData()
-
- self.languageSelectButton.properties.isDisabled = !self.model.isOCR
- self.languageSelectButton.reloadData()
-
- if self.model.ocrType == .google {
- self.OCRPlan1Button.properties.checkboxType = .selected
- self.OCRPlan2Button.properties.checkboxType = .normal
- } else if self.model.ocrType == .apple {
- self.OCRPlan1Button.properties.checkboxType = .normal
- self.OCRPlan2Button.properties.checkboxType = .selected
- }
- self.OCRPlan1Button.properties.isDisabled = !self.model.isOCR
- self.OCRPlan1Button.reloadData()
-
- self.OCRPlan2Button.properties.isDisabled = !self.model.isOCR
- self.OCRPlan2Button.reloadData()
-
- self.extractTextButton.properties.isDisabled = !self.model.isOCR
- self.extractTextButton.reloadData()
-
-
- languageSelectButton.selectItemAtIndex(self.selectIndex)
-
-
- }
-
- func updateLanguages() {
- var menuItemArr: [ComponentMenuitemProperty] = []
- var languages: [String] = KMOCRManager.manager.getLanguages(type: model.ocrType)
-
- languages.insert(KMLocalizedString("Auto Detection"), at: 0)
- for language in languages {
- let itemProperty: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
- itemSelected: false,
- isDisabled: false,
- keyEquivalent: nil,
- text: language, identifier: "1")
- menuItemArr.append(itemProperty)
- }
-
- languageSelectButton.updateMenuItemsArr(menuItemArr)
-
- let position = languages.firstIndex(of: model.language) ?? 0
- self.selectIndex = position
- }
- }
- extension KMBatchImageToPDFView: ComponentSelectDelegate {
- func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
- if (view == languageSelectButton) {
- var languages: [String] = KMOCRManager.manager.getLanguages(type: model.ocrType)
- let position = languages.firstIndex(of: model.language) ?? 0
- self.selectIndex = position + 1
-
- let values: [String: String] = KMGOCRManager.languages()[position] as? [String : String] ?? [:]
- let key = values[KMGOCRLanguageCodeKey]
-
- model.language = key ?? ""
- if let unwrappedKey = key, let intValue = Int(unwrappedKey) {
- model.languageType = COCRLanguage(rawValue: intValue) ?? .english
- } else {
- print("转换失败")
- }
- }
- }
- }
- //MARK: Action
- extension KMBatchImageToPDFView {
- @objc func saveButtonClicked(_ sender: ComponentButton) {
- self.model.selectFilePath = self.selectFileInputButton.properties.text
-
- guard let callBack = self.batchExport else { return }
-
- callBack(self, model)
- }
-
- func addFilesButtonAction() {
- let openPanel = NSOpenPanel()
- openPanel.allowedFileTypes = ["pdf"]
- openPanel.canChooseDirectories = false
- openPanel.allowsMultipleSelection = false
- openPanel.beginSheetModal(for: self.window!) { (result) in
- if result == .OK {
- guard let url = openPanel.url else { return }
- guard let document = CPDFDocument(url: url) else {
- let alert = NSAlert()
- alert.alertStyle = .critical
- alert.messageText = KMLocalizedString("An error occurred while opening this document. The file is damaged and could not be repaired.", comment: "")
- alert.runModal()
- return
- }
- if !document.allowsCopying || !document.allowsPrinting {
- let alert = NSAlert()
- alert.alertStyle = .critical
- alert.messageText = KMLocalizedString("This is a secured document. Editing is not permitted.", comment: "")
- alert.runModal()
- return
- }
-
- if document.isLocked {
- KMBaseWindowController.checkPassword(url: url, type: .owner) { [weak self] success, resultPassword in
- if success {
- self?.password = resultPassword
-
- self?.selectFileInputButton.properties.text = url.path
- self?.selectFileInputButton.reloadData()
- }
- }
- } else {
- self.selectFileInputButton.properties.text = url.path
- self.selectFileInputButton.reloadData()
- }
- }
- }
- }
-
- func newPDFDocumentButtonAction() {
- self.model.isNewPDF = !self.model.isNewPDF
- self.model.isAppendToExistingFile = !self.model.isNewPDF
- self.reloadData()
- }
-
- func mergeAllButtonAction() {
- self.model.isMergeAll = !self.model.isMergeAll
- self.reloadData()
- }
-
- func appendToFileButtonAction() {
- self.model.isAppendToExistingFile = !self.model.isAppendToExistingFile
- self.model.isNewPDF = !self.model.isAppendToExistingFile
- self.reloadData()
- }
-
- func OCRButtonAction() {
- self.model.isOCR = !self.model.isOCR
- self.reloadData()
- }
-
- func OCRPlan1ButtonAction() {
- self.model.ocrType = .google
- self.reloadData()
- }
-
- func OCRPlan2ButtonAction() {
- self.model.ocrType = .apple
- self.reloadData()
- }
-
- func extractTextButtonAction() {
- self.model.isExtractText = !self.model.isExtractText
- self.reloadData()
- }
- }
|