Text2PDFDlg.cpp
资源名称:Text2PDF.zip [点击查看]
上传用户:lqriiqpl
上传日期:2022-07-04
资源大小:258k
文件大小:12k
源码类别:
文件操作
开发平台:
Visual C++
- // Text2PDFDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "Text2PDF.h"
- #include "Text2PDFDlg.h"
- #include "PDFLib.hpp"
- #include "CommonDef.h"
- #include "Options.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- void PreparePDFPage(int Page, float* width, float* height);
- CString GetEffect(int iEffect);
- CString GetAction(int iAction);
- CString GetMode(int iMode);
- /////////////////////////////////////////////////////////////////////////////
- // CAboutDlg dialog used for App About
- class CAboutDlg : public CDialog
- {
- public:
- CAboutDlg();
- // Dialog Data
- //{{AFX_DATA(CAboutDlg)
- enum { IDD = IDD_ABOUTBOX };
- //}}AFX_DATA
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CAboutDlg)
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- //}}AFX_VIRTUAL
- // Implementation
- protected:
- //{{AFX_MSG(CAboutDlg)
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
- {
- //{{AFX_DATA_INIT(CAboutDlg)
- //}}AFX_DATA_INIT
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CAboutDlg)
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
- //{{AFX_MSG_MAP(CAboutDlg)
- // No message handlers
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CText2PDFDlg dialog
- CText2PDFDlg::CText2PDFDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CText2PDFDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CText2PDFDlg)
- m_FileName = _T("");
- m_Font = _T("");
- m_Text = _T("");
- //}}AFX_DATA_INIT
- // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- ZeroMemory(&FontSpec, sizeof(FontSpec));
- ZeroMemory(&PageSpec, sizeof(PageSpec));
- }
- void CText2PDFDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CText2PDFDlg)
- DDX_Control(pDX, IDC_CONVERT_PROGRESS, m_Progress);
- DDX_Text(pDX, IDC_FILENAME, m_FileName);
- DDX_Text(pDX, IDC_FONT, m_Font);
- DDX_Text(pDX, IDC_TEXT_FILE, m_Text);
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CText2PDFDlg, CDialog)
- //{{AFX_MSG_MAP(CText2PDFDlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_BN_CLICKED(IDC_CLOSE, OnClose)
- ON_BN_CLICKED(IDC_CONVERT, OnConvert)
- ON_BN_CLICKED(IDC_FILE_SELECT, OnFileSelect)
- ON_BN_CLICKED(IDC_FONT_SELECT, OnFontSelect)
- ON_BN_CLICKED(IDC_OPTIONS, OnOptions)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CText2PDFDlg message handlers
- BOOL CText2PDFDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Add "About..." menu item to system menu.
- // IDM_ABOUTBOX must be in the system command range.
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
- // TODO: Add extra initialization here
- FontSpec.FontSize = 12;
- CClientDC dc(this);
- SetMapMode(dc.m_hDC, MM_TEXT);
- FontSpec.lf.lfHeight=-MulDiv(12, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);
- strcpy(FontSpec.lf.lfFaceName, "Arial");
- m_Font.Format("%s, %d", FontSpec.lf.lfFaceName, FontSpec.FontSize);
- PageSpec.Bottom=MARGIN_BOTTOM;
- PageSpec.Left=MARGIN_LEFT;
- PageSpec.Right=MARGIN_RIGHT;
- PageSpec.Top=MARGIN_TOP;
- PageSpec.Effect=DEFAULT_EFFECT;
- PageSpec.OpenAction=DEFAULT_OPEN_ACTION;
- PageSpec.OpenMode=DEFAULT_OPEN_MODE;
- PageSpec.PageSize=DEFAULT_PAGE;
- PageSpec.Launch=TRUE;
- UpdateData(FALSE);
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void CText2PDFDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- // If you add a minimize button to your dialog, you will need the code below
- // to draw the icon. For MFC applications using the document/view model,
- // this is automatically done for you by the framework.
- void CText2PDFDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
- SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
- // Center icon in client rectangle
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // Draw the icon
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
- // The system calls this to obtain the cursor to display while the user drags
- // the minimized window.
- HCURSOR CText2PDFDlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
- void CText2PDFDlg::OnClose()
- {
- OnOK();
- }
- void CText2PDFDlg::OnFileSelect()
- {
- CFileDialog cFileDlg (TRUE, _T("txt"), (LPCTSTR) NULL,
- OFN_ENABLESIZING | OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_LONGNAMES |
- OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_CREATEPROMPT,
- _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*|"), this);
- cFileDlg.m_ofn.lpstrTitle = _T("Open Text File");
- if (cFileDlg.DoModal()==IDOK)
- {
- m_FileName=cFileDlg.GetPathName();
- UpdateTextFile(m_FileName);
- m_PDFName=m_FileName;
- m_PDFName=m_PDFName.Left(m_PDFName.ReverseFind('.'))+CString(".pdf");
- UpdateData(FALSE);
- }
- CheckConvertBtn();
- }
- void CText2PDFDlg::OnFontSelect()
- {
- CFontDialog cFontDlg(&FontSpec.lf);
- if (cFontDlg.DoModal()==IDOK)
- {
- m_Font.Format("%s, %d", cFontDlg.GetFaceName().GetBuffer(0),
- cFontDlg.GetSize()/10);
- cFontDlg.GetCurrentFont(&FontSpec.lf);
- FontSpec.FontSize=cFontDlg.GetSize()/10;
- UpdateData(FALSE);
- }
- CheckConvertBtn();
- }
- void CText2PDFDlg::UpdateTextFile(CString FileName)
- {
- CFileStatus fs;
- CFile::GetStatus(FileName, fs);
- char* Buf=new char[fs.m_size];
- ZeroMemory(Buf, fs.m_size);
- FILE* fp;
- fp=fopen(FileName, "rt");
- fread(Buf, fs.m_size, 1, fp);
- fclose(fp);
- m_Text=Buf;
- m_Text.Replace("n","rn");
- delete [] Buf;
- UpdateData(FALSE);
- }
- void CText2PDFDlg::CheckConvertBtn()
- {
- UpdateData(TRUE);
- if ((stricmp(FontSpec.lf.lfFaceName, "")==0) || m_FileName.IsEmpty())
- {
- GetDlgItem(IDC_CONVERT)->EnableWindow(FALSE);
- }
- else
- {
- GetDlgItem(IDC_CONVERT)->EnableWindow(TRUE);
- }
- }
- void CText2PDFDlg::OnOptions()
- {
- COptions opt;
- opt.SetParameter(PageSpec);
- if (opt.DoModal()==IDOK)
- {
- PageSpec=opt.GetParameter();
- }
- }
- void CText2PDFDlg::OnConvert()
- {
- PDFlib pdf;
- pdf.set_parameter("compatibility", "1.4"); //Compatible for Acrobat 5
- if (pdf.open(m_PDFName.GetBuffer(0))==-1)
- {
- AfxMessageBox("Can not create PDF file.n"
- "May be file opened by another process", MB_ICONERROR);
- return;
- }
- pdf.set_info("Creator", "Text2PDF");
- pdf.set_info("Author", "A. Riazi");
- pdf.set_info("Title","Text File Converted to PDF");
- pdf.set_info("Subject","Text2PDF Convertor");
- pdf.set_info("Keywords","Codeproject.com");
- float width, height;
- PreparePDFPage(PageSpec.PageSize, &width, &height);
- float PageHeight=0.0, PageWidth=0.0;
- pdf.begin_page(width, height);
- pdf.add_note(width - 50, height - 50, width + 150, height - 200,
- "This pdf file was created by Text2PDF, "
- "a free utility written by A. Riazi (a.riazi@misbah3com.com).rnrn"
- "Source code available from codeproject.comrn ", "Text2PDF", "note", false);
- //Font will be embedded in PDF
- int font=pdf.findfont(FontSpec.lf.lfFaceName, "winansi", 1);
- pdf.setfont(font, FontSpec.FontSize);
- pdf.set_text_pos(PageSpec.Left, height - PageSpec.Top);
- CString Line, Text;
- Text=m_Text;
- Text.Replace("rn","r");
- float descender=pdf.get_value("descender", font);
- float LineHeight=(1-descender)*FontSpec.FontSize;
- int iWordIndex=0;
- int iProgress=0;
- m_Progress.SetRange32(0, m_Text.GetLength());
- while (!Text.IsEmpty())
- {
- while (PageWidth<=width)
- {
- iWordIndex=Text.Find(' ', iWordIndex);
- if (iWordIndex!=-1)
- Line=Text.Left(iWordIndex++);
- else
- {
- Line=Text;
- break;
- }
- PageWidth=pdf.stringwidth(Line.GetBuffer(0),
- font, FontSpec.FontSize);
- }
- iWordIndex=Line.Find('r');
- if (iWordIndex!=-1) //enter found (carriage return)
- {
- Line=Line.Left(iWordIndex);
- Text=Text.Right(Text.GetLength() - Line.GetLength() - 1);
- }
- else
- {
- iWordIndex=Line.ReverseFind(' ');
- if (iWordIndex!=-1) //space found
- {
- if (pdf.stringwidth(Line.GetBuffer(0),
- font, FontSpec.FontSize)>width)
- {
- Line=Line.Left(iWordIndex); //with space character
- Text=Text.Right(Text.GetLength() - iWordIndex);
- }
- else
- {
- Line=Text;
- Text="";
- }
- }
- else
- {
- Text=Text.Right(Text.GetLength() - Line.GetLength());
- }
- }
- iWordIndex=0;
- iProgress+=Line.GetLength();
- m_Progress.SetPos(iProgress);
- pdf.continue_text(Line.GetBuffer(0));
- PageWidth=0;
- PageHeight=pdf.get_value("texty",0.0);
- if (PageHeight<PageSpec.Bottom)
- {
- pdf.end_page();
- pdf.begin_page(width, height);
- pdf.setfont(font, FontSpec.FontSize);
- pdf.set_text_pos(PageSpec.Left, height - PageSpec.Top);
- }
- Line="";
- }
- pdf.end_page();
- //Open Action
- CString Action=GetAction(PageSpec.OpenAction);
- pdf.set_parameter("openaction", Action.GetBuffer(0));
- //Open Mode
- CString Mode=GetMode(PageSpec.OpenMode);
- pdf.set_parameter("openmode", Mode.GetBuffer(0));
- //Effects
- CString Effect=GetEffect(PageSpec.Effect);
- pdf.set_parameter("transition",Effect.GetBuffer(0));
- pdf.close();
- //work is done.
- m_Progress.SetPos(0);
- if (PageSpec.Launch)
- ShellExecute(NULL, "open", m_PDFName, NULL, NULL, SW_SHOW);
- }
- void PreparePDFPage(int Page, float* width, float* height)
- {
- switch (Page)
- {
- case 0: //A0
- *width=a0_width;
- *height=a0_height;
- break;
- case 1: //A1
- *width=a1_width;
- *height=a1_height;
- break;
- case 2: //A2
- *width=a2_width;
- *height=a2_height;
- break;
- case 3: //A3
- *width=a3_width;
- *height=a3_height;
- break;
- case 4: //A4
- *width=a4_width;
- *height=a4_height;
- break;
- case 5: //A5
- *width=a5_width;
- *height=a5_height;
- break;
- case 6: //A6
- *width=a6_width;
- *height=a6_height;
- break;
- case 7: //B5
- *width=b5_width;
- *height=b5_height;
- break;
- case 8: //letter
- *width=letter_width;
- *height=letter_height;
- break;
- case 9: //legal
- *width=legal_width;
- *height=legal_height;
- break;
- case 10: //ledger
- *width=ledger_width;
- *height=ledger_height;
- break;
- }
- }
- CString GetEffect(int iEffect)
- {
- CString Result;
- switch (iEffect)
- {
- case 0:
- Result="split";
- break;
- case 1:
- Result="blinds";
- break;
- case 2:
- Result="box";
- break;
- case 3:
- Result="wipe";
- break;
- case 4:
- Result="dissolve";
- break;
- case 5:
- Result="glitter";
- break;
- case 6:
- Result="replace";
- break;
- }
- return Result;
- }
- CString GetAction(int iAction)
- {
- CString Result;
- switch (iAction)
- {
- case 0:
- Result="retain";
- break;
- case 1:
- Result="fitpage";
- break;
- case 2:
- Result="fitwidth";
- break;
- case 3:
- Result="fitheight";
- break;
- case 4:
- Result="fitbbox";
- break;
- }
- return Result;
- }
- CString GetMode(int iMode)
- {
- CString Result;
- switch (iMode)
- {
- case 0:
- Result="none";
- break;
- case 1:
- Result="bookmarks";
- break;
- case 2:
- Result="thumbnails";
- break;
- case 3:
- Result="fullscreen";
- break;
- }
- return Result;
- }