Text2PDFDlg.cpp
上传用户:lqriiqpl
上传日期:2022-07-04
资源大小:258k
文件大小:12k
源码类别:

文件操作

开发平台:

Visual C++

  1. // Text2PDFDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Text2PDF.h"
  5. #include "Text2PDFDlg.h"
  6. #include "PDFLib.hpp"
  7. #include "CommonDef.h"
  8. #include "Options.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. void PreparePDFPage(int Page, float* width, float* height);
  15. CString GetEffect(int iEffect);
  16. CString GetAction(int iAction);
  17. CString GetMode(int iMode);
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CAboutDlg dialog used for App About
  20. class CAboutDlg : public CDialog
  21. {
  22. public:
  23. CAboutDlg();
  24. // Dialog Data
  25. //{{AFX_DATA(CAboutDlg)
  26. enum { IDD = IDD_ABOUTBOX };
  27. //}}AFX_DATA
  28. // ClassWizard generated virtual function overrides
  29. //{{AFX_VIRTUAL(CAboutDlg)
  30. protected:
  31. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  32. //}}AFX_VIRTUAL
  33. // Implementation
  34. protected:
  35. //{{AFX_MSG(CAboutDlg)
  36. //}}AFX_MSG
  37. DECLARE_MESSAGE_MAP()
  38. };
  39. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  40. {
  41. //{{AFX_DATA_INIT(CAboutDlg)
  42. //}}AFX_DATA_INIT
  43. }
  44. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46. CDialog::DoDataExchange(pDX);
  47. //{{AFX_DATA_MAP(CAboutDlg)
  48. //}}AFX_DATA_MAP
  49. }
  50. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  51. //{{AFX_MSG_MAP(CAboutDlg)
  52. // No message handlers
  53. //}}AFX_MSG_MAP
  54. END_MESSAGE_MAP()
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CText2PDFDlg dialog
  57. CText2PDFDlg::CText2PDFDlg(CWnd* pParent /*=NULL*/)
  58. : CDialog(CText2PDFDlg::IDD, pParent)
  59. {
  60. //{{AFX_DATA_INIT(CText2PDFDlg)
  61. m_FileName = _T("");
  62. m_Font = _T("");
  63. m_Text = _T("");
  64. //}}AFX_DATA_INIT
  65. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  66. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  67. ZeroMemory(&FontSpec, sizeof(FontSpec));
  68. ZeroMemory(&PageSpec, sizeof(PageSpec));
  69. }
  70. void CText2PDFDlg::DoDataExchange(CDataExchange* pDX)
  71. {
  72. CDialog::DoDataExchange(pDX);
  73. //{{AFX_DATA_MAP(CText2PDFDlg)
  74. DDX_Control(pDX, IDC_CONVERT_PROGRESS, m_Progress);
  75. DDX_Text(pDX, IDC_FILENAME, m_FileName);
  76. DDX_Text(pDX, IDC_FONT, m_Font);
  77. DDX_Text(pDX, IDC_TEXT_FILE, m_Text);
  78. //}}AFX_DATA_MAP
  79. }
  80. BEGIN_MESSAGE_MAP(CText2PDFDlg, CDialog)
  81. //{{AFX_MSG_MAP(CText2PDFDlg)
  82. ON_WM_SYSCOMMAND()
  83. ON_WM_PAINT()
  84. ON_WM_QUERYDRAGICON()
  85. ON_BN_CLICKED(IDC_CLOSE, OnClose)
  86. ON_BN_CLICKED(IDC_CONVERT, OnConvert)
  87. ON_BN_CLICKED(IDC_FILE_SELECT, OnFileSelect)
  88. ON_BN_CLICKED(IDC_FONT_SELECT, OnFontSelect)
  89. ON_BN_CLICKED(IDC_OPTIONS, OnOptions)
  90. //}}AFX_MSG_MAP
  91. END_MESSAGE_MAP()
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CText2PDFDlg message handlers
  94. BOOL CText2PDFDlg::OnInitDialog()
  95. {
  96. CDialog::OnInitDialog();
  97. // Add "About..." menu item to system menu.
  98. // IDM_ABOUTBOX must be in the system command range.
  99. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  100. ASSERT(IDM_ABOUTBOX < 0xF000);
  101. CMenu* pSysMenu = GetSystemMenu(FALSE);
  102. if (pSysMenu != NULL)
  103. {
  104. CString strAboutMenu;
  105. strAboutMenu.LoadString(IDS_ABOUTBOX);
  106. if (!strAboutMenu.IsEmpty())
  107. {
  108. pSysMenu->AppendMenu(MF_SEPARATOR);
  109. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  110. }
  111. }
  112. // Set the icon for this dialog.  The framework does this automatically
  113. //  when the application's main window is not a dialog
  114. SetIcon(m_hIcon, TRUE); // Set big icon
  115. SetIcon(m_hIcon, FALSE); // Set small icon
  116. // TODO: Add extra initialization here
  117. FontSpec.FontSize = 12;
  118. CClientDC dc(this);
  119. SetMapMode(dc.m_hDC, MM_TEXT);
  120. FontSpec.lf.lfHeight=-MulDiv(12, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);
  121. strcpy(FontSpec.lf.lfFaceName, "Arial");
  122. m_Font.Format("%s, %d", FontSpec.lf.lfFaceName, FontSpec.FontSize);
  123. PageSpec.Bottom=MARGIN_BOTTOM;
  124. PageSpec.Left=MARGIN_LEFT;
  125. PageSpec.Right=MARGIN_RIGHT;
  126. PageSpec.Top=MARGIN_TOP;
  127. PageSpec.Effect=DEFAULT_EFFECT;
  128. PageSpec.OpenAction=DEFAULT_OPEN_ACTION;
  129. PageSpec.OpenMode=DEFAULT_OPEN_MODE;
  130. PageSpec.PageSize=DEFAULT_PAGE;
  131. PageSpec.Launch=TRUE;
  132. UpdateData(FALSE);
  133. return TRUE;  // return TRUE  unless you set the focus to a control
  134. }
  135. void CText2PDFDlg::OnSysCommand(UINT nID, LPARAM lParam)
  136. {
  137. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  138. {
  139. CAboutDlg dlgAbout;
  140. dlgAbout.DoModal();
  141. }
  142. else
  143. {
  144. CDialog::OnSysCommand(nID, lParam);
  145. }
  146. }
  147. // If you add a minimize button to your dialog, you will need the code below
  148. //  to draw the icon.  For MFC applications using the document/view model,
  149. //  this is automatically done for you by the framework.
  150. void CText2PDFDlg::OnPaint() 
  151. {
  152. if (IsIconic())
  153. {
  154. CPaintDC dc(this); // device context for painting
  155. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  156. // Center icon in client rectangle
  157. int cxIcon = GetSystemMetrics(SM_CXICON);
  158. int cyIcon = GetSystemMetrics(SM_CYICON);
  159. CRect rect;
  160. GetClientRect(&rect);
  161. int x = (rect.Width() - cxIcon + 1) / 2;
  162. int y = (rect.Height() - cyIcon + 1) / 2;
  163. // Draw the icon
  164. dc.DrawIcon(x, y, m_hIcon);
  165. }
  166. else
  167. {
  168. CDialog::OnPaint();
  169. }
  170. }
  171. // The system calls this to obtain the cursor to display while the user drags
  172. //  the minimized window.
  173. HCURSOR CText2PDFDlg::OnQueryDragIcon()
  174. {
  175. return (HCURSOR) m_hIcon;
  176. }
  177. void CText2PDFDlg::OnClose() 
  178. {
  179. OnOK();
  180. }
  181. void CText2PDFDlg::OnFileSelect() 
  182. {
  183. CFileDialog cFileDlg (TRUE, _T("txt"), (LPCTSTR) NULL, 
  184. OFN_ENABLESIZING | OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_LONGNAMES | 
  185. OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_CREATEPROMPT, 
  186. _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*|"), this);
  187. cFileDlg.m_ofn.lpstrTitle = _T("Open Text File");
  188. if (cFileDlg.DoModal()==IDOK)
  189. {
  190. m_FileName=cFileDlg.GetPathName();
  191. UpdateTextFile(m_FileName);
  192. m_PDFName=m_FileName;
  193. m_PDFName=m_PDFName.Left(m_PDFName.ReverseFind('.'))+CString(".pdf");
  194. UpdateData(FALSE);
  195. }
  196. CheckConvertBtn();
  197. }
  198. void CText2PDFDlg::OnFontSelect() 
  199. {
  200. CFontDialog cFontDlg(&FontSpec.lf);
  201. if (cFontDlg.DoModal()==IDOK)
  202. {
  203. m_Font.Format("%s, %d", cFontDlg.GetFaceName().GetBuffer(0), 
  204. cFontDlg.GetSize()/10);
  205. cFontDlg.GetCurrentFont(&FontSpec.lf);
  206. FontSpec.FontSize=cFontDlg.GetSize()/10;
  207. UpdateData(FALSE);
  208. }
  209. CheckConvertBtn();
  210. }
  211. void CText2PDFDlg::UpdateTextFile(CString FileName)
  212. {
  213. CFileStatus fs;
  214. CFile::GetStatus(FileName, fs);
  215. char* Buf=new char[fs.m_size];
  216. ZeroMemory(Buf, fs.m_size);
  217. FILE* fp;
  218. fp=fopen(FileName, "rt");
  219. fread(Buf, fs.m_size, 1, fp);
  220. fclose(fp);
  221. m_Text=Buf;
  222. m_Text.Replace("n","rn");
  223. delete [] Buf;
  224. UpdateData(FALSE);
  225. }
  226. void CText2PDFDlg::CheckConvertBtn()
  227. {
  228. UpdateData(TRUE);
  229. if ((stricmp(FontSpec.lf.lfFaceName, "")==0) || m_FileName.IsEmpty())
  230. {
  231. GetDlgItem(IDC_CONVERT)->EnableWindow(FALSE);
  232. }
  233. else
  234. {
  235. GetDlgItem(IDC_CONVERT)->EnableWindow(TRUE);
  236. }
  237. }
  238. void CText2PDFDlg::OnOptions() 
  239. {
  240. COptions opt;
  241. opt.SetParameter(PageSpec);
  242. if (opt.DoModal()==IDOK)
  243. {
  244. PageSpec=opt.GetParameter();
  245. }
  246. }
  247. void CText2PDFDlg::OnConvert() 
  248. {
  249. PDFlib pdf;
  250. pdf.set_parameter("compatibility", "1.4"); //Compatible for Acrobat 5
  251. if (pdf.open(m_PDFName.GetBuffer(0))==-1)
  252. {
  253. AfxMessageBox("Can not create PDF file.n"
  254. "May be file opened by another process", MB_ICONERROR);
  255. return;
  256. }
  257. pdf.set_info("Creator", "Text2PDF");
  258.     pdf.set_info("Author", "A. Riazi");
  259.     pdf.set_info("Title","Text File Converted to PDF");
  260. pdf.set_info("Subject","Text2PDF Convertor");
  261. pdf.set_info("Keywords","Codeproject.com");
  262. float width, height;
  263. PreparePDFPage(PageSpec.PageSize, &width, &height);
  264. float PageHeight=0.0, PageWidth=0.0;
  265. pdf.begin_page(width, height);
  266. pdf.add_note(width - 50, height - 50, width + 150, height - 200, 
  267. "This pdf file was created by Text2PDF, "
  268. "a free utility written by A. Riazi (a.riazi@misbah3com.com).rnrn"
  269. "Source code available from codeproject.comrn ", "Text2PDF", "note", false);
  270. //Font will be embedded in PDF
  271. int font=pdf.findfont(FontSpec.lf.lfFaceName, "winansi", 1);
  272. pdf.setfont(font, FontSpec.FontSize);
  273. pdf.set_text_pos(PageSpec.Left, height - PageSpec.Top);
  274. CString Line, Text;
  275. Text=m_Text;
  276. Text.Replace("rn","r");
  277. float descender=pdf.get_value("descender", font);
  278. float LineHeight=(1-descender)*FontSpec.FontSize;
  279. int iWordIndex=0;
  280. int iProgress=0;
  281. m_Progress.SetRange32(0, m_Text.GetLength());
  282. while (!Text.IsEmpty())
  283. {
  284. while (PageWidth<=width)
  285. {
  286. iWordIndex=Text.Find(' ', iWordIndex);
  287. if (iWordIndex!=-1)
  288. Line=Text.Left(iWordIndex++);
  289. else
  290. {
  291. Line=Text;
  292. break;
  293. }
  294. PageWidth=pdf.stringwidth(Line.GetBuffer(0),
  295. font, FontSpec.FontSize);
  296. }
  297. iWordIndex=Line.Find('r');
  298. if (iWordIndex!=-1) //enter found (carriage return)
  299. {
  300. Line=Line.Left(iWordIndex);
  301. Text=Text.Right(Text.GetLength() - Line.GetLength() - 1);
  302. }
  303. else
  304. {
  305. iWordIndex=Line.ReverseFind(' ');
  306. if (iWordIndex!=-1) //space found
  307. {
  308. if (pdf.stringwidth(Line.GetBuffer(0),
  309. font, FontSpec.FontSize)>width)
  310. {
  311. Line=Line.Left(iWordIndex); //with space character
  312. Text=Text.Right(Text.GetLength() - iWordIndex);
  313. }
  314. else
  315. {
  316. Line=Text;
  317. Text="";
  318. }
  319. }
  320. else
  321. {
  322. Text=Text.Right(Text.GetLength() - Line.GetLength());
  323. }
  324. }
  325. iWordIndex=0;
  326. iProgress+=Line.GetLength();
  327. m_Progress.SetPos(iProgress);
  328. pdf.continue_text(Line.GetBuffer(0));
  329. PageWidth=0;
  330. PageHeight=pdf.get_value("texty",0.0);
  331. if (PageHeight<PageSpec.Bottom)
  332. {
  333. pdf.end_page();
  334. pdf.begin_page(width, height);
  335. pdf.setfont(font, FontSpec.FontSize);
  336. pdf.set_text_pos(PageSpec.Left, height - PageSpec.Top);
  337. }
  338. Line="";
  339. }
  340. pdf.end_page();
  341. //Open Action
  342. CString Action=GetAction(PageSpec.OpenAction);
  343. pdf.set_parameter("openaction", Action.GetBuffer(0));
  344. //Open Mode
  345. CString Mode=GetMode(PageSpec.OpenMode);
  346. pdf.set_parameter("openmode", Mode.GetBuffer(0));
  347. //Effects
  348. CString Effect=GetEffect(PageSpec.Effect);
  349. pdf.set_parameter("transition",Effect.GetBuffer(0));
  350. pdf.close();
  351. //work is done.
  352. m_Progress.SetPos(0);
  353. if (PageSpec.Launch)
  354. ShellExecute(NULL, "open", m_PDFName, NULL, NULL, SW_SHOW);
  355. }
  356. void PreparePDFPage(int Page, float* width, float* height)
  357. {
  358. switch (Page)
  359. {
  360. case 0: //A0
  361. *width=a0_width;
  362. *height=a0_height;
  363. break;
  364. case 1: //A1
  365. *width=a1_width;
  366. *height=a1_height;
  367. break;
  368. case 2: //A2
  369. *width=a2_width;
  370. *height=a2_height;
  371. break;
  372. case 3: //A3
  373. *width=a3_width;
  374. *height=a3_height;
  375. break;
  376. case 4: //A4
  377. *width=a4_width;
  378. *height=a4_height;
  379. break;
  380. case 5: //A5
  381. *width=a5_width;
  382. *height=a5_height;
  383. break;
  384. case 6: //A6
  385. *width=a6_width;
  386. *height=a6_height;
  387. break;
  388. case 7: //B5
  389. *width=b5_width;
  390. *height=b5_height;
  391. break;
  392. case 8: //letter
  393. *width=letter_width;
  394. *height=letter_height;
  395. break;
  396. case 9: //legal
  397. *width=legal_width;
  398. *height=legal_height;
  399. break;
  400. case 10: //ledger
  401. *width=ledger_width;
  402. *height=ledger_height;
  403. break;
  404. }
  405. }
  406. CString GetEffect(int iEffect)
  407. {
  408. CString Result;
  409. switch (iEffect)
  410. {
  411. case 0:
  412. Result="split";
  413. break;
  414. case 1:
  415. Result="blinds";
  416. break;
  417. case 2:
  418. Result="box";
  419. break;
  420. case 3:
  421. Result="wipe";
  422. break;
  423. case 4:
  424. Result="dissolve";
  425. break;
  426. case 5:
  427. Result="glitter";
  428. break;
  429. case 6:
  430. Result="replace";
  431. break;
  432. }
  433. return Result;
  434. }
  435. CString GetAction(int iAction)
  436. {
  437. CString Result;
  438. switch (iAction)
  439. {
  440. case 0:
  441. Result="retain";
  442. break;
  443. case 1:
  444. Result="fitpage";
  445. break;
  446. case 2:
  447. Result="fitwidth";
  448. break;
  449. case 3:
  450. Result="fitheight";
  451. break;
  452. case 4:
  453. Result="fitbbox";
  454. break;
  455. }
  456. return Result;
  457. }
  458. CString GetMode(int iMode)
  459. {
  460. CString Result;
  461. switch (iMode)
  462. {
  463. case 0:
  464. Result="none";
  465. break;
  466. case 1:
  467. Result="bookmarks";
  468. break;
  469. case 2:
  470. Result="thumbnails";
  471. break;
  472. case 3:
  473. Result="fullscreen";
  474. break;
  475. }
  476. return Result;
  477. }