Browse Source

Merge branch 'develop_PDFReaderProV4.6.0' into develop_PDFReaderProV4.6.0_appStore

tangchao 6 months ago
parent
commit
ab3e4ef0f3

BIN
PDF Office/PDF Master/Class/PDFWindowController/PDFSDK/ComPDFKit.framework/Versions/A/ComPDFKit


+ 4 - 0
PDF Office/PDF Master/Class/PDFWindowController/PDFSDK/ComPDFKit.framework/Versions/A/_CodeSignature/CodeResources

@@ -4,6 +4,10 @@
 <dict>
 	<key>files</key>
 	<dict>
+		<key>Resources/.DS_Store</key>
+		<data>
+		h8JtUfHSGJ7UtYRzanub3WwcwNY=
+		</data>
 		<key>Resources/Assets.car</key>
 		<data>
 		Lsv7/Q81njxGwXBA8bI9Dpf4F1w=

+ 1 - 1
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+UI.swift

@@ -181,7 +181,7 @@ extension KMMainViewController {
             return
         }
         DispatchQueue.main.async {
-            self.beginProgressSheet(withMessage: NSLocalizedString("Converting notes", comment: "Message for progress sheet").appending("..."), maxValue: 0)
+            self.beginProgressSheet(withMessage: "", maxValue: 0)
             
             let count = pdfDocument.pageCount
             DispatchQueue.global().async {

+ 80 - 8
PDF Office/PDF Master/Class/Purchase/DMG/KMEmbeddedPaymentPopWC.swift

@@ -8,12 +8,16 @@
 import Cocoa
 import WebKit
 
-class KMEmbeddedPaymentPopWC: NSWindowController {
+class KMEmbeddedPaymentPopWC: NSWindowController, WKNavigationDelegate {
 
+    @IBOutlet weak var mainView: NSView!
     @IBOutlet weak var webView: WKWebView!
     var urlPath: String?
+    var countryCode: String?
+    var postCode: String?
+    var isPaddle: Bool = false
     var callback: ((_ isClose: Bool) -> Void)?
-
+    
     static var currentWindowController: KMEmbeddedPaymentPopWC!
     
     @objc static func currentFirstTrialWC(_ urlPath: String) -> KMEmbeddedPaymentPopWC {
@@ -32,16 +36,84 @@ class KMEmbeddedPaymentPopWC: NSWindowController {
         super.windowDidLoad()
 
         // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
-
-        if urlPath != nil {
-            if let url = URL(string: urlPath!) {
-                let request = URLRequest(url: url)
-                webView.load(request)
+        
+        if isPaddle {
+            let blankHTML = """
+                <html>
+                <head></head>
+                <body style="background-color:white;"></body>
+                </html>
+            """
+            webView.navigationDelegate = self
+            webView.loadHTMLString(blankHTML, baseURL: URL(string: "https://cdn.paddle.com/paddle/paddle.js"))
+        } else {
+            if urlPath != nil {
+                if let url = URL(string: urlPath!) {
+                    let request = URLRequest(url: url)
+                    webView.load(request)
+                }
             }
         }
-        
         self.window?.delegate = self;
     }
+
+    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
+        print("WebView load error: \(error.localizedDescription)")
+    }
+    
+    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
+        if isPaddle {
+            if let url = navigationAction.request.url {
+                print("Navigating to URL: \(url)")
+                // 你可以根据 URL 判断是否是重定向页面,执行特定逻辑
+            }
+        }
+        decisionHandler(.allow)
+    }
+
+    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
+        if isPaddle {
+            if let localPaddleJsPath = Bundle.main.path(forResource: "paddle", ofType: "js") {
+                let localPaddleJsURL = URL(fileURLWithPath: localPaddleJsPath)
+                let paddleScript = generatePaddleScript(overrideUrl: localPaddleJsURL.absoluteString, countryCode: countryCode!, postCode: postCode!)
+                webView.evaluateJavaScript(paddleScript) { (result, error) in
+                    if let error = error {
+                        print("Error evaluating JavaScript: \(error.localizedDescription)")
+                    } else {
+                        print("JavaScript executed successfully")
+                    }
+                }
+            } else {
+                print("Paddle.js file not found in bundle")
+            }
+        }
+    }
+
+    func generatePaddleScript(overrideUrl: String, countryCode: String, postCode: String) -> String {
+        let script = """
+            var script = document.createElement('script');
+            script.src = 'https://cdn.paddle.com/paddle/paddle.js';
+            script.onload = function() {
+                try {
+                    Paddle.Setup({ vendor: 134050 });
+                    var overrideUrl = '\(urlPath!)';
+                    Paddle.Checkout.open({
+                        method: 'sdk', //隐藏弹窗的关闭按钮
+                        override: overrideUrl,
+                        country: '\(countryCode)',
+                        postcode: '\(postCode)',
+                    });
+                } catch (error) {
+                    console.log('Paddle setup or checkout error:', error);
+                }
+            };
+            script.onerror = function() {
+                console.log('Failed to load Paddle.js');
+            };
+            document.head.appendChild(script);
+            """
+        return script
+    }
 }
 
 extension KMEmbeddedPaymentPopWC: NSWindowDelegate {

+ 23 - 11
PDF Office/PDF Master/Class/Purchase/DMG/KMEmbeddedPaymentPopWC.xib

@@ -9,7 +9,8 @@
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="KMEmbeddedPaymentPopWC" customModule="PDF_Reader_Pro" customModuleProvider="target">
             <connections>
-                <outlet property="webView" destination="ZXG-fx-Xob" id="pg6-K6-G0P"/>
+                <outlet property="mainView" destination="ha1-rh-fVy" id="JMi-Dj-vmh"/>
+                <outlet property="webView" destination="xYX-Ie-8hw" id="0FR-Ky-hiP"/>
                 <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
             </connections>
         </customObject>
@@ -24,19 +25,30 @@
                 <rect key="frame" x="0.0" y="0.0" width="460" height="693"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
-                    <wkWebView wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZXG-fx-Xob">
+                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="ha1-rh-fVy">
                         <rect key="frame" x="0.0" y="0.0" width="460" height="693"/>
-                        <wkWebViewConfiguration key="configuration">
-                            <audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
-                            <wkPreferences key="preferences"/>
-                        </wkWebViewConfiguration>
-                    </wkWebView>
+                        <subviews>
+                            <wkWebView wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xYX-Ie-8hw">
+                                <rect key="frame" x="0.0" y="0.0" width="460" height="693"/>
+                                <wkWebViewConfiguration key="configuration">
+                                    <audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
+                                    <wkPreferences key="preferences"/>
+                                </wkWebViewConfiguration>
+                            </wkWebView>
+                        </subviews>
+                        <constraints>
+                            <constraint firstItem="xYX-Ie-8hw" firstAttribute="leading" secondItem="ha1-rh-fVy" secondAttribute="leading" id="Itd-UM-zZ8"/>
+                            <constraint firstAttribute="trailing" secondItem="xYX-Ie-8hw" secondAttribute="trailing" id="XDn-y3-Bms"/>
+                            <constraint firstAttribute="bottom" secondItem="xYX-Ie-8hw" secondAttribute="bottom" id="tGk-76-oqq"/>
+                            <constraint firstItem="xYX-Ie-8hw" firstAttribute="top" secondItem="ha1-rh-fVy" secondAttribute="top" id="tec-jh-YPH"/>
+                        </constraints>
+                    </customView>
                 </subviews>
                 <constraints>
-                    <constraint firstAttribute="bottom" secondItem="ZXG-fx-Xob" secondAttribute="bottom" id="BE4-bp-ev3"/>
-                    <constraint firstItem="ZXG-fx-Xob" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="SIB-XN-fnk"/>
-                    <constraint firstAttribute="trailing" secondItem="ZXG-fx-Xob" secondAttribute="trailing" id="bOm-Kw-vvs"/>
-                    <constraint firstItem="ZXG-fx-Xob" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="kRe-Hq-27O"/>
+                    <constraint firstAttribute="trailing" secondItem="ha1-rh-fVy" secondAttribute="trailing" id="1Fp-qg-7im"/>
+                    <constraint firstAttribute="bottom" secondItem="ha1-rh-fVy" secondAttribute="bottom" id="B9d-Z2-yJH"/>
+                    <constraint firstItem="ha1-rh-fVy" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="OxT-lh-s2T"/>
+                    <constraint firstItem="ha1-rh-fVy" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="jHn-wP-Tas"/>
                 </constraints>
             </view>
             <connections>

+ 48 - 60
PDF Office/PDF Master/Class/Purchase/DMG/KMPurchaseEmbeddedWindowController.swift

@@ -216,7 +216,8 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
     private var successfulPaymentsNumber = 0
     private var license1 = ""
     private var licenseAI1 = ""
-    
+    private var isApplyCoupon: Bool = false
+
     @objc static func currentFirstTrialWC(_ productId: String) -> KMPurchaseEmbeddedWindowController {
         if currentWindowController != nil {
             currentWindowController.productID = productId
@@ -520,11 +521,7 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
             alert.messageText = NSLocalizedString("Error Information", comment: "")
             alert.informativeText = NSLocalizedString("Please make sure your internet connection is available.", comment: "")
             alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
-            if alert.responds(to: #selector(alert.beginSheetModal(for:completionHandler:))) {
-                alert.beginSheetModal(for: self.window!, completionHandler: nil)
-            } else {
-                alert.runModal()
-            }
+            alert.runModal()
             return
         }
         
@@ -773,7 +770,11 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
             couponView.isHidden = false
         } else {
             discountView.isHidden = false
-            couponView.isHidden = true
+            if self.discountScale == "" && self.discountAmount == "" {
+                couponView.isHidden = true
+            } else {
+                couponView.isHidden = false
+            }
         }
         discountLayoutConstraint.constant = discountView.isHidden ? -CGRectGetHeight(discountView.bounds) : 8
     }
@@ -935,11 +936,7 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
             alert.messageText = NSLocalizedString("Error Information", comment: "")
             alert.informativeText = NSLocalizedString("Please enter a coupon code.", comment: "")
             alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
-            if alert.responds(to: #selector(alert.beginSheetModal(for:completionHandler:))) {
-                alert.beginSheetModal(for: self.window!, completionHandler: nil)
-            } else {
-                alert.runModal()
-            }
+            alert.runModal()
             return
         }
         self.refreshCouponError(isReveal: false)
@@ -1063,16 +1060,6 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
         
     @IBAction func buyAction(_ sender: NSButton) {
         if emailTextField.stringValue == "" {
-//            let alert = NSAlert()
-//            alert.alertStyle = .critical
-//            alert.messageText = NSLocalizedString("Connection Error", comment: "")
-//            alert.informativeText = NSLocalizedString("The email address is empty.", comment: "")
-//            alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
-//            if alert.responds(to: #selector(alert.beginSheetModal(for:completionHandler:))) {
-//                alert.beginSheetModal(for: self.window!, completionHandler: nil)
-//            } else {
-//                alert.runModal()
-//            }
             emailErrorLabel(isReveal: true)
             return
         }
@@ -1083,11 +1070,8 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
                 alert.messageText = NSLocalizedString("Error Information", comment: "")
                 alert.informativeText = NSLocalizedString("Please enter the correct postcode.", comment: "")
                 alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
-                if alert.responds(to: #selector(alert.beginSheetModal(for:completionHandler:))) {
-                    alert.beginSheetModal(for: self.window!, completionHandler: nil)
-                } else {
-                    alert.runModal()
-                }
+                alert.runModal()
+
                 return
             }
         }
@@ -1103,16 +1087,16 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
             weChatBox.fillColor = NSColor(named: "KMPurchaseBoxColor1") ?? NSColor.blue
         }
         DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
-            guard let self = self else { return }
-            if self.paymentMethod == .paypal {
-                self.paypalBox.fillColor = NSColor(named: "KMPurchaseBoxColor") ?? NSColor.blue
-            } else if self._paymentMethod == .paddle {
-                self.paddleView.wantsLayer = true
-                self.paddleView.layer?.backgroundColor = NSColor(named: "KMPurchaseBoxColor")?.cgColor ?? NSColor.blue.cgColor
-            } else if self._paymentMethod == .wxpay {
-                self.weChatBox.fillColor = NSColor(named: "KMPurchaseBoxColor") ?? NSColor.blue
-            } else if self._paymentMethod == .alipay {
-                self.weChatBox.fillColor = NSColor(named: "KMPurchaseBoxColor") ?? NSColor.blue
+            guard let strongSelf = self else { return }
+            if strongSelf.paymentMethod == .paypal {
+                strongSelf.paypalBox.fillColor = NSColor(named: "KMPurchaseBoxColor") ?? NSColor.blue
+            } else if strongSelf.paymentMethod == .paddle {
+                strongSelf.paddleView.wantsLayer = true
+                strongSelf.paddleView.layer?.backgroundColor = NSColor(named: "KMPurchaseBoxColor")?.cgColor ?? NSColor.blue.cgColor
+            } else if strongSelf.paymentMethod == .wxpay {
+                strongSelf.weChatBox.fillColor = NSColor(named: "KMPurchaseBoxColor") ?? NSColor.blue
+            } else if strongSelf.paymentMethod == .alipay {
+                strongSelf.weChatBox.fillColor = NSColor(named: "KMPurchaseBoxColor") ?? NSColor.blue
             }
         }
 
@@ -1126,11 +1110,8 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
                 alert.messageText = NSLocalizedString("Error Information", comment: "")
                 alert.informativeText = NSLocalizedString("Input license code previously activated the app", comment: "")
                 alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
-                if alert.responds(to: #selector(alert.beginSheetModal(for:completionHandler:))) {
-                    alert.beginSheetModal(for: self.window!, completionHandler: nil)
-                } else {
-                    alert.runModal()
-                }
+                alert.runModal()
+
                 return
             }
             if let license = VerificationManager.default().originLicenseCode, license.count > 0 {
@@ -1144,12 +1125,13 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
         self._buyProduct(productID, count: pdfCount, discountId: couponCode, payment: paymentMethod, license: licenseCode, email: emailTextField.stringValue) { [weak self] info, err in
             guard let self = self else { return }
             if err != nil {
-                let alert = NSAlert()
-                alert.alertStyle = .critical
-                alert.messageText = NSLocalizedString("Please check if the information is wrong or the network is error.", comment: "")
-                alert.addButton(withTitle: NSLocalizedString("Yes", comment: ""))
-                alert.runModal()
-                
+                DispatchQueue.main.async {
+                    let alert = NSAlert()
+                    alert.alertStyle = .critical
+                    alert.messageText = NSLocalizedString("Please check if the information is wrong or the network is error.", comment: "")
+                    alert.addButton(withTitle: NSLocalizedString("Yes", comment: ""))
+                    alert.runModal()
+                }
                 return
             }
             if let dataInfo = info {
@@ -1166,11 +1148,13 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
                 }
             } else {
                 // 数据错误
-                let alert = NSAlert()
-                alert.alertStyle = .critical
-                alert.messageText = NSLocalizedString("Please check if the information is wrong or the network is error.", comment: "")
-                alert.addButton(withTitle: NSLocalizedString("Yes", comment: ""))
-                alert.runModal()
+                DispatchQueue.main.async {
+                    let alert = NSAlert()
+                    alert.alertStyle = .critical
+                    alert.messageText = NSLocalizedString("Please check if the information is wrong or the network is error.", comment: "")
+                    alert.addButton(withTitle: NSLocalizedString("Yes", comment: ""))
+                    alert.runModal()
+                }
             }
         }
     }
@@ -1486,6 +1470,11 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
             guard let self = self else { return }
 //            let wc = KMEmbeddedPaymentPopWC.init(windowNibName: "KMEmbeddedPaymentPopWC")
             self.embeddedPaymentPopWC = KMEmbeddedPaymentPopWC.currentFirstTrialWC(urlPath)
+            if self.paymentMethod == .paddle {
+                self.embeddedPaymentPopWC?.isPaddle = true
+                self.embeddedPaymentPopWC?.countryCode = self.countryAbbreviationValues[self.paddlePopUpButton.indexOfSelectedItem]
+                self.embeddedPaymentPopWC?.postCode = self.paddleTextField.stringValue
+            }
             self.embeddedPaymentPopWC?.showWindow(nil)
             self.embeddedPaymentPopWC?.callback = { isClose in
 //                let alert = NSAlert()
@@ -1742,13 +1731,11 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
         let infoDic = ["cdkey": license]
         VerificationManager.default().activateDevice(withInfo: infoDic) { status, info, error in
             if error != nil {
-                let alert = NSAlert()
-                alert.alertStyle = .critical
-                alert.messageText = NSLocalizedString("Activation Error", comment: "")
-                alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
-                if alert.responds(to: #selector(alert.beginSheetModal(for:completionHandler:))) {
-                    alert.beginSheetModal(for: self.window!, completionHandler: nil)
-                } else {
+                DispatchQueue.main.async {
+                    let alert = NSAlert()
+                    alert.alertStyle = .critical
+                    alert.messageText = NSLocalizedString("Activation Error", comment: "")
+                    alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
                     alert.runModal()
                 }
                 return
@@ -1818,6 +1805,7 @@ class KMPurchaseEmbeddedWindowController: NSWindowController {
             addButton1.isEnabled = true
             aiAddOnButton1.isEnabled = true
             extendedButton1.isEnabled = true
+            coupomTextField.isEnabled = true
             couponButton.isEnabled = true
             emailTextField.isEnabled = true
             licenseCodeTextField.isEnabled = true

File diff suppressed because it is too large
+ 1 - 0
PDF Office/PDF Master/Class/Purchase/DMG/paddle.js


BIN
PDF Office/PDF Master/Third Pard Library/Sparkle/PDFReaderPro_v4.6.0.dmg


+ 8 - 8
PDF Office/PDF Master/Third Pard Library/Sparkle/pdfreaderprocast.xml

@@ -6,23 +6,23 @@
     <description>Most recent changes with links to updates.</description>
     <language>en</language>
       <item>
-        <title>Version 4.1.0(202408060)</title>
+        <title>Version 4.6.0(202409130)</title>
         <description>
             <![CDATA[
             <ul>
                 <h3>Welcome you to the all-in-one PDF Reader Pro, fully compatible with macOS Sonoma to fulfill all your document needs! it's just like a great Mac app. </h3>
-                <li>New text editing tools: Support precise alignment of multiple text boxes and multiple images; Apply bold and italic formatting to the text.</li>
-                <li>Optimise image editing: Customize image rotation angles.</li>
-                <li>Optimise the interactive experience of content editing, fast editing of text and images.</li>
+                <li>Measure PDF: Annotate dimensions directly within a PDF like distance, perimeters, areas and angle.</li>
+                <li>Replace Text: Replace existing text with new content within the document.</li>
+                <li>Add Bookmarks: Support inserting bookmarks to your PDF and navigating via bookmarks.</li>
                 <li>Optimizations improve stability and compatibility and enhance user experience.</li>
                 <h4>NOTE: The latest version is only compatible with macOS 11.0 and above. MacOS 10+ users should update with caution!</h4>
-                <h4>Have any feedback or issues? Please drop a line at support@pdfreaderpro.com</h4>
+                <h4>PDF Reader Pro powered by ComPDFKit. Have any feedback, comments, or issues? Please drop a line at support@pdfreaderpro.com</h4>
             </ul>
             ]]>
         </description>
-        <pubDate>Tue, 6 Aug 2024 15:20:11 +0000</pubDate>
-        <enclosure url="https://www.pdfreaderpro.com/downloads/PDFReaderPro_v4.1.0.dmg" sparkle:version="202408060" length="167541959" type="application/octet-stream" sparkle:dsaSignature="MEUCIQCW5r1CKAxx2ElikwBWmHD6tga/UK1f5zSAeRJ6Mjjz8QIgJdNoTgJulxER
-TO7dGUuppgs5Aqhq74z5CJJsRA9uaL0="/>
+        <pubDate>Fri, 13 Sep 2024 15:20:11 +0000</pubDate>
+        <enclosure url="https://www.pdfreaderpro.com/downloads/PDFReaderPro_v4.6.0.dmg" sparkle:version="202409130" length="176115906" type="application/octet-stream" sparkle:dsaSignature="MEUCIQCgViuM0HyrfhjQVfAc5wHQRowEBNNieBNrH4lI1MYL6QIgXLdRz1BSE7AZ
+L0o66AekLCQOgYzYmeWJHtkrEuVG+wI="/>
       </item>
   </channel>
 </rss>

+ 8 - 8
PDF Office/PDF Master/Third Pard Library/Sparkle/pdfreaderprocast_zh_Hans.xml

@@ -6,23 +6,23 @@
     <description>Most recent changes with links to updates.</description>
     <language>en</language>
       <item>
-        <title>Version 4.1.0(202408060)</title>
+        <title>Version 4.6.0(202409130)</title>
         <description>
             <![CDATA[
             <ul>
                 <h3>PDF Reader Pro全面兼容macOS Sonoma,强大的PDF编辑工具全面提升您的效率!</h3>
-                <li>新增文字编辑功能:支持多个文本框和多张图片的精确对齐;  为文字添加粗体和斜体效果。</li>
-                <li>新增图片编辑功能: 支持自定义图片旋转角度。</li>
-                <li>优化内容编辑交互体验,快速编辑文本和图片。</li>
+                <li>测量PDF: 标注PDF中物体的尺寸,如距离、周长、面积和角度。</li>
+                <li>替换文本:快速替换PDF文档中的文本内容。</li>
+                <li>新增书签:支持为特定页面插入书签,并利用书签导航。</li>
                 <li>其他细节优化提高app稳定性和兼容性,提升用户体验。</li>
                 <h4>注意:最新版本仅兼容MacOS 11.0以上的系统,MacOS 10+ 用户谨慎更新。</h4>
-                <h4>任何问题,请随时联系:support@pdfreaderpro.com</h4>
+                <h4>PDF Reader Pro由ComPDFKit提供技术支持。您的任何建议、反馈都将成为我们优化PDF Reader Pro的最佳动力,请随时联系:support@pdfreaderpro.com</h4>
             </ul>
             ]]>
         </description>
-        <pubDate>Tue, 6 Aug 2024 15:20:11 +0000</pubDate>
-        <enclosure url="https://www.pdfreaderpro.com/downloads/PDFReaderPro_v4.1.0.dmg" sparkle:version="202408060" length="167541959" type="application/octet-stream" sparkle:dsaSignature="MEUCIQCW5r1CKAxx2ElikwBWmHD6tga/UK1f5zSAeRJ6Mjjz8QIgJdNoTgJulxER
-TO7dGUuppgs5Aqhq74z5CJJsRA9uaL0="/>
+        <pubDate>Fri, 13 Sep 2024 15:20:11 +0000</pubDate>
+        <enclosure url="https://www.pdfreaderpro.com/downloads/PDFReaderPro_v4.6.0.dmg" sparkle:version="202409130" length="176115906" type="application/octet-stream" sparkle:dsaSignature="MEUCIQCgViuM0HyrfhjQVfAc5wHQRowEBNNieBNrH4lI1MYL6QIgXLdRz1BSE7AZ
+L0o66AekLCQOgYzYmeWJHtkrEuVG+wI="/>
       </item>
   </channel>
 </rss>

+ 8 - 8
PDF Office/PDF Master/Third Pard Library/Sparkle/pdfreaderprocast_zh_Hant.xml

@@ -6,23 +6,23 @@
     <description>Most recent changes with links to updates.</description>
     <language>en</language>
       <item>
-        <title>Version 4.1.0(202408060)</title>
+        <title>Version 4.6.0(202409130)</title>
         <description>
             <![CDATA[
             <ul>
                 <h3>PDF Reader Pro全面兼容macOS Sonoma,强大的PDF編輯工具全面提升您的效率!</h3>
-                <li>新增文字編輯功能:支援多個文字方塊和多張圖片的精確對齊; 為文字添加粗體和斜體效果。</li>
-                <li>新增圖片編輯功能: 支援自訂圖片旋轉角度</li>
-                <li>優化內容編輯互動體驗,快速編輯文字和圖片</li>
+                <li>測量PDF:標註PDF中物體的尺寸,如距離、周長、面積和角度。</li>
+                <li>替換文本:快速替換PDF文件中的文字內容。</li>
+                <li>新增書籤:支援為特定頁面插入書籤,並利用書籤導航。</li>
                 <li>其他細節優化提升app穩定性和相容性,提升使用者體驗。</li>
                 <h4>注意:最新版本僅支援 MacOS 11.0 以上的系統,MacOS 10+ 用戶請慎重更新。</h4>
-                <h4>如有任何問題,請隨時聯係:support@pdfreaderpro.com</h4>
+                <h4>PDF Reader Pro由ComPDFKit提供技術支持。您的任何建議,反饋都將成爲我們優化PDF Reader Pro的最佳動力,請隨時聯係:support@pdfreaderpro.com</h4>
             </ul>
             ]]>
         </description>
-        <pubDate>Tue, 6 Aug 2024 15:20:11 +0000</pubDate>
-        <enclosure url="https://www.pdfreaderpro.com/downloads/PDFReaderPro_v4.1.0.dmg" sparkle:version="202408060" length="167541959" type="application/octet-stream" sparkle:dsaSignature="MEUCIQCW5r1CKAxx2ElikwBWmHD6tga/UK1f5zSAeRJ6Mjjz8QIgJdNoTgJulxER
-TO7dGUuppgs5Aqhq74z5CJJsRA9uaL0="/>
+        <pubDate>Fri, 13 Sep 2024 15:20:11 +0000</pubDate>
+        <enclosure url="https://www.pdfreaderpro.com/downloads/PDFReaderPro_v4.6.0.dmg" sparkle:version="202409130" length="176115906" type="application/octet-stream" sparkle:dsaSignature="MEUCIQCgViuM0HyrfhjQVfAc5wHQRowEBNNieBNrH4lI1MYL6QIgXLdRz1BSE7AZ
+L0o66AekLCQOgYzYmeWJHtkrEuVG+wI="/>
       </item>
   </channel>
 </rss>

+ 8 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -1185,6 +1185,9 @@
 		9FDD0FBA295D5230000C4DAD /* KMToolbarController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9FDD0FB6295D5230000C4DAD /* KMToolbarController.xib */; };
 		9FDD0FBB295D5230000C4DAD /* KMToolbarController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9FDD0FB6295D5230000C4DAD /* KMToolbarController.xib */; };
 		9FDD0FBC295D5230000C4DAD /* KMToolbarController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9FDD0FB6295D5230000C4DAD /* KMToolbarController.xib */; };
+		9FDDFDBF2C93E4DD0051B6FC /* paddle.js in Resources */ = {isa = PBXBuildFile; fileRef = 9FDDFDBE2C93E4DC0051B6FC /* paddle.js */; };
+		9FDDFDC02C93E4DD0051B6FC /* paddle.js in Resources */ = {isa = PBXBuildFile; fileRef = 9FDDFDBE2C93E4DC0051B6FC /* paddle.js */; };
+		9FDDFDC12C93E4DD0051B6FC /* paddle.js in Resources */ = {isa = PBXBuildFile; fileRef = 9FDDFDBE2C93E4DC0051B6FC /* paddle.js */; };
 		9FE0BBDE2B0E009F00CD1CAC /* KMColorPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE0BBDD2B0E009F00CD1CAC /* KMColorPickerView.swift */; };
 		9FE0BBDF2B0E009F00CD1CAC /* KMColorPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE0BBDD2B0E009F00CD1CAC /* KMColorPickerView.swift */; };
 		9FE0BBE02B0E009F00CD1CAC /* KMColorPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE0BBDD2B0E009F00CD1CAC /* KMColorPickerView.swift */; };
@@ -5999,6 +6002,7 @@
 		9FDD0FB129534FEA000C4DAD /* KMGlobal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMGlobal.swift; sourceTree = "<group>"; };
 		9FDD0FB5295D5230000C4DAD /* KMToolbarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMToolbarController.swift; sourceTree = "<group>"; };
 		9FDD0FB6295D5230000C4DAD /* KMToolbarController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMToolbarController.xib; sourceTree = "<group>"; };
+		9FDDFDBE2C93E4DC0051B6FC /* paddle.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = paddle.js; sourceTree = "<group>"; };
 		9FE0BBDD2B0E009F00CD1CAC /* KMColorPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMColorPickerView.swift; sourceTree = "<group>"; };
 		9FE0BBE22B0EFBA300CD1CAC /* KMAnnotationFontWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAnnotationFontWindowController.swift; sourceTree = "<group>"; };
 		9FE0BBE32B0EFBA300CD1CAC /* KMAnnotationFontWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMAnnotationFontWindowController.xib; sourceTree = "<group>"; };
@@ -13429,6 +13433,7 @@
 				9F3A48C42C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.xib */,
 				9F0ACC022C883464009574D5 /* KMEmbeddedPaymentPopWC.swift */,
 				9F0ACC032C883464009574D5 /* KMEmbeddedPaymentPopWC.xib */,
+				9FDDFDBE2C93E4DC0051B6FC /* paddle.js */,
 				BB183DD72B4EBDD300F99C7E /* Verification */,
 			);
 			path = DMG;
@@ -14925,6 +14930,7 @@
 				BB46CF482AFB7E5C00281EDF /* InitialUserDefaults.plist in Resources */,
 				ADD5AE592A64DD2600C14249 /* KMPurchaseAlertView.xib in Resources */,
 				BBD8EE902B8EC86900EB05FE /* AutoSavePopController.xib in Resources */,
+				9FDDFDBF2C93E4DD0051B6FC /* paddle.js in Resources */,
 				BB031B812C47BB090099F7AD /* KMUserFbListHeaderItemView.xib in Resources */,
 				BB7F7C0029AA586800A3E4E7 /* signAdd.png in Resources */,
 				AD58F4052B14954B00299EE0 /* KMCompareTextHeaderView.xib in Resources */,
@@ -15507,6 +15513,7 @@
 				BB04FD112B206F4000D80F7B /* KMPlanViewController.xib in Resources */,
 				BBB376AB2B10A7FD009539CC /* a_3a.png in Resources */,
 				BB5E2EFD2C2BF3FF00657A61 /* KMEditPDFCropComfirmWindowController.xib in Resources */,
+				9FDDFDC02C93E4DD0051B6FC /* paddle.js in Resources */,
 				BB90E4EB2AF347A700B04B9F /* PreferenceWindow.xib in Resources */,
 				9FBA0EF228FFC716001117AF /* KMHomeFastToolViewController.xib in Resources */,
 				BBFA1CDF2B60DC0C0053AD4A /* KMScreenShotMaskViewController.xib in Resources */,
@@ -16044,6 +16051,7 @@
 				BBBE20912B2164CD00509C4E /* KMPDFEditWindowController.xib in Resources */,
 				ADDF83642B391A5C00A81A4E /* DSignatureFromFileViewController.xib in Resources */,
 				BB4EEF3229763EE7003A3537 /* KMRedactBaseWindowController.xib in Resources */,
+				9FDDFDC12C93E4DD0051B6FC /* paddle.js in Resources */,
 				BB031B832C47BB090099F7AD /* KMUserFbListHeaderItemView.xib in Resources */,
 				9F853A0A2947137500DF644E /* newtab.pdf in Resources */,
 				AD85D1892AEF46DF000F4D28 /* KMHomeNOFileView.xib in Resources */,