Program.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO.Compression;
  4. using UglyToad.PdfPig;
  5. if (args.Length != 2)
  6. {
  7. Console.WriteLine("Err: 2 args required, <inputDir> <outputDir>");
  8. return 1;
  9. }
  10. var inputDir = args[0];
  11. var outputDir = args[1];
  12. if (!Directory.Exists(inputDir))
  13. {
  14. Console.WriteLine("Err: inputDir dose not exist");
  15. return 1;
  16. }
  17. if (!Directory.Exists(outputDir))
  18. {
  19. Console.WriteLine("Err: outputDir dose not exist");
  20. return 1;
  21. }
  22. Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Idle;
  23. var fullInputDir = Path.GetFullPath(inputDir);
  24. var fullOutputDir = Path.GetFullPath(outputDir);
  25. var filePathsToProcess = Directory.GetFiles(fullInputDir);
  26. var signatureJpg = new byte[] { 0xFF, 0xD8, 0xFF };
  27. var signatureZlib = new byte[] { 0x78, 0x9C };
  28. void ProcessFunc(string inputFilePath)
  29. {
  30. var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(inputFilePath);
  31. var folderName = fileNameWithoutExtension.EndsWith("PDF", StringComparison.InvariantCultureIgnoreCase)
  32. ? fileNameWithoutExtension
  33. : fileNameWithoutExtension + " PDF";
  34. var outputFileDir = Path.Combine(fullOutputDir, folderName);
  35. if (Directory.Exists(outputFileDir) == false)
  36. {
  37. lock (Console.Out) Console.WriteLine("Create dir: " + outputFileDir);
  38. Directory.CreateDirectory(outputFileDir);
  39. }
  40. var pdfBytes = File.ReadAllBytes(inputFilePath);
  41. var parsingOptions = new ParsingOptions();
  42. if (fileNameWithoutExtension.Contains("--pw-"))
  43. {
  44. parsingOptions.Password = fileNameWithoutExtension.Split("--pw-").Last();
  45. }
  46. using var document = PdfDocument.Open(pdfBytes, parsingOptions);
  47. var pages = document.GetPages().ToArray();
  48. for (var pageIndex = 0; pageIndex < pages.Length; pageIndex++)
  49. {
  50. var page = pages[pageIndex];
  51. var images = page.GetImages().ToArray();
  52. for (var imageIndex = 0; imageIndex < images.Length; imageIndex++)
  53. {
  54. var image = images[imageIndex];
  55. var outputFileName = $"P{pageIndex + 1:0000}_{imageIndex + 1:000}";
  56. if (image.TryGetPng(out var bytes))
  57. {
  58. var finalOutputPath = Path.Combine(outputFileDir, outputFileName + ".png");
  59. if (File.Exists(finalOutputPath))
  60. {
  61. Console.WriteLine($"SKIP {finalOutputPath}");
  62. continue;
  63. }
  64. File.WriteAllBytes(finalOutputPath, bytes);
  65. Console.WriteLine($"SAVE {finalOutputPath}");
  66. }
  67. else if (image.TryGetBytes(out var irlBytes))
  68. {
  69. var finalOutputPath = Path.Combine(outputFileDir, outputFileName + ".bin");
  70. if (File.Exists(finalOutputPath))
  71. {
  72. Console.WriteLine($"SKIP {finalOutputPath}");
  73. continue;
  74. }
  75. File.WriteAllBytes(finalOutputPath, bytes);
  76. Console.WriteLine($"SAVE {finalOutputPath}");
  77. }
  78. else
  79. {
  80. bytes = image.RawBytes.ToArray();
  81. var span = (ReadOnlySpan<byte>)bytes;
  82. var extName = ".bin";
  83. //de zlib
  84. if (span.Length > signatureZlib.Length && span.StartsWith(signatureZlib))
  85. {
  86. using var inMs = new MemoryStream(bytes);
  87. using var decStream = new ZLibStream(inMs, CompressionMode.Decompress);
  88. using var outMs = new MemoryStream();
  89. decStream.CopyTo(outMs);
  90. bytes = outMs.ToArray();
  91. span = (ReadOnlySpan<byte>)bytes;
  92. }
  93. if (span.Length > signatureJpg.Length && span.StartsWith(signatureJpg))
  94. {
  95. extName = ".jpg";
  96. }
  97. else
  98. {
  99. int bp = 0;
  100. }
  101. var finalOutputPath = Path.Combine(outputFileDir, outputFileName + extName);
  102. if (File.Exists(finalOutputPath))
  103. {
  104. Console.WriteLine($"SKIP {finalOutputPath}");
  105. continue;
  106. }
  107. File.WriteAllBytes(finalOutputPath, bytes);
  108. Console.WriteLine($"SAVE {finalOutputPath}");
  109. }
  110. }
  111. }
  112. }
  113. Parallel.ForEach(filePathsToProcess, ProcessFunc);
  114. // for debug
  115. //foreach (var s in filePathsToProcess) ProcessFunc(s);
  116. return 0;