HomePagePictureToPDFDialogViewModel.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. using PDF_Office.Model;
  2. using Prism.Commands;
  3. using System.Data;
  4. using Prism.Mvvm;
  5. using Prism.Services.Dialogs;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Windows.Forms;
  10. using System.IO;
  11. using System.Diagnostics;
  12. using PDF_Office.CustomControl;
  13. using System.Windows;
  14. using PDF_Office.Helper;
  15. using PDF_Office.Model.Dialog.HomePageToolsDialogs;
  16. using ComPDFKit.PDFDocument;
  17. using System.Drawing;
  18. using DialogResult = Prism.Services.Dialogs.DialogResult;
  19. namespace PDF_Office.ViewModels.Dialog.HomePageToolsDialogs
  20. {
  21. public class HomePagePictureToPDFDialogViewModel : BindableBase, IDialogAware
  22. {
  23. #region 参数和属性
  24. private List<string> fileNames;
  25. private int fileNamesIndex = 0;
  26. private int FileNameNumber = 0;
  27. public List<int> fileNamesView = new List<int>();
  28. public HomePagePictureToPDFDialogModel pictureToPDFModel=new HomePagePictureToPDFDialogModel();
  29. private string pictureToPDFGridIsEnabled = "True";
  30. public string PictureToPDFGridIsEnabled
  31. {
  32. get
  33. {
  34. return pictureToPDFGridIsEnabled;
  35. }
  36. set
  37. {
  38. SetProperty(ref pictureToPDFGridIsEnabled, value);
  39. }
  40. }
  41. private string setPictureToPDFGridIsEnabled = "True";
  42. public string SetPictureToPDFGridIsEnabled
  43. {
  44. get
  45. {
  46. return setPictureToPDFGridIsEnabled;
  47. }
  48. set
  49. {
  50. SetProperty(ref setPictureToPDFGridIsEnabled, value);
  51. }
  52. }
  53. private DataTable imagesDataTable = new DataTable();
  54. public DataTable ImagesDataTable
  55. {
  56. get { return imagesDataTable; }
  57. set
  58. {
  59. SetProperty(ref imagesDataTable, value);
  60. }
  61. }
  62. private DataTable imagesCurrentDataTable = new DataTable();
  63. public DataTable ImagesCurrentDataTable
  64. {
  65. get { return imagesCurrentDataTable; }
  66. set
  67. {
  68. SetProperty(ref imagesCurrentDataTable, value);
  69. }
  70. }
  71. private string removeIsEnable = "False";
  72. public string RemoveIsEnable
  73. {
  74. get { return removeIsEnable; }
  75. set
  76. {
  77. SetProperty(ref removeIsEnable, value);
  78. }
  79. }
  80. private string selectFileName = "False";
  81. public string SelectFileName
  82. {
  83. get { return selectFileName; }
  84. set
  85. {
  86. SetProperty(ref selectFileName, value);
  87. }
  88. }
  89. private Visibility addFileVisibility = Visibility.Hidden;
  90. public Visibility AddFileVisibility
  91. {
  92. get { return addFileVisibility; }
  93. set
  94. {
  95. SetProperty(ref addFileVisibility, value);
  96. RaisePropertyChanged();
  97. }
  98. }
  99. #endregion
  100. #region 委托声明
  101. public DelegateCommand ToPDFCommand { get; set; }
  102. public DelegateCommand ADDPictureCommand { get; set; }
  103. public DelegateCommand ADDPictureFilesCommand { get; set; }
  104. public DelegateCommand RemovePictureFileCommand { get; set; }
  105. public DelegateCommand SelectFileCommand { get; set; }
  106. #endregion
  107. public HomePagePictureToPDFDialogViewModel()
  108. {
  109. ToPDFCommand = new DelegateCommand(topdf);
  110. ADDPictureCommand = new DelegateCommand(addpicture);
  111. ADDPictureFilesCommand = new DelegateCommand(addpicturefiles);
  112. RemovePictureFileCommand = new DelegateCommand(removepicturefile);
  113. SelectFileCommand = new DelegateCommand(selectFile);
  114. ImagesDataTable.Columns.Add("FileName");
  115. ImagesDataTable.Columns.Add("FileSize");
  116. ImagesDataTable.Columns.Add("FileState");
  117. ImagesCurrentDataTable.Columns.Add("FileState");
  118. }
  119. #region 逻辑函数
  120. private void topdf() {
  121. PictureToPDFGridIsEnabled = "False";
  122. if (pictureToPDFModel.Mode == HomePagePictureToPDFDialogModel.ToPDFFileMode.NewFiles)
  123. {
  124. fileNamesIndex = 0;
  125. foreach (var filename in fileNames)
  126. {
  127. ImagesDataTable.Rows[fileNamesIndex]["FileState"] = "准备转换";
  128. ImagesCurrentDataTable.Rows[fileNamesIndex]["FileState"] = "准备转换";
  129. Image img = Image.FromFile(filename);
  130. if (img == null)
  131. {
  132. ImagesDataTable.Rows[fileNamesIndex]["FileState"] = "文件出错";
  133. ImagesCurrentDataTable.Rows[fileNamesIndex]["FileState"] = "文件出错";
  134. continue;
  135. }
  136. CPDFDocument topdfdoc = CPDFDocument.CreateDocument();
  137. FileInfo fileinfo = new FileInfo(filename);
  138. JpegInsertPage(ref topdfdoc, filename, fileinfo,img.Width,img.Height);
  139. Trace.WriteLine("Path.GetTempPath():" + Path.GetTempPath());
  140. topdfdoc.WriteToFilePath(savefilename(filename));
  141. topdfdoc.Release();
  142. string file_size = (((float)fileinfo.Length) / 1024).ToString() + " K";
  143. ImagesDataTable.Rows[fileNamesIndex]["FileState"] = "完成";
  144. ImagesCurrentDataTable.Rows[fileNamesIndex]["FileState"] = "完成";
  145. fileNamesIndex++;
  146. }
  147. System.Diagnostics.Process.Start("Explorer", "/select," + savefilename(fileNames[0]));
  148. }
  149. if (pictureToPDFModel.Mode == HomePagePictureToPDFDialogModel.ToPDFFileMode.OneNewFile)
  150. {
  151. CPDFDocument topdfdoc = CPDFDocument.CreateDocument();
  152. int pageindex = 0;
  153. foreach (var filename in fileNames) {
  154. ImagesDataTable.Rows[fileNamesIndex]["FileState"] = "准备转换";
  155. ImagesCurrentDataTable.Rows[fileNamesIndex]["FileState"] = "准备转换";
  156. Image img = Image.FromFile(filename);
  157. if (img == null)
  158. {
  159. ImagesDataTable.Rows[fileNamesIndex]["FileState"] = "文件出错";
  160. ImagesCurrentDataTable.Rows[fileNamesIndex]["FileState"] = "文件出错";
  161. continue;
  162. }
  163. FileInfo fileinfo = new FileInfo(filename);
  164. JpegInsertPage(ref topdfdoc, filename, fileinfo,img.Width, img.Height, pageindex);
  165. pageindex++;
  166. string file_size = (((float)fileinfo.Length) / 1024).ToString() + " K";
  167. ImagesDataTable.Rows[fileNamesIndex]["FileState"] = "完成";
  168. ImagesCurrentDataTable.Rows[fileNamesIndex]["FileState"] = "完成";
  169. fileNamesIndex++;
  170. }
  171. System.Diagnostics.Process.Start("Explorer", "/select," + savefilename(fileNames[0]));
  172. topdfdoc.WriteToFilePath(savefilename(fileNames[0]));
  173. topdfdoc.Release();
  174. }
  175. if (pictureToPDFModel.Mode == HomePagePictureToPDFDialogModel.ToPDFFileMode.SelectFileName)
  176. {
  177. CPDFDocument topdfdoc =CPDFDocument.InitWithFilePath(pictureToPDFModel.FilePath);
  178. if (topdfdoc == null)
  179. {
  180. Trace.WriteLine("Document==null");
  181. //TODO
  182. MessageBoxEx.Show("文档为空");
  183. return;
  184. }
  185. if (topdfdoc.IsEncrypted)
  186. {
  187. Trace.WriteLine("youmima");
  188. MessageBoxEx.Show("文档加密");
  189. //TODO
  190. return;
  191. }
  192. int pageindex = topdfdoc.PageCount;
  193. foreach (var filename in fileNames)
  194. {
  195. ImagesDataTable.Rows[fileNamesIndex]["FileState"] = "准备转换";
  196. ImagesCurrentDataTable.Rows[fileNamesIndex]["FileState"] = "准备转换";
  197. Image img = Image.FromFile(filename);
  198. if (img == null)
  199. {
  200. ImagesDataTable.Rows[fileNamesIndex]["FileState"] = "文件出错";
  201. ImagesCurrentDataTable.Rows[fileNamesIndex]["FileState"] = "文件出错";
  202. continue;
  203. }
  204. FileInfo fileinfo = new FileInfo(filename);
  205. JpegInsertPage(ref topdfdoc, filename, fileinfo, img.Width, img.Height, pageindex);
  206. pageindex++;
  207. string file_size = (((float)fileinfo.Length) / 1024).ToString() + " K";
  208. ImagesDataTable.Rows[fileNamesIndex]["FileState"] = "完成";
  209. ImagesCurrentDataTable.Rows[fileNamesIndex]["FileState"] = "完成";
  210. fileNamesIndex++;
  211. }
  212. topdfdoc.WriteToLoadedPath();
  213. System.Diagnostics.Process.Start("Explorer", "/select," + topdfdoc.FilePath);
  214. topdfdoc.Release();
  215. }
  216. PictureToPDFGridIsEnabled = "True";
  217. fileNamesIndex=0;
  218. }
  219. /// <summary>
  220. /// 设置保存后的文件名
  221. /// </summary>
  222. public string savefilename(string filename)
  223. {
  224. FileInfo file = new FileInfo(filename);
  225. return CommonHelper.CreateFilePath(filename.Replace(file.Name, "") + pictureToPDFModel.FrontFileNameLabel + file.Name + pictureToPDFModel.RearFileNameLabel + ".pdf");
  226. }
  227. #endregion
  228. #region 批量处理逻辑函数
  229. /// <summary>
  230. /// 选择PDF文件
  231. /// </summary>
  232. private void selectFile()
  233. {
  234. System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog();
  235. dlg.Multiselect = false;
  236. dlg.Filter = "PDF|*.pdf;*.PDF;";
  237. if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  238. {
  239. SelectFileName=dlg.FileName;
  240. pictureToPDFModel.FilePath = dlg.FileName;
  241. }
  242. }
  243. /// <summary>
  244. /// 添加图片文件
  245. /// </summary>
  246. private void addpicture()
  247. {
  248. FileNameNumber = fileNames.Count;
  249. System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog();
  250. dlg.Multiselect = true;
  251. dlg.Filter = "Picture|*.png;*.PNG;*.jpg;*.JPG;*.bmp;*.gif;*tiff;";
  252. if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  253. {
  254. fileNames.AddRange(dlg.FileNames.ToList());
  255. RemoveExcess(ref fileNames);
  256. SetPictureToPDFGridIsEnabled = "True";
  257. AddFileVisibility = Visibility.Collapsed;
  258. updateListview("待确定");
  259. }
  260. }
  261. public void addPicture(string filename)
  262. {
  263. FileNameNumber = fileNames.Count;
  264. fileNames.Add(filename);
  265. RemoveExcess(ref fileNames);
  266. SetPictureToPDFGridIsEnabled = "True";
  267. AddFileVisibility = Visibility.Collapsed;
  268. updateListview("待确定");
  269. }
  270. /// <summary>
  271. /// 添加图片文件夹
  272. /// </summary>
  273. private void addpicturefiles()
  274. {
  275. FileNameNumber = fileNames.Count;
  276. FolderBrowserDialog dialog = new FolderBrowserDialog();
  277. dialog.Description = "请选择文件路径";
  278. if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  279. {
  280. string foldPath = dialog.SelectedPath;
  281. var apps = System.IO.Directory.GetFiles(foldPath);
  282. foreach (string app in apps)
  283. {
  284. var fi = new FileInfo(app);
  285. if (fi.Extension == ".png" || fi.Extension == ".jpg" || fi.Extension == ".jpeg" || fi.Extension ==".bmp"|| fi.Extension == ".gif"|| fi.Extension == ".tiff")
  286. {
  287. fileNames.Add(app);
  288. }
  289. }
  290. RemoveExcess(ref fileNames);
  291. updateListview("待确定");
  292. SetPictureToPDFGridIsEnabled = "True";
  293. AddFileVisibility = Visibility.Collapsed;
  294. }
  295. }
  296. /// <summary>
  297. /// 删除图片文件
  298. /// </summary>
  299. public void removepicturefile() {
  300. FileNameNumber = fileNames.Count;
  301. Reverseorder(ref fileNamesView);
  302. foreach (int filenamesview in fileNamesView)
  303. {
  304. //Trace.WriteLine(filenamesview);
  305. fileNames.Remove(fileNames[filenamesview]);
  306. }
  307. if (fileNames.Count < 1)
  308. {
  309. SetPictureToPDFGridIsEnabled = "False";
  310. AddFileVisibility = Visibility.Visible;
  311. }
  312. updateListview("待确定");
  313. }
  314. public void removepdffile(int index)
  315. {
  316. ImagesCurrentDataTable.Rows.RemoveAt(index);
  317. fileNames.Remove(fileNames[index]);
  318. if (fileNames.Count < 1)
  319. {
  320. SetPictureToPDFGridIsEnabled = "False";
  321. AddFileVisibility = Visibility.Visible;
  322. }
  323. updateListview("待确定");
  324. }
  325. /// <summary>
  326. /// 打开文件图片
  327. /// </summary>
  328. public void openfiledialog(){
  329. foreach (int filenamesview in fileNamesView)
  330. {
  331. System.Diagnostics.Process.Start(fileNames[filenamesview]);
  332. }
  333. }
  334. /// <summary>
  335. /// 删除重复的文件
  336. /// </summary>
  337. public void RemoveExcess(ref List<string> Filenames) {
  338. List<string> filenames = new List<string>();
  339. foreach (var fileName in Filenames)
  340. {
  341. if (!filenames.Contains(fileName))
  342. {
  343. filenames.Add(fileName);
  344. }
  345. }
  346. Filenames.Clear();
  347. Filenames = filenames;
  348. }
  349. /// <summary>
  350. /// 逆序int类型集合
  351. /// </summary>
  352. public void Reverseorder(ref List<int> Numbers)
  353. {
  354. Numbers=Numbers.OrderBy(a=>a).ToList();
  355. Numbers.Reverse();
  356. }
  357. /// <summary>
  358. /// 更新listview显示
  359. /// state 状态显示字符串
  360. /// </summary>
  361. public void updateListview(string state) {
  362. updateCurrentListview();
  363. DataTable imagesdatatable = new DataTable();
  364. imagesdatatable.Columns.Add("FileName");
  365. imagesdatatable.Columns.Add("FileSize");
  366. imagesdatatable.Columns.Add("FileState");
  367. int datatableindex = 0;
  368. foreach (var fileName in fileNames)
  369. {
  370. string file_all = fileName;
  371. FileInfo f = new FileInfo(file_all);
  372. string file_size = (((float)f.Length)/1024).ToString()+" K";
  373. imagesdatatable.Rows.Add(f.Name, file_size, ImagesCurrentDataTable.Rows[datatableindex]["FileState"]);
  374. datatableindex++;
  375. }
  376. ImagesDataTable = imagesdatatable;
  377. }
  378. /// <summary>
  379. /// 更新Currentlistview显示
  380. /// pagerangetext 自定义页面范围字符串 pagerangeselectindex combobox下拉索引(0全部页面 1奇数页 2偶数页 3自定义页面)isevenpageisenabled 偶数页状态 state 状态显示字符串
  381. /// </summary>
  382. public void updateCurrentListview( string state = "待完成")
  383. {
  384. if (fileNames.Count >= FileNameNumber)
  385. {
  386. for (int i = 0; fileNames.Count - FileNameNumber > i; i++)
  387. {
  388. ImagesCurrentDataTable.Rows.Add(state);
  389. }
  390. }
  391. else
  392. {
  393. Reverseorder(ref fileNamesView);
  394. foreach (int filenamesview in fileNamesView)
  395. {
  396. ImagesCurrentDataTable.Rows.RemoveAt(filenamesview);
  397. }
  398. }
  399. }
  400. #endregion
  401. #region 图片转换
  402. /// <summary>
  403. /// 图片转PNG
  404. /// picturefile 图片文件名
  405. /// filePath 保存路径
  406. /// </summary>
  407. public bool SavePng(string picturefile, string filePath)
  408. {
  409. Image img = Image.FromFile(picturefile);
  410. try
  411. {
  412. using (var bmp = new Bitmap(img.Width, img.Height))
  413. {
  414. bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);
  415. using (var g = Graphics.FromImage(bmp))
  416. {
  417. g.Clear(Color.White);
  418. g.DrawImageUnscaled(img, 0, 0);
  419. }
  420. bmp.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
  421. }
  422. return true;
  423. }
  424. catch
  425. {
  426. return false;
  427. }
  428. }
  429. /// <summary>
  430. /// 图片转JPeG
  431. /// picturefile 图片文件名
  432. /// filePath 保存路径
  433. /// </summary>
  434. public bool SaveJpeg(string picturefile, string filePath)
  435. {
  436. Image img = Image.FromFile(picturefile);
  437. try
  438. {
  439. using (var bmp = new Bitmap(img.Width, img.Height))
  440. {
  441. bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);
  442. using (var g = Graphics.FromImage(bmp))
  443. {
  444. g.Clear(Color.White);
  445. g.DrawImageUnscaled(img, 0, 0);
  446. }
  447. //存储各种格式
  448. //bmp.Save(filePath, System.Drawing.Imaging.ImageFormat.Gif);
  449. //bmp.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
  450. bmp.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);
  451. }
  452. return true;
  453. }
  454. catch
  455. {
  456. return false;
  457. }
  458. }
  459. /// <summary>
  460. /// 插入JPeG图片
  461. /// topdfdoc 所要插入的文档
  462. /// filename 图片文件名
  463. /// fileinfo 文件信息
  464. /// width page宽
  465. /// height page高
  466. /// index 插入位置
  467. /// </summary>
  468. private void JpegInsertPage(ref CPDFDocument topdfdoc,string filename, FileInfo fileinfo,int width,int height,int index=0) {
  469. string tempFileName = "";
  470. if (fileinfo.Extension == ".jpg"|| fileinfo.Extension == ".jpeg")
  471. {
  472. topdfdoc.InsertPage(index, width, height, filename);
  473. }
  474. else
  475. {
  476. tempFileName = Path.GetTempPath() + "pngtemp.jpg";
  477. if (!PictureConverter.SaveJpeg(filename, tempFileName))
  478. {
  479. MessageBoxEx.Show("图片格式有问题");
  480. }
  481. topdfdoc.InsertPage(index, width, height, tempFileName);
  482. }
  483. }
  484. #endregion
  485. #region 构架行为
  486. public string Title => "图片转PDF";
  487. public event Action<IDialogResult> RequestClose;
  488. public bool CanCloseDialog()
  489. {
  490. return true;
  491. }
  492. public void OnDialogClosed()
  493. {
  494. }
  495. public void OnDialogOpened(IDialogParameters parameters)
  496. {
  497. string[] filepath=null;
  498. parameters.TryGetValue<string[]>(ParameterNames.FilePath, out filepath);
  499. if (filepath!=null)
  500. {
  501. fileNames=filepath.ToList();
  502. updateListview("待确定");
  503. }
  504. }
  505. #endregion
  506. }
  507. }