Browse Source

PDFSamples(iOS)-bookmark 、outlineh和PDFToImage

yangliuhua 1 năm trước cách đây
mục cha
commit
8d0ff4228a
42 tập tin đã thay đổi với 987 bổ sung60 xóa
  1. 129 34
      ComPDFKit_Samples/ComPDFKit_Samples.xcodeproj/project.pbxproj
  2. 0 0
      Samples/Samples/AppDelegate.h
  3. 10 5
      ComPDFKit_Samples/ComPDFKit_Samples/AppDelegate.m
  4. 0 0
      Samples/Samples/Assets.xcassets/AccentColor.colorset/Contents.json
  5. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon1024x1024.png
  6. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20.png
  7. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20@2x 1.png
  8. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20@2x.png
  9. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20@3x.png
  10. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29.png
  11. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x 1.png
  12. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x.png
  13. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@3x.png
  14. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40.png
  15. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x 1.png
  16. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png
  17. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@3x.png
  18. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@2x.png
  19. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@3x.png
  20. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon76x76.png
  21. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon76x76@2x.png
  22. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon83.5x83.5@2x.png
  23. 0 0
      Samples/Samples/Assets.xcassets/AppIcon.appiconset/Contents.json
  24. 0 0
      Samples/Samples/Assets.xcassets/Contents.json
  25. 0 0
      Samples/Samples/Base.lproj/LaunchScreen.storyboard
  26. 0 0
      Samples/Samples/Base.lproj/Main.storyboard
  27. 6 4
      ComPDFKit_Samples/ComPDFKit_Samples/ViewController.h
  28. 151 0
      Samples/Samples/Bookmark/CBookmarkViewController.m
  29. 35 0
      Samples/Samples/ComPDFKit_Samples/CSamplesBaseViewController.h
  30. 55 0
      Samples/Samples/ComPDFKit_Samples/CSamplesBaseViewController.m
  31. 136 0
      Samples/Samples/ComPDFKit_Samples/CSamplesBaseViewController.xib
  32. 0 0
      Samples/Samples/Info.plist
  33. 20 0
      Samples/Samples/Outline/COutlineViewController.h
  34. 112 0
      Samples/Samples/Outline/COutlineViewController.m
  35. 21 0
      Samples/Samples/PDFToImage/CPDFToImageViewController.h
  36. 156 0
      Samples/Samples/PDFToImage/CPDFToImageViewController.m
  37. 0 0
      Samples/Samples/SceneDelegate.h
  38. 0 0
      Samples/Samples/SceneDelegate.m
  39. 42 0
      Samples/Samples/ViewController.h
  40. 69 17
      ComPDFKit_Samples/ComPDFKit_Samples/ViewController.m
  41. 0 0
      Samples/Samples/main.m
  42. 45 0
      TestFile/Blank Page.pdf

+ 129 - 34
ComPDFKit_Samples/ComPDFKit_Samples.xcodeproj/project.pbxproj

@@ -7,6 +7,14 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		C97699462A540D4200187038 /* CBookmarkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C97699452A540D4200187038 /* CBookmarkViewController.m */; };
+		C97699542A55162B00187038 /* COutlineViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C97699532A55162B00187038 /* COutlineViewController.m */; };
+		C976995A2A5534BF00187038 /* Form_Widgets_Test.pdf in Resources */ = {isa = PBXBuildFile; fileRef = C97699562A5534BF00187038 /* Form_Widgets_Test.pdf */; };
+		C976995B2A5534BF00187038 /* PDF32000_2008.pdf in Resources */ = {isa = PBXBuildFile; fileRef = C97699572A5534BF00187038 /* PDF32000_2008.pdf */; };
+		C976995C2A5534BF00187038 /* Blank Page.pdf in Resources */ = {isa = PBXBuildFile; fileRef = C97699582A5534BF00187038 /* Blank Page.pdf */; };
+		C976995D2A5534BF00187038 /* developer_guide_ios.pdf in Resources */ = {isa = PBXBuildFile; fileRef = C97699592A5534BF00187038 /* developer_guide_ios.pdf */; };
+		C97699612A5534D500187038 /* XMLReader.m in Sources */ = {isa = PBXBuildFile; fileRef = C97699602A5534D500187038 /* XMLReader.m */; };
+		C97699652A554F4800187038 /* CPDFToImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C97699642A554F4800187038 /* CPDFToImageViewController.m */; };
 		C9E361142A5273BC004D31BE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E361132A5273BC004D31BE /* AppDelegate.m */; };
 		C9E361172A5273BC004D31BE /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E361162A5273BC004D31BE /* SceneDelegate.m */; };
 		C9E3611A2A5273BC004D31BE /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E361192A5273BC004D31BE /* ViewController.m */; };
@@ -14,10 +22,11 @@
 		C9E3611F2A5273BF004D31BE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9E3611E2A5273BF004D31BE /* Assets.xcassets */; };
 		C9E361222A5273BF004D31BE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9E361202A5273BF004D31BE /* LaunchScreen.storyboard */; };
 		C9E361252A5273BF004D31BE /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E361242A5273BF004D31BE /* main.m */; };
-		C9E3612E2A52743B004D31BE /* XMLReader.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E3612D2A52743A004D31BE /* XMLReader.m */; };
 		C9E361302A52E506004D31BE /* license_key_ios.xml in Resources */ = {isa = PBXBuildFile; fileRef = C9E3612F2A52E506004D31BE /* license_key_ios.xml */; };
 		C9E361332A52E6CF004D31BE /* ComPDFKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9E361322A52E6CF004D31BE /* ComPDFKit.xcframework */; };
 		C9E361342A52E6CF004D31BE /* ComPDFKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C9E361322A52E6CF004D31BE /* ComPDFKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		C9E3613A2A53AD60004D31BE /* CSamplesBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E361382A53AD60004D31BE /* CSamplesBaseViewController.m */; };
+		C9E3613B2A53AD60004D31BE /* CSamplesBaseViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9E361392A53AD60004D31BE /* CSamplesBaseViewController.xib */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -35,7 +44,20 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		C9E3610F2A5273BC004D31BE /* ComPDFKit_Samples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ComPDFKit_Samples.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		C97699442A540D4200187038 /* CBookmarkViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CBookmarkViewController.h; sourceTree = "<group>"; };
+		C97699452A540D4200187038 /* CBookmarkViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CBookmarkViewController.m; sourceTree = "<group>"; };
+		C97699522A55162B00187038 /* COutlineViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = COutlineViewController.h; sourceTree = "<group>"; };
+		C97699532A55162B00187038 /* COutlineViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = COutlineViewController.m; sourceTree = "<group>"; };
+		C97699562A5534BF00187038 /* Form_Widgets_Test.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = Form_Widgets_Test.pdf; sourceTree = "<group>"; };
+		C97699572A5534BF00187038 /* PDF32000_2008.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = PDF32000_2008.pdf; sourceTree = "<group>"; };
+		C97699582A5534BF00187038 /* Blank Page.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "Blank Page.pdf"; sourceTree = "<group>"; };
+		C97699592A5534BF00187038 /* developer_guide_ios.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = developer_guide_ios.pdf; sourceTree = "<group>"; };
+		C976995F2A5534D500187038 /* XMLReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLReader.h; sourceTree = "<group>"; };
+		C97699602A5534D500187038 /* XMLReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLReader.m; sourceTree = "<group>"; };
+		C97699632A554F4800187038 /* CPDFToImageViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CPDFToImageViewController.h; sourceTree = "<group>"; };
+		C97699642A554F4800187038 /* CPDFToImageViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CPDFToImageViewController.m; sourceTree = "<group>"; };
+		C995A2E42A53FEAD00762127 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		C9E3610F2A5273BC004D31BE /* Samples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Samples.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		C9E361122A5273BC004D31BE /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
 		C9E361132A5273BC004D31BE /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
 		C9E361152A5273BC004D31BE /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = "<group>"; };
@@ -45,12 +67,12 @@
 		C9E3611C2A5273BC004D31BE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		C9E3611E2A5273BF004D31BE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		C9E361212A5273BF004D31BE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		C9E361232A5273BF004D31BE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		C9E361242A5273BF004D31BE /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		C9E3612C2A52743A004D31BE /* XMLReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLReader.h; sourceTree = "<group>"; };
-		C9E3612D2A52743A004D31BE /* XMLReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLReader.m; sourceTree = "<group>"; };
 		C9E3612F2A52E506004D31BE /* license_key_ios.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = license_key_ios.xml; path = ../license_key_ios.xml; sourceTree = "<group>"; };
 		C9E361322A52E6CF004D31BE /* ComPDFKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ComPDFKit.xcframework; path = ../Lib/ComPDFKit.xcframework; sourceTree = "<group>"; };
+		C9E361372A53AD60004D31BE /* CSamplesBaseViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSamplesBaseViewController.h; sourceTree = "<group>"; };
+		C9E361382A53AD60004D31BE /* CSamplesBaseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CSamplesBaseViewController.m; sourceTree = "<group>"; };
+		C9E361392A53AD60004D31BE /* CSamplesBaseViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CSamplesBaseViewController.xib; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -65,12 +87,69 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		C97699502A54F93200187038 /* Bookmark */ = {
+			isa = PBXGroup;
+			children = (
+				C97699442A540D4200187038 /* CBookmarkViewController.h */,
+				C97699452A540D4200187038 /* CBookmarkViewController.m */,
+			);
+			path = Bookmark;
+			sourceTree = "<group>";
+		};
+		C97699512A5515DF00187038 /* Outline */ = {
+			isa = PBXGroup;
+			children = (
+				C97699522A55162B00187038 /* COutlineViewController.h */,
+				C97699532A55162B00187038 /* COutlineViewController.m */,
+			);
+			path = Outline;
+			sourceTree = "<group>";
+		};
+		C97699552A5534BF00187038 /* TestFile */ = {
+			isa = PBXGroup;
+			children = (
+				C97699562A5534BF00187038 /* Form_Widgets_Test.pdf */,
+				C97699572A5534BF00187038 /* PDF32000_2008.pdf */,
+				C97699582A5534BF00187038 /* Blank Page.pdf */,
+				C97699592A5534BF00187038 /* developer_guide_ios.pdf */,
+			);
+			name = TestFile;
+			path = ../TestFile;
+			sourceTree = "<group>";
+		};
+		C976995E2A5534D500187038 /* XMLParse */ = {
+			isa = PBXGroup;
+			children = (
+				C976995F2A5534D500187038 /* XMLReader.h */,
+				C97699602A5534D500187038 /* XMLReader.m */,
+			);
+			name = XMLParse;
+			path = ../XMLParse;
+			sourceTree = "<group>";
+		};
+		C97699622A554F1000187038 /* PDFToImage */ = {
+			isa = PBXGroup;
+			children = (
+				C97699632A554F4800187038 /* CPDFToImageViewController.h */,
+				C97699642A554F4800187038 /* CPDFToImageViewController.m */,
+			);
+			path = PDFToImage;
+			sourceTree = "<group>";
+		};
+		C97699662A5566E800187038 /* TextSearch */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = TextSearch;
+			sourceTree = "<group>";
+		};
 		C9E361062A5273BC004D31BE = {
 			isa = PBXGroup;
 			children = (
+				C976995E2A5534D500187038 /* XMLParse */,
+				C97699552A5534BF00187038 /* TestFile */,
 				C9E3612F2A52E506004D31BE /* license_key_ios.xml */,
-				C9E3612B2A52743A004D31BE /* XMLParse */,
-				C9E361112A5273BC004D31BE /* ComPDFKit_Samples */,
+				C9E361112A5273BC004D31BE /* Samples */,
 				C9E361102A5273BC004D31BE /* Products */,
 				C9E361312A52E6CE004D31BE /* Frameworks */,
 			);
@@ -79,12 +158,12 @@
 		C9E361102A5273BC004D31BE /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				C9E3610F2A5273BC004D31BE /* ComPDFKit_Samples.app */,
+				C9E3610F2A5273BC004D31BE /* Samples.app */,
 			);
 			name = Products;
 			sourceTree = "<group>";
 		};
-		C9E361112A5273BC004D31BE /* ComPDFKit_Samples */ = {
+		C9E361112A5273BC004D31BE /* Samples */ = {
 			isa = PBXGroup;
 			children = (
 				C9E361122A5273BC004D31BE /* AppDelegate.h */,
@@ -93,39 +172,44 @@
 				C9E361162A5273BC004D31BE /* SceneDelegate.m */,
 				C9E361182A5273BC004D31BE /* ViewController.h */,
 				C9E361192A5273BC004D31BE /* ViewController.m */,
+				C9E361362A53ACDE004D31BE /* ComPDFKit_Samples */,
+				C97699512A5515DF00187038 /* Outline */,
+				C97699622A554F1000187038 /* PDFToImage */,
+				C97699502A54F93200187038 /* Bookmark */,
+				C97699662A5566E800187038 /* TextSearch */,
 				C9E3611B2A5273BC004D31BE /* Main.storyboard */,
 				C9E3611E2A5273BF004D31BE /* Assets.xcassets */,
+				C995A2E42A53FEAD00762127 /* Info.plist */,
 				C9E361202A5273BF004D31BE /* LaunchScreen.storyboard */,
-				C9E361232A5273BF004D31BE /* Info.plist */,
 				C9E361242A5273BF004D31BE /* main.m */,
 			);
-			path = ComPDFKit_Samples;
+			path = Samples;
 			sourceTree = "<group>";
 		};
-		C9E3612B2A52743A004D31BE /* XMLParse */ = {
+		C9E361312A52E6CE004D31BE /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				C9E3612C2A52743A004D31BE /* XMLReader.h */,
-				C9E3612D2A52743A004D31BE /* XMLReader.m */,
+				C9E361322A52E6CF004D31BE /* ComPDFKit.xcframework */,
 			);
-			name = XMLParse;
-			path = ../XMLParse;
+			name = Frameworks;
 			sourceTree = "<group>";
 		};
-		C9E361312A52E6CE004D31BE /* Frameworks */ = {
+		C9E361362A53ACDE004D31BE /* ComPDFKit_Samples */ = {
 			isa = PBXGroup;
 			children = (
-				C9E361322A52E6CF004D31BE /* ComPDFKit.xcframework */,
+				C9E361372A53AD60004D31BE /* CSamplesBaseViewController.h */,
+				C9E361382A53AD60004D31BE /* CSamplesBaseViewController.m */,
+				C9E361392A53AD60004D31BE /* CSamplesBaseViewController.xib */,
 			);
-			name = Frameworks;
+			path = ComPDFKit_Samples;
 			sourceTree = "<group>";
 		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
-		C9E3610E2A5273BC004D31BE /* ComPDFKit_Samples */ = {
+		C9E3610E2A5273BC004D31BE /* Samples */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = C9E361282A5273BF004D31BE /* Build configuration list for PBXNativeTarget "ComPDFKit_Samples" */;
+			buildConfigurationList = C9E361282A5273BF004D31BE /* Build configuration list for PBXNativeTarget "Samples" */;
 			buildPhases = (
 				C9E3610B2A5273BC004D31BE /* Sources */,
 				C9E3610C2A5273BC004D31BE /* Frameworks */,
@@ -136,9 +220,9 @@
 			);
 			dependencies = (
 			);
-			name = ComPDFKit_Samples;
+			name = Samples;
 			productName = ComPDFKit_Samples;
-			productReference = C9E3610F2A5273BC004D31BE /* ComPDFKit_Samples.app */;
+			productReference = C9E3610F2A5273BC004D31BE /* Samples.app */;
 			productType = "com.apple.product-type.application";
 		};
 /* End PBXNativeTarget section */
@@ -155,7 +239,7 @@
 					};
 				};
 			};
-			buildConfigurationList = C9E3610A2A5273BC004D31BE /* Build configuration list for PBXProject "ComPDFKit_Samples" */;
+			buildConfigurationList = C9E3610A2A5273BC004D31BE /* Build configuration list for PBXProject "Samples" */;
 			compatibilityVersion = "Xcode 14.0";
 			developmentRegion = en;
 			hasScannedForEncodings = 0;
@@ -168,7 +252,7 @@
 			projectDirPath = "";
 			projectRoot = "";
 			targets = (
-				C9E3610E2A5273BC004D31BE /* ComPDFKit_Samples */,
+				C9E3610E2A5273BC004D31BE /* Samples */,
 			);
 		};
 /* End PBXProject section */
@@ -178,8 +262,13 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				C976995B2A5534BF00187038 /* PDF32000_2008.pdf in Resources */,
 				C9E361222A5273BF004D31BE /* LaunchScreen.storyboard in Resources */,
 				C9E3611F2A5273BF004D31BE /* Assets.xcassets in Resources */,
+				C976995C2A5534BF00187038 /* Blank Page.pdf in Resources */,
+				C976995D2A5534BF00187038 /* developer_guide_ios.pdf in Resources */,
+				C976995A2A5534BF00187038 /* Form_Widgets_Test.pdf in Resources */,
+				C9E3613B2A53AD60004D31BE /* CSamplesBaseViewController.xib in Resources */,
 				C9E3611D2A5273BC004D31BE /* Main.storyboard in Resources */,
 				C9E361302A52E506004D31BE /* license_key_ios.xml in Resources */,
 			);
@@ -192,11 +281,15 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				C97699462A540D4200187038 /* CBookmarkViewController.m in Sources */,
 				C9E3611A2A5273BC004D31BE /* ViewController.m in Sources */,
+				C97699612A5534D500187038 /* XMLReader.m in Sources */,
 				C9E361142A5273BC004D31BE /* AppDelegate.m in Sources */,
-				C9E3612E2A52743B004D31BE /* XMLReader.m in Sources */,
 				C9E361252A5273BF004D31BE /* main.m in Sources */,
+				C97699652A554F4800187038 /* CPDFToImageViewController.m in Sources */,
+				C97699542A55162B00187038 /* COutlineViewController.m in Sources */,
 				C9E361172A5273BC004D31BE /* SceneDelegate.m in Sources */,
+				C9E3613A2A53AD60004D31BE /* CSamplesBaseViewController.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -272,7 +365,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 16.2;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_FAST_MATH = YES;
 				ONLY_ACTIVE_ARCH = YES;
@@ -324,7 +417,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 16.2;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				MTL_FAST_MATH = YES;
 				SDKROOT = iphoneos;
@@ -342,7 +435,8 @@
 				DEVELOPMENT_TEAM = 4GGQPGRTSV;
 				"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
 				GENERATE_INFOPLIST_FILE = YES;
-				INFOPLIST_FILE = ComPDFKit_Samples/Info.plist;
+				INFOPLIST_FILE = Samples/Info.plist;
+				INFOPLIST_KEY_CFBundleDisplayName = Samples_ComPDFKit;
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
 				INFOPLIST_KEY_UIMainStoryboardFile = Main;
@@ -354,7 +448,7 @@
 					"@executable_path/Frameworks",
 				);
 				MARKETING_VERSION = 1.0;
-				PRODUCT_BUNDLE_IDENTIFIER = "com.compdfkit.demo.ComPDFKit-Samples";
+				PRODUCT_BUNDLE_IDENTIFIER = com.compdfkit.pdfviewer;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_EMIT_LOC_STRINGS = YES;
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -371,7 +465,8 @@
 				DEVELOPMENT_TEAM = 4GGQPGRTSV;
 				"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
 				GENERATE_INFOPLIST_FILE = YES;
-				INFOPLIST_FILE = ComPDFKit_Samples/Info.plist;
+				INFOPLIST_FILE = Samples/Info.plist;
+				INFOPLIST_KEY_CFBundleDisplayName = Samples_ComPDFKit;
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
 				INFOPLIST_KEY_UIMainStoryboardFile = Main;
@@ -383,7 +478,7 @@
 					"@executable_path/Frameworks",
 				);
 				MARKETING_VERSION = 1.0;
-				PRODUCT_BUNDLE_IDENTIFIER = "com.compdfkit.demo.ComPDFKit-Samples";
+				PRODUCT_BUNDLE_IDENTIFIER = com.compdfkit.pdfviewer;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_EMIT_LOC_STRINGS = YES;
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -393,7 +488,7 @@
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
-		C9E3610A2A5273BC004D31BE /* Build configuration list for PBXProject "ComPDFKit_Samples" */ = {
+		C9E3610A2A5273BC004D31BE /* Build configuration list for PBXProject "Samples" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				C9E361262A5273BF004D31BE /* Debug */,
@@ -402,7 +497,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		C9E361282A5273BF004D31BE /* Build configuration list for PBXNativeTarget "ComPDFKit_Samples" */ = {
+		C9E361282A5273BF004D31BE /* Build configuration list for PBXNativeTarget "Samples" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				C9E361292A5273BF004D31BE /* Debug */,

ComPDFKit_Samples/ComPDFKit_Samples/AppDelegate.h → Samples/Samples/AppDelegate.h


+ 10 - 5
ComPDFKit_Samples/ComPDFKit_Samples/AppDelegate.m

@@ -68,18 +68,23 @@ static AppDelegate *appDelegate = NULL;
     self.window = window;
     self.window.backgroundColor = [UIColor whiteColor];
     
-    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"PDF32000_2008" ofType:@"pdf"];
+    NSString *filePathTest1 = [[NSBundle mainBundle] pathForResource:@"Blank Page" ofType:@"pdf"];
+    NSString *filePathTest2 = [[NSBundle mainBundle] pathForResource:@"PDF32000_2008" ofType:@"pdf"];
+    
     NSString *documentFolder = [NSHomeDirectory() stringByAppendingFormat:@"/%@/%@", @"Documents",@"Samples"];
 
     if (![[NSFileManager defaultManager] fileExistsAtPath:documentFolder])
         [[NSFileManager defaultManager] createDirectoryAtURL:[NSURL fileURLWithPath:documentFolder] withIntermediateDirectories:YES attributes:nil error:nil];
     
-    NSString * documentPath = [documentFolder stringByAppendingPathComponent:filePath.lastPathComponent];
-    if (![[NSFileManager defaultManager] fileExistsAtPath:documentPath])
-        [[NSFileManager defaultManager] copyItemAtURL:[NSURL fileURLWithPath:filePath] toURL:[NSURL fileURLWithPath:documentPath] error:nil];
+    NSString * documentPathTest1 = [documentFolder stringByAppendingPathComponent:filePathTest1.lastPathComponent];
+    if (![[NSFileManager defaultManager] fileExistsAtPath:documentPathTest1])
+        [[NSFileManager defaultManager] copyItemAtURL:[NSURL fileURLWithPath:filePathTest1] toURL:[NSURL fileURLWithPath:documentPathTest1] error:nil];
+    NSString * documentPathTest2 = [documentFolder stringByAppendingPathComponent:filePathTest2.lastPathComponent];
+    if (![[NSFileManager defaultManager] fileExistsAtPath:documentPathTest2])
+        [[NSFileManager defaultManager] copyItemAtURL:[NSURL fileURLWithPath:filePathTest2] toURL:[NSURL fileURLWithPath:documentPathTest2] error:nil];
     
     
-    ViewController *viewVC = [[ViewController alloc] init];
+    ViewController *viewVC = [[ViewController alloc] initWithFilePath:@[documentPathTest1, documentPathTest2] password:nil];
     UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:viewVC];
     self.window.rootViewController = navController;
     

ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AccentColor.colorset/Contents.json → Samples/Samples/Assets.xcassets/AccentColor.colorset/Contents.json


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon1024x1024.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon1024x1024.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20@2x 1.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20@2x 1.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20@2x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20@2x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20@3x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon20x20@3x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x 1.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x 1.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@3x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@3x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x 1.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x 1.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@3x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@3x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@2x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@2x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@3x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon60x60@3x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon76x76.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon76x76.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon76x76@2x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon76x76@2x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/AppIcon83.5x83.5@2x.png → Samples/Samples/Assets.xcassets/AppIcon.appiconset/AppIcon83.5x83.5@2x.png


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/AppIcon.appiconset/Contents.json → Samples/Samples/Assets.xcassets/AppIcon.appiconset/Contents.json


ComPDFKit_Samples/ComPDFKit_Samples/Assets.xcassets/Contents.json → Samples/Samples/Assets.xcassets/Contents.json


ComPDFKit_Samples/ComPDFKit_Samples/Base.lproj/LaunchScreen.storyboard → Samples/Samples/Base.lproj/LaunchScreen.storyboard


ComPDFKit_Samples/ComPDFKit_Samples/Base.lproj/Main.storyboard → Samples/Samples/Base.lproj/Main.storyboard


+ 6 - 4
ComPDFKit_Samples/ComPDFKit_Samples/ViewController.h

@@ -1,6 +1,6 @@
 //
-//  ViewController.h
-//  ComPDFKit_Samples
+//  CBookmarkViewController.h
+//  Samples
 //
 //  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
 //
@@ -10,10 +10,12 @@
 //  This notice may not be removed from this file.
 //
 
-#import <UIKit/UIKit.h>
+#import "CSamplesBaseViewController.h"
 
-@interface ViewController : UIViewController
+NS_ASSUME_NONNULL_BEGIN
 
+@interface CBookmarkViewController : CSamplesBaseViewController
 
 @end
 
+NS_ASSUME_NONNULL_END

+ 151 - 0
Samples/Samples/Bookmark/CBookmarkViewController.m

@@ -0,0 +1,151 @@
+//
+//  CBookmarkViewController.m
+//  Samples
+//
+//  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+//
+//  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+//  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+//  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+//  This notice may not be removed from this file.
+//
+
+#import "CBookmarkViewController.h"
+
+#import <ComPDFKit/ComPDFKit.h>
+
+//-----------------------------------------------------------------------------------------
+// The sample code illustrates how to create new bookmarks and use bookmark go to
+// the page using API.
+//-----------------------------------------------------------------------------------------
+
+@interface CBookmarkViewController ()
+
+@property (nonatomic, strong) CPDFDocument *document;
+
+@property (nonatomic, assign) BOOL isRun;
+
+@property (nonatomic, strong) NSString *commandLineStr;
+
+@property (nonatomic, strong) NSURL *bookmarkURL;
+
+@end
+
+@implementation CBookmarkViewController
+
+#pragma mark - UIViewController Methods
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    self.explainLabel.text = NSLocalizedString(@"The sample code illustrates how to create new bookmarks and use bookmark go to the page using API.", nil);
+    
+    self.commandLineTextView.text = @"";
+    self.isRun = NO;
+    self.commandLineStr = @"";
+}
+
+#pragma mark - Samples Methods
+
+// Create bookmark and go to page that had a bookmark
+- (void)createBookmark:(CPDFDocument *)document {
+    // Add bookmark
+    [document addBookmark:@"my bookmark" forPageIndex:1];
+    
+    // Go to page
+    if ([document bookmarkForPageIndex:1]) {
+        self.commandLineStr = [self.commandLineStr stringByAppendingString:@"Go to page 2\n"];
+    }
+      
+    // Save a document in Sandbox path
+    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
+    NSString *writeDirectoryPath = [NSString stringWithFormat:@"%@/%@", path, @"Bookmark"];
+    NSString *documentFolder = [NSHomeDirectory() stringByAppendingFormat:@"/%@/%@/%@.pdf", @"Documents",@"Samples",@"Blank Page"];
+    
+    // Copy file
+    if (![[NSFileManager defaultManager] fileExistsAtPath:writeDirectoryPath])
+        [[NSFileManager defaultManager] createDirectoryAtURL:[NSURL fileURLWithPath:writeDirectoryPath] withIntermediateDirectories:YES attributes:nil error:nil];
+    NSString *writeFilePath = [NSString stringWithFormat:@"%@/%@.pdf",writeDirectoryPath,@"CreateBookmarkTest"];
+    
+    if ([[NSFileManager defaultManager] fileExistsAtPath:documentFolder])
+        [[NSFileManager defaultManager] copyItemAtURL:[NSURL fileURLWithPath:documentFolder] toURL:[NSURL fileURLWithPath:writeFilePath] error:nil];
+    
+    // Save the document in the PDF file
+    self.bookmarkURL = [NSURL fileURLWithPath:writeFilePath];
+    [document writeToURL:self.bookmarkURL];
+     
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"Done.\n"];
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"Done. Results saved in CreateBookmarkTest.pdf\n"];
+}
+
+- (void)openFile {
+    UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:@[self.bookmarkURL] applicationActivities:nil];
+        activityVC.definesPresentationContext = YES;
+    if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {
+        activityVC.popoverPresentationController.sourceView = self.openfileButton;
+        activityVC.popoverPresentationController.sourceRect = self.openfileButton.bounds;
+    }
+    [self presentViewController:activityVC animated:YES completion:nil];
+    activityVC.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
+
+        if (completed) {
+            NSLog(@"Success!");
+        } else {
+            NSLog(@"Failed Or Canceled!");
+        }
+    };
+}
+
+#pragma mark - Action
+
+- (IBAction)buttonItemClick_openFile:(id)sender {
+    // Determine whether to export the document
+    if (self.isRun) {
+        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Choose a file to open...", nil) message:@"" preferredStyle:UIAlertControllerStyleActionSheet];
+        if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {
+            alertController.popoverPresentationController.sourceView = self.openfileButton;
+            alertController.popoverPresentationController.sourceRect = self.openfileButton.bounds;
+        }
+        
+        UIAlertAction *noAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"CreateBookmarkTest.pdf", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+            // Open CreateBookmarkTest.pdf
+            [self openFile];
+        }];
+        
+        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) style:UIAlertActionStyleCancel handler:nil];
+        
+        [alertController addAction:noAction];
+        [alertController addAction:cancelAction];
+        
+        [self presentViewController:alertController animated:NO completion:nil];
+    } else {
+        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Choose a file to open...", nil) message:@"" preferredStyle:UIAlertControllerStyleAlert];
+        if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {
+            alertController.popoverPresentationController.sourceView = self.openfileButton;
+            alertController.popoverPresentationController.sourceRect = self.openfileButton.bounds;
+        }
+        
+        UIAlertAction *noAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"No files for this sample.", nil) style:UIAlertActionStyleDefault handler:nil];
+        
+        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) style:UIAlertActionStyleCancel handler:nil];
+        
+        [alertController addAction:noAction];
+        [alertController addAction:cancelAction];
+        
+        [self presentViewController:alertController animated:NO completion:nil];
+    }
+}
+
+- (IBAction)buttonItemClick_run:(id)sender {
+    self.isRun = YES;
+    
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"Running Bookmark sample...\n\n"];
+    [self createBookmark:self.document];
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"\nDone!\n"];
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"-------------------------------------\n"];
+    
+    // Refresh commandline message
+    self.commandLineTextView.text = self.commandLineStr;
+}
+
+@end

+ 35 - 0
Samples/Samples/ComPDFKit_Samples/CSamplesBaseViewController.h

@@ -0,0 +1,35 @@
+//
+//  CSamplesBaseViewController.h
+//  ComPDFKit_Samples
+//
+//  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+//
+//  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+//  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+//  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+//  This notice may not be removed from this file.
+//
+
+#import "ViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class CPDFDocument;
+
+@interface CSamplesBaseViewController : UIViewController
+
+@property (weak, nonatomic) IBOutlet UIButton *openfileButton;
+
+@property (weak, nonatomic) IBOutlet UILabel *explainLabel;
+
+@property (weak, nonatomic) IBOutlet UITextView *commandLineTextView;
+
+- (IBAction)buttonItemClick_run:(id)sender;
+
+- (IBAction)buttonItemClick_openFile:(id)sender;
+
+- (instancetype)initWithDocument:(CPDFDocument *)document;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 55 - 0
Samples/Samples/ComPDFKit_Samples/CSamplesBaseViewController.m

@@ -0,0 +1,55 @@
+//
+//  CSamplesBaseViewController.m
+//  ComPDFKit_Samples
+//
+//  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+//
+//  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+//  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+//  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+//  This notice may not be removed from this file.
+//
+
+#import "CSamplesBaseViewController.h"
+
+#import <ComPDFKit/ComPDFKit.h>
+
+//-----------------------------------------------------------------------------------------
+// The UI, drawn using xib, is the base class for all samples classes
+//-----------------------------------------------------------------------------------------
+
+@interface CSamplesBaseViewController ()
+
+@property (nonatomic, strong) CPDFDocument *document;
+
+@end
+
+@implementation CSamplesBaseViewController
+
+#pragma mark - Initializers
+
+- (instancetype)initWithDocument:(CPDFDocument *)document {
+    self = [super initWithNibName:NSStringFromClass([self.superclass class]) bundle:nil];
+    
+    self.document = document;
+
+    return self;
+}
+
+
+#pragma mark - UIViewController Methods
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view from its nib.
+    
+}
+
+#pragma mark - Action
+
+- (IBAction)buttonItemClick_openFile:(id)sender {
+}
+
+- (IBAction)buttonItemClick_run:(id)sender {
+}
+@end

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 136 - 0
Samples/Samples/ComPDFKit_Samples/CSamplesBaseViewController.xib


ComPDFKit_Samples/ComPDFKit_Samples/Info.plist → Samples/Samples/Info.plist


+ 20 - 0
Samples/Samples/Outline/COutlineViewController.h

@@ -0,0 +1,20 @@
+//
+//  COutlineViewController.h
+//  Samples
+//
+//  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+//  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+//  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+//  This notice may not be removed from this file.
+//
+
+
+#import "CSamplesBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface COutlineViewController : CSamplesBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 112 - 0
Samples/Samples/Outline/COutlineViewController.m

@@ -0,0 +1,112 @@
+//
+//  COutlineViewController.m
+//  Samples
+//
+//  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+//  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+//  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+//  This notice may not be removed from this file.
+//
+
+
+#import "COutlineViewController.h"
+
+#import <ComPDFKit/ComPDFKit.h>
+
+//-----------------------------------------------------------------------------------------
+// The sample code illustrates how to obtain document outline information using API.
+//-----------------------------------------------------------------------------------------
+
+@interface COutlineViewController ()
+
+@property (nonatomic, strong) CPDFDocument *document;
+
+@property (nonatomic, assign) BOOL isRun;
+
+@property (nonatomic, strong) NSString *commandLineStr;
+
+@property (nonatomic, strong) NSURL *outlineURL;
+
+@end
+
+@implementation COutlineViewController
+
+#pragma mark - UIViewController Methods
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    self.explainLabel.text = NSLocalizedString(@"The sample code illustrates how to obtain document outline information using API.", nil);
+    
+    self.commandLineTextView.text = @"";
+    self.isRun = NO;
+    self.commandLineStr = @"";
+}
+
+#pragma mark - Samples Methods
+
+// Print document outline information
+-(void)printOutline:(CPDFDocument *)document {
+    // Get root from PDF document
+    CPDFOutline *outline = [document outlineRoot];
+    
+    // Get subdirectory from root
+    [self loadOutline:outline level:0];
+}
+
+// Get subdirectory from root
+- (void)loadOutline:(CPDFOutline *)outline level:(NSInteger)level {
+    
+    for (int i=0; i<[outline numberOfChildren]; i++) {
+        CPDFOutline *data = [outline childAtIndex:i];
+        CPDFDestination *destination = [data destination];
+        if (!destination) {
+            CPDFAction *action = [data action];
+            if (action && [action isKindOfClass:[CPDFGoToAction class]]) {
+                destination = [(CPDFGoToAction *)action destination];
+            }
+        }
+        
+        // The previous level directory will be one \t away from the previous level directory
+        NSString *intervalStr = @"";
+        for (int j = 0; j < level; j++) {
+            self.commandLineStr = [self.commandLineStr stringByAppendingString:@"\t"];
+        }
+        self.commandLineStr = [self.commandLineStr stringByAppendingFormat:@"%@->%@\n", intervalStr, data.label];
+
+        [self loadOutline:data level:level+1];
+    }
+}
+
+#pragma mark - Action
+
+- (IBAction)buttonItemClick_openFile:(id)sender {
+    
+    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Choose a file to open...", nil) message:@"" preferredStyle:UIAlertControllerStyleAlert];
+    if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {
+        alertController.popoverPresentationController.sourceView = self.openfileButton;
+        alertController.popoverPresentationController.sourceRect = self.openfileButton.bounds;
+    }
+    
+    UIAlertAction *noAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"No files for this sample.", nil) style:UIAlertActionStyleDefault handler:nil];
+    
+    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) style:UIAlertActionStyleCancel handler:nil];
+    
+    [alertController addAction:noAction];
+    [alertController addAction:cancelAction];
+    
+    [self presentViewController:alertController animated:NO completion:nil];
+}
+
+- (IBAction)buttonItemClick_run:(id)sender {
+    
+    // Create bookmark and go to the page
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"Running OutlineText sample...\n\n"];
+    [self printOutline:self.document];
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"\nDone!\n"];
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"-------------------------------------\n"];
+    self.commandLineTextView.text = self.commandLineStr;
+}
+
+@end

+ 21 - 0
Samples/Samples/PDFToImage/CPDFToImageViewController.h

@@ -0,0 +1,21 @@
+//
+//  CPDFToImageViewController.h
+//  Samples
+//
+//  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+//
+//  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+//  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+//  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+//  This notice may not be removed from this file.
+//
+
+#import "CSamplesBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CPDFToImageViewController : CSamplesBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 156 - 0
Samples/Samples/PDFToImage/CPDFToImageViewController.m

@@ -0,0 +1,156 @@
+//
+//  CPDFToImageViewController.m
+//  Samples
+//
+//  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+//
+//  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+//  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+//  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+//  This notice may not be removed from this file.
+//
+
+#import "CPDFToImageViewController.h"
+
+#import <ComPDFKit/ComPDFKit.h>
+
+//-----------------------------------------------------------------------------------------
+// The sample code illustrates how to PDF to picture using API.
+//-----------------------------------------------------------------------------------------
+
+@interface CPDFToImageViewController ()
+
+@property (nonatomic, strong) CPDFDocument *document;
+
+@property (nonatomic, assign) BOOL isRun;
+
+@property (nonatomic, strong) NSString *commandLineStr;
+
+@property (nonatomic, strong) NSMutableArray *imageFilePaths;
+
+@end
+
+@implementation CPDFToImageViewController
+
+#pragma mark - UIViewController Methods
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    self.explainLabel.text = NSLocalizedString(@"The sample code illustrates how to PDF PDF to picture using API.", nil);
+    
+    self.commandLineTextView.text = @"";
+    self.isRun = NO;
+    self.commandLineStr = @"";
+    
+    self.imageFilePaths = [NSMutableArray array];
+}
+
+#pragma mark - Samples Methods
+
+// PDF to picture and save the picture
+- (void)PDFToImage:(CPDFDocument *)document {
+    // Save a document in Sandbox
+    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
+    NSString *writeDirectoryPath = [NSString stringWithFormat:@"%@/%@", path, @"PDFToImage"];
+    
+    if (![[NSFileManager defaultManager] fileExistsAtPath:writeDirectoryPath])
+        [[NSFileManager defaultManager] createDirectoryAtURL:[NSURL fileURLWithPath:writeDirectoryPath] withIntermediateDirectories:YES attributes:nil error:nil];
+    
+//    Traverse the page, converting all pages to images
+    for (int i = 0; i < document.pageCount; i++) {
+        // Get image from page
+        CPDFPage *page = [document pageAtIndex:i];
+        CGSize pageSize = [document pageSizeAtIndex:i];
+        UIImage *image = [page thumbnailOfSize:pageSize];
+        
+        // Save image in Sandbox
+        NSString *imageFilePath = [writeDirectoryPath stringByAppendingFormat:@"/PDFToImageTest%d.png", i];
+        [self.imageFilePaths addObject:imageFilePath];
+        NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
+        BOOL success = [imageData writeToFile:imageFilePath atomically:YES];
+        
+        if (success) {
+            self.commandLineStr = [self.commandLineStr stringByAppendingString:@"Done.\n"];
+            self.commandLineStr = [self.commandLineStr stringByAppendingFormat:@"Done. Results saved in PDFToImageTest%d.png\n", i];
+        } else {
+            self.commandLineStr = [self.commandLineStr stringByAppendingString:@"Done.\n"];
+            self.commandLineStr = [self.commandLineStr stringByAppendingFormat:@"Done. Results saved in PDFToImageTest%d.png fail !\n", i];
+        }
+    }
+}
+
+- (void)openFile:(NSString *)imageFilePath {
+    UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:@[[NSURL fileURLWithPath:imageFilePath]] applicationActivities:nil];
+        activityVC.definesPresentationContext = YES;
+    if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {
+        activityVC.popoverPresentationController.sourceView = self.openfileButton;
+        activityVC.popoverPresentationController.sourceRect = self.openfileButton.bounds;
+    }
+    [self presentViewController:activityVC animated:YES completion:nil];
+    activityVC.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
+
+        if (completed) {
+            NSLog(@"Success!");
+        } else {
+            NSLog(@"Failed Or Canceled!");
+        }
+    };
+}
+
+#pragma mark - Action
+
+- (IBAction)buttonItemClick_openFile:(id)sender {
+    // Determine whether to export the document
+    if (self.isRun) {
+        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Choose a file to open...", nil) message:@"" preferredStyle:UIAlertControllerStyleActionSheet];
+        if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {
+            alertController.popoverPresentationController.sourceView = self.openfileButton;
+            alertController.popoverPresentationController.sourceRect = self.openfileButton.bounds;
+        }
+        
+        for (int i = 0; i < self.document.pageCount; i++) {
+            NSString *imageName = [NSString stringWithFormat:@"PDFToImageTest%d.png", i];
+            UIAlertAction *imageAction = [UIAlertAction actionWithTitle:NSLocalizedString(imageName, nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+                // Open CreateBookmarkTest.pdf
+                [self openFile:self.imageFilePaths[i]];
+            }];
+            [alertController addAction:imageAction];
+        }
+        
+        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) style:UIAlertActionStyleCancel handler:nil];
+        
+        [alertController addAction:cancelAction];
+        
+        [self presentViewController:alertController animated:NO completion:nil];
+    } else {
+        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Choose a file to open...", nil) message:@"" preferredStyle:UIAlertControllerStyleAlert];
+        if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {
+            alertController.popoverPresentationController.sourceView = self.openfileButton;
+            alertController.popoverPresentationController.sourceRect = self.openfileButton.bounds;
+        }
+        
+        UIAlertAction *noAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"No files for this sample.", nil) style:UIAlertActionStyleDefault handler:nil];
+        
+        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) style:UIAlertActionStyleCancel handler:nil];
+        
+        [alertController addAction:noAction];
+        [alertController addAction:cancelAction];
+        
+        [self presentViewController:alertController animated:NO completion:nil];
+    }
+}
+
+- (IBAction)buttonItemClick_run:(id)sender {
+    self.isRun = YES;
+    
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"Running Bookmark sample...\n\n"];
+    [self PDFToImage:self.document];
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"\nDone!\n"];
+    self.commandLineStr = [self.commandLineStr stringByAppendingString:@"-------------------------------------\n"];
+    // Refresh commandline message
+    self.commandLineTextView.text = self.commandLineStr;
+}
+
+@end

ComPDFKit_Samples/ComPDFKit_Samples/SceneDelegate.h → Samples/Samples/SceneDelegate.h


ComPDFKit_Samples/ComPDFKit_Samples/SceneDelegate.m → Samples/Samples/SceneDelegate.m


+ 42 - 0
Samples/Samples/ViewController.h

@@ -0,0 +1,42 @@
+//
+//  ViewController.h
+//  ComPDFKit_Samples
+//
+//  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+//
+//  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+//  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+//  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+//  This notice may not be removed from this file.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, CSamplesType)  {
+    CSamplesTypeBookmark = 0,
+    CSamplesTypeOutline,
+    CSamplesTypePDFToImage,
+    CSamplesTypeTextSearch,
+    CSamplesTypeAnnotation,
+    CSamplesTypeAnnotationImportExport,
+    CSamplesTypeInteractiveForms,
+    CSamplesTypePDFPage,
+    CSamplesTypeImageExtract,
+    CSamplesTypeTextExtract,
+    CSamplesTypeDocumentInfo,
+    CSamplesTypeWatermark,
+    CSamplesTypeBackground,
+    CSamplesTypeHeaderFooter,
+    CSamplesTypePDFBases,
+    CSamplesTypePDFRedact,
+    CSamplesTypeEncry,
+    CSamplesTypeFlattenedCopy,
+    CSamplesTypeDocumentCompare
+};
+
+@interface ViewController : UIViewController
+
+- (instancetype)initWithFilePath:(NSArray *)filePaths password:(NSString *)password;
+
+@end
+

+ 69 - 17
ComPDFKit_Samples/ComPDFKit_Samples/ViewController.m

@@ -12,39 +12,62 @@
 
 #import "ViewController.h"
 
+#import "CBookmarkViewController.h"
+#import "COutlineViewController.h"
+#import "CPDFToImageViewController.h"
+
+#import <ComPDFKit/ComPDFKit.h>
+
 @interface ViewController () <UITableViewDataSource, UITableViewDelegate>
 
+@property(nonatomic, strong) NSArray *filePaths;
+
+@property(nonatomic, strong) NSString *password;
+
 @property (nonatomic, strong) UITableView *tableView;
 
 @property (nonatomic, strong) NSArray *dataArray;
 
+@property (nonatomic, strong) CPDFDocument *document;
+
 @end
 
 @implementation ViewController
 
+#pragma mark - Initializers
+
+- (instancetype)initWithFilePath:(NSArray *)filePaths password:(NSString *)password {
+    if(self = [super init]) {
+        self.filePaths = filePaths;
+        self.password = password;
+    }
+    return self;
+}
+
 #pragma mark - Accessors
 
 - (NSArray *)dataArray {
-    return @[NSLocalizedString(@"HeaderFooter", nil),
-             NSLocalizedString(@"Watermark", nil),
-             NSLocalizedString(@"Bases", nil),
-             NSLocalizedString(@"Background", nil),
-             NSLocalizedString(@"FlattenedCopyTest", nil),
-             NSLocalizedString(@"AdvancedImaging", nil),
+    return @[NSLocalizedString(@"Bookmark", nil),
+             NSLocalizedString(@"Outline", nil),
+             NSLocalizedString(@"PDFToImage", nil),
+             NSLocalizedString(@"TextSearch", nil),
              NSLocalizedString(@"Annotation", nil),
-             NSLocalizedString(@"Bookmark", nil),
-             NSLocalizedString(@"Encry", nil),
-             NSLocalizedString(@"Highlights", nil),
-             NSLocalizedString(@"ImageExtract", nil),
-             NSLocalizedString(@"Imposition", nil),
+             NSLocalizedString(@"AnnotationImportExport", nil),
              NSLocalizedString(@"InteractiveForms", nil),
-             NSLocalizedString(@"PDFA", nil),
-             NSLocalizedString(@"PDFPackage", nil),
              NSLocalizedString(@"PDFPage", nil),
-             NSLocalizedString(@"PDFRedact", nil),
+             NSLocalizedString(@"ImageExtract", nil),
              NSLocalizedString(@"TextExtract", nil),
-             NSLocalizedString(@"TextSearch", nil),
-             NSLocalizedString(@"UnicodeWrite", nil)];
+             NSLocalizedString(@"DocumentInfo", nil),
+             NSLocalizedString(@"Watermark", nil),
+             NSLocalizedString(@"Background", nil),
+             NSLocalizedString(@"HeaderFooter", nil),
+             NSLocalizedString(@"Bases", nil),
+             NSLocalizedString(@"PDFRedact", nil),
+             NSLocalizedString(@"Encry", nil),
+             NSLocalizedString(@"PDFA", nil),
+             NSLocalizedString(@"FlattenedCopy", nil),
+             NSLocalizedString(@"DocumentCompare", nil)];
+    
 }
 
 #pragma mark - UIViewController Methods
@@ -65,6 +88,10 @@
     self.title = NSLocalizedString(@"Samples", nil);
     
     self.view.backgroundColor = [UIColor whiteColor];
+    
+    NSString *filePath = self.filePaths[0];
+    NSURL *url = [NSURL fileURLWithPath:filePath];
+    self.document = [[CPDFDocument alloc] initWithURL:url];
 }
 
 #pragma mark - UITableViewDataSource
@@ -87,7 +114,32 @@
 #pragma mark - UITableViewDelegate
 
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
-   
+    switch (indexPath.row) {
+        case CSamplesTypeBookmark:
+        {
+            CBookmarkViewController *bookmarkVC = [[CBookmarkViewController alloc] initWithDocument:self.document];
+            [self.navigationController pushViewController:bookmarkVC animated:NO];
+        }
+            break;
+        case CSamplesTypeOutline:
+        {
+            NSString *filePath = self.filePaths[1];
+            NSURL *url = [NSURL fileURLWithPath:filePath];
+            CPDFDocument *document = [[CPDFDocument alloc] initWithURL:url];
+            COutlineViewController *outlineVC = [[COutlineViewController alloc] initWithDocument:document];
+            [self.navigationController pushViewController:outlineVC animated:NO];
+        }
+            break;
+        case CSamplesTypePDFToImage:
+        {
+            CPDFToImageViewController *PDFToImageVC = [[CPDFToImageViewController alloc] initWithDocument:self.document];
+            [self.navigationController pushViewController:PDFToImageVC animated:NO];
+        }
+            break;
+            
+        default:
+            break;
+    }
 }
 
 @end

ComPDFKit_Samples/ComPDFKit_Samples/main.m → Samples/Samples/main.m


+ 45 - 0
TestFile/Blank Page.pdf

@@ -0,0 +1,45 @@
+%PDF-1.7
+%¡³Å×
+1 0 obj
+<</Pages 2 0 R /Type/Catalog>>
+endobj
+2 0 obj
+<</Count 5/Kids[ 4 0 R  5 0 R  8 0 R  7 0 R  6 0 R ]/Type/Pages>>
+endobj
+3 0 obj
+<</CreationDate(D:20230704151320)>>
+endobj
+4 0 obj
+<</MediaBox[ 0 0 595 842]/Parent 2 0 R /Resources<<>>/Rotate 0/Type/Page>>
+endobj
+5 0 obj
+<</MediaBox[ 0 0 595 842]/Parent 2 0 R /Resources<<>>/Rotate 0/Type/Page>>
+endobj
+6 0 obj
+<</MediaBox[ 0 0 595 842]/Parent 2 0 R /Resources<<>>/Rotate 0/Type/Page>>
+endobj
+7 0 obj
+<</MediaBox[ 0 0 595 842]/Parent 2 0 R /Resources<<>>/Rotate 0/Type/Page>>
+endobj
+8 0 obj
+<</MediaBox[ 0 0 595 842]/Parent 2 0 R /Resources<<>>/Rotate 0/Type/Page>>
+endobj
+xref
+0 9
+0000000000 65535 f
+0000000017 00000 n
+0000000066 00000 n
+0000000150 00000 n
+0000000204 00000 n
+0000000297 00000 n
+0000000390 00000 n
+0000000483 00000 n
+0000000576 00000 n
+trailer
+<<
+/Root 1 0 R
+/Info 3 0 R
+/Size 9/ID[<7800A4991AF561A4D70D3004F5E43166><7800A4991AF561A4D70D3004F5E43166>]>>
+startxref
+669
+%%EOF