mvc open pdf file in new window : How to extract images from pdf Library software API .net windows winforms sharepoint 0131473816_book54-part75

C H A P T E R
20
Perfecting Your Application
There’s a world of difference between an application that does its job ade-
quately and an application that’s intuitive and enjoyable to use. For internal
use, a basic, no-frills application may be adequate, but if you’re planning on
distributing your brainchild to a wide audience, you’ll want it to be as com-
pelling and easy to use as applications from the biggest software publishers.
You’ll need to conform to some fundamental expectations and standards, such
as the provision of configuration dialogs and online help. In this final chapter,
we’ll cover the following topics to help you polish your application:
 Single instance or multiple instances? How you can prevent “clones”
of your application from proliferating.
 Modifying event handling. How to change the order in which events
are processed.
 Reducing flicker. How to improve the visual quality of your application
by cutting down on annoying flicker.
 Implementing online help. Suggestions for providing a variety of help
for your users.
 Parsing the command line. Give your users more control over your
application with command-line options and switches.
 Storing application resources. Ways to package files needed by your
application.
 Invoking other applications. From simple program execution to cap-
turing another process’s input and output.
 Managing application settings. The use of 
wxConfig
to save and load
settings, and tips for presenting settings.
 Application installation. Suggestions for how users can easily install
your application on the three major platforms.
 Following UI design guidelines. Some observations about conforming
to the design recommendations on each platform.
505
How to extract images from pdf - Select, copy, paste PDF images in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support PDF Image Extraction from a Page, a Region on a Page, and PDF Document
extract pictures from pdf; extract jpg pdf
How to extract images from pdf - VB.NET PDF Image Extract Library: Select, copy, paste PDF images in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support PDF Image Extraction from a Page, a Region on a Page, and PDF Document
extract photo from pdf; extract images from pdf online
S
INGLE
I
NSTANCE OR
M
ULTIPLE
I
NSTANCES
?
Depending on the nature of your application, you might either want to allow
users  to keep  invoking  multiple  instances  of the application, or  reuse  the
existing instance when the user tries to relaunch the application or open more
than one document from the system’s file manager. It’s quite common to give
users  the option  of  running  the application in single-instance or multiple-
instance mode, depending on their working habits.One problem with allowing
multiple instances is that the order in which the instances write their configu-
ration data (usually when the application exits) is undefined, so user settings
might be lost. It might also confuse novice users who don’t realize they are
launching new instances of the application. The behavior of allowing multiple
applications  to  be  launched  is  the  default  on  all  platforms  (except  when
launching applications and opening documents via the Finder on Mac OS), so
you  will  need  to  write  additional  code  if  you  want  to  disable  multiple
instances.
On Mac OS (only), opening multiple documents using the same instance
is easy. Override the 
MacOpenFile
function, taking a 
wxString
file name argu-
ment,which will be called when a document associated with this application is
opened from the Finder. If the application is not already running, Mac OS will
run it first before calling 
MacOpenFile
(unlike on other platforms, it does not
pass the file name in the command-line arguments). If you are using docu-
ment/view, you might not need to provide this function because the default
implementation on Mac OS X is as follows:
void wxApp::MacOpenFile(const wxString& fileName)
{
wxDocManager* dm = wxDocManager::GetDocumentManager() ;
if ( dm )
dm->CreateDocument(fileName, wxDOC_SILENT) ;
However, even on Mac OS, this will not prevent the user from running the
application multiple times if launching the executable directly, as opposed to
opening an associated document. One way in which you can detect and forbid
more  than  one  instance  from  being  run  is  by  using  the
wxSingleInstanceChecker
class. Create an object of this class that persists for
the lifetime of the instance, and in your 
OnInit
,call 
IsAnotherRunning
.If this
returns 
true
,you can quit immediately, perhaps after alerting the user. For
example:
bool MyApp::OnInit()
{
const wxString name = wxString::Format(wxT(“MyApp-%s”),
wxGetUserId().c_str());
m_checker = new wxSingleInstanceChecker(name);
if ( m_checker->IsAnotherRunning() )
506
Perfecting Your Application Chapter 20
VB.NET PDF Text Extract Library: extract text content from PDF
Extract highlighted text out of PDF document. Image text extraction control provides text extraction from PDF images and image files.
extract text from image pdf file; how to extract text from pdf image file
C# PDF Text Extract Library: extract text content from PDF file in
Ability to extract highlighted text out of PDF document. Image text extraction control provides text extraction from PDF images and image files.
extract photos pdf; how to extract images from pdf in acrobat
{
wxLogError(_(“Program already running, aborting.”));
return false;
}
... more initializations ...
return true;
}
int MyApp::OnExit()
{
delete m_checker;
return 0;
}
But what if you want to bring the existing instance to the front or open a file
that was passed to the second instance in the first instance? In general, this
requires the instances to be able to communicate with each other. We can use
wxWidgets’ high-level interprocess communication classes to do this.
In the following example, we’ll set up communication between instances
of  the  sample  application  and  allow  secondary  instances  to  ask  the  first
instance  to  either  open a  file  or  raise  itself  to indicate that  the  user has
requested the application to open.The following declares a connection class for
use by both instances, a server class for the original instance to listen for con-
nections from other instances, and a client class that is used by subsequent
instances for communicating with the original instance.
#include “wx/ipc.h”
// Server class, for listening to connection requests
class stServer: public wxServer
{
public:
wxConnectionBase *OnAcceptConnection(const wxString& topic);
};
// Client class, to be used by subsequent instances in OnInit
class stClient: public wxClient
{
public:
stClient() {};
wxConnectionBase *OnMakeConnection() { return new stConnection; }
};
// Connection class, for use by both communicating instances
class stConnection : public wxConnection
{
public:
stConnection() {}
Single Instance or Multiple Instances?
507
VB.NET PDF Page Extract Library: copy, paste, cut PDF pages in vb.
VB.NET: Extract All Images from PDF Document. This is an example that you can use it to extract all images from PDF document. ' Get page 3 from the document.
how to extract images from pdf files; extract photos from pdf
C# Create PDF from images Library to convert Jpeg, png images to
C#.NET Project DLLs for Conversion from Images to PDF in C#.NET Program. C# Example: Convert More than Two Type Images to PDF in C#.NET Application.
extract images from pdf files without using copy and paste; how to extract pictures from pdf files
~stConnection() {}
bool OnExecute(const wxString& topic, wxChar*data, int size,       
wxIPCFormat format);
};
OnAcceptConnection
is  called within  the original (server) instance when the
client tries to make the connection. We need to check that there are no modal
dialogs running in this instance because when a modal dialog is open, there
should  be no  other  activity  in  the  application  that  might  require a  user’s
attention.
// Accepts a connection from another instance
wxConnectionBase *stServer::OnAcceptConnection(const wxString& topic)
{
if (topic.Lower() == wxT(“myapp”))
{
// Check that there are no modal dialogs active
wxWindowList::Node* node = wxTopLevelWindows.GetFirst();
while (node)
{
wxDialog* dialog = wxDynamicCast(node->GetData(), wxDialog);
if (dialog && dialog->IsModal())
{
return false;
}
node = node->GetNext();
}
return new stConnection();
}
else
return NULL;
}
OnExecute
is called when the client application calls 
Execute
on its connection
object.
OnExecute
can have an empty data argument, in which case the applica-
tion  should  just  raise its  main  window. Otherwise, the  application  should
determine whether the file is already open and raise the associated window if
so, or open the document if not.
// Opens a file passed from another instance
bool stConnection::OnExecute(const wxString& WXUNUSED(topic),
wxChar *data,
int WXUNUSED(size),
wxIPCFormat WXUNUSED(format))
{
stMainFrame* frame = wxDynamicCast(wxGetApp().GetTopWindow(),
stMainFrame);
wxString filename(data);
if (filename.IsEmpty())
508
Perfecting Your Application Chapter 20
C# PDF Page Extract Library: copy, paste, cut PDF pages in C#.net
Page: Extract, Copy and Paste PDF Pages. Easy to Use C# Code to Extract PDF Pages, Copy Pages from One PDF File and Paste into Others in C#.NET Program.
how to extract images from pdf file; extract image from pdf c#
C# PDF insert image Library: insert images into PDF in C#.net, ASP
Powerful .NET PDF image edit control, enable users to insert vector images to PDF file. Merge several images into PDF. Insert images into PDF form field.
some pdf image extract; pdf image text extractor
{
// Just raise the main window
if (frame)
frame->Raise();
}
else
{
// Check if the filename is already open,
// and raise that instead.
wxNode* node = wxGetApp().GetDocManager()-
>GetDocuments().GetFirst();
while (node)
{
MyDocument* doc = wxDynamicCast(node->GetData(),MyDocument);
if (doc && doc->GetFilename() == filename)
{
if (doc->GetFrame())
doc->GetFrame()->Raise();
return true;
}
node = node->GetNext();
}
wxGetApp().GetDocManager()->CreateDocument(
filename, wxDOC_SILENT);
}
return true;
}
In 
OnInit
, the  application  will  check  for  multiple  instances using
wxSingleInstanceChecker
as usual.If no other instances are found, the instance
can  set itself up as a server, waiting for requests from future instances. If
another instance was found, a connection is made to the other instance, and
the second instance asks the first to open a file or raise its main window before
exiting. Here’s the code to do this:
bool MyApp::OnInit()
{
wxString cmdFilename; // code to initialize this omitted
...
m_singleInstanceChecker = new wxSingleInstanceChecker(wxT(“MyApp”));
// If using a single instance, use IPC to
// communicate with the other instance
if (!m_singleInstanceChecker->IsAnotherRunning())
{
// Create a new server
m_server = new stServer;
if ( !m_server->Create(wxT(“myapp”) )
{
wxLogDebug(wxT(“Failed to create an IPC service.”));            
}
}
Single Instance or Multiple Instances?
509
C# PDF Convert to Images SDK: Convert PDF to png, gif images in C#
Professional .NET library and Visual C# source code for creating high resolution images from PDF in C#.NET class. Cut and paste any areas in PDF pages to images.
extract pictures pdf; extract image from pdf
VB.NET Create PDF from images Library to convert Jpeg, png images
VB.NET Guide for Converting Raster Images to PDF File Using VB.NET Sample Code. VB.NET Example of More than Two Images to PDF Conversion. This VB.
how to extract a picture from a pdf; extract images from pdf files
else
{
wxLogNull logNull;
// OK, there IS another one running, so try to connect to it
// and send it any filename before exiting.
stClient* client = new stClient;
// ignored under DDE, host name in TCP/IP based classes
wxString hostName = wxT(“localhost”);
// Create the connection
wxConnectionBase* connection =
client->MakeConnection(hostName,
wxT(“myapp”), wxT(“MyApp”));
if (connection)
{
// Ask the other instance to open a file or raise itself
connection->Execute(cmdFilename);
connection->Disconnect();
delete connection;
}
else
{
wxMessageBox(wxT(“Sorry, the existing instance may be
too busy too respond.\nPlease close any open dialogs and
retry.”),
wxT(“My application”), wxICON_INFORMATION|wxOK);
}
delete client;
return false;
}
...
return true;
}
If you want to find out more about the interprocess communication classes
used here, another example is provided by the standalone wxWidgets Help
Viewer, which you can find in 
utils/helpview/src
in your wxWidgets distribu-
tion. This application responds to requests by an application to view a help
file. See  also 
samples/ipc
and  the  wxWidgets  class  reference  for 
wxServer
,
wxClient,
and 
wxConnection
.
M
ODIFYING
E
VENT
H
ANDLING
Normally, wxWidgets sends an event to the window (or other event handler)
that generated it. If it’s a command event, it might work its way up the win-
dow  hierarchy  before  being  processed  (see  Appendix  H, “How  wxWidgets
Processes Events,” for details). For example, clicking on a copy toolbar button
will cause the toolbar event table to be searched, then the frame that contains it,
510
Perfecting Your Application Chapter 20
and then the application object. Although this may work fine if you support
only one kind of copy command, there is a problem if you also want the copy
command to apply both to your main editing window (say a drawing applica-
tion) and to any focused text controls in the main window, for example. The
text controls will never get copy commands from the toolbar button (or menu
item) because it is wired to a custom event handler. In this case, it would be
more appropriate to send the command to the focused control first.Then, if the
focused  control  implements  this  command  (such  as 
wxID_COPY
), it  will  be
processed. If it doesn’t, then the command will rise up the window hierarchy
until it gets to the custom 
wxID_COPY
event handler. The end result will be a
more natural way of working, with commands applying to the data that the
user is currently editing.
We can override the main frame’s 
ProcessEvent
function to catch com-
mand events and redirect them to the focused control (if any), as follows:
bool MainFrame::ProcessEvent(wxEvent& event)
{
static wxEvent* s_lastEvent = NULL;
// Check for infinite recursion
if (& event == s_lastEvent)
return false;
if (event.IsCommandEvent() &&
!event.IsKindOf(CLASSINFO(wxChildFocusEvent)) &&
!event.IsKindOf(CLASSINFO(wxContextMenuEvent)))
{
s_lastEvent = & event;
wxControl *focusWin = wxDynamicCast(FindFocus(), wxControl);        
bool success = false;
if (focusWin)
success = focusWin->GetEventHandler()
->ProcessEvent(event);
if (!success)
success = wxFrame::ProcessEvent(event);
s_lastEvent = NULL;
return success;
}
else
{
return wxFrame::ProcessEvent(event);
}
}
Currently, this  is  most  useful  when  the  focused  control  is  a 
wxTextCtrl
because for this control (on most platforms), wxWidgets supplies standard
UI  update  and  command  handlers  for  common  commands, including
wxID_COPY
,
wxID_CUT
,
wxID_PASTE
,
wxID_UNDO
,and 
wxID_REDO
.However, you can
always implement these handlers for arbitrary controls in your application
Modifying Event Handling
511
or subclasses of existing wxWidgets controls such as 
wxStyledTextCtrl
(see
examples/chap20/pipedprocess
for a 
wxStyledTextCtrl
implementation enhanced
in this way).
R
EDUCING
F
LICKER
Flicker is a perennial annoyance in GUI programming. Often an application
will need some tweaking to reduce it; here are some tips that might help.
On Windows, if your window is using the 
wxFULL_REPAINT_ON_RESIZE
style,
try removing it. This will cause the repaint area to be restricted to only the
parts of the window “damaged” by resizing, so less erasing and redrawing is
done. Otherwise, even if the window was resized a tiny amount, the whole
window will be refreshed, causing flicker. However, this will not work if the
appearance of your window contents depends on the size because the whole
window will require updating.
You may sometimes need to use the 
wxCLIP_CHILDREN
style on Windows to
prevent a window refresh from affecting its children.The style has no effect on
other platforms.
When you are drawing in a scrolled window, you can do quite a lot to
improve refresh speed and reduce flicker. First, optimize the way you find
the appropriate data to draw: you need a way to gather just the informa-
tion that is in the current view (see 
wxWindow::GetViewStart
and 
wxWindow::
GetClientSize
), and in your paint handler, you should also be able to eliminate
the graphics that are not in the update region (
wxWindow::GetUpdateRegion
).
You need data structures that can get you to the start of the view quickly
before you start drawing. You may be able to calculate that position from
your graphics (rather than search), for example if you have columns with
constant width. A linked list or array should be fairly fast to search. If it’s
time-consuming to calculate the current position, then perhaps you can use a
caching mechanism to store the current list position for the last set of data dis-
played, and then you can simply scan back or forward to find the data at the
start of the current scroll position. You can keep a tally of the window position
for each piece of data so that you don’t have to recalculate the whole thing
from the start to find where the data should be drawn.
When  implementing  scrolling  graphics, you  can  use 
wxWindow::
ScrollWindow
to physically move the pixels on the window, and this will mean
that only the remaining “dirty” area of the window will need refreshing, which
will further reduce flickering. (
wxScrolledWindow
already does this for you, by
default.) 
GetUpdateRegion
will reflect the smaller amount of screen that you
need to update.
As mentioned in Chapter 5, “Drawing And, Printing,” you may want to
define your own  erase background handler  and leave it empty to stop the
framework from clearing the background itself. Then you can draw the whole
graphic (including as much of the background as necessary) on top of the old
512
Perfecting Your Application Chapter 20
one  without  the  flashing caused  by  clearing  the  entire  background  before
drawing  the  content. Use 
wxWindow::SetBackgroundStyle
with 
wxBG_STYLE_
CUSTOM
to tell wxWidgets not to automatically erase the background.Chapter 5
also discusses use of 
wxBufferedDC
and 
wxBufferedPaintDC
,which you can use in
combination with the other techniques mentioned here.
Another  problem  is  inefficiency  and  flicker  caused  by  doing  many
updates  to  a  window  in  quick  succession. wxWidgets  provides 
wxWindow::
Freeze
and 
wxWindow::Thaw
to  switch  off  updates  while  code  is  executed
between these function calls. For example, you might want to use this when
adding a lot of lines to a text control one by one or appending many items to a
list  box. When 
Thaw
is  called, the  window  will  normally  be  completely
refreshed.
Freeze
and 
Thaw
are implemented on Windows and Mac OS X for
wxWindow
and on GTK+ for 
wxTextCtrl
.You can also implement it for your own
window  classes  to avoid  doing  unnecessary  processing  and  updating  (our
wxThumbnailCtrl
example from Chapter 12, “Advanced Window Classes,” does
this; see 
examples/chap12/thumbnail
).
I
MPLEMENTING
O
NLINE
H
ELP
Although you should make your application as intuitive as possible so that the
user rarely has to resort to the manual,it’s important to supply online help for
all but the simplest application. You could supply it as a PDF file or even an
HTML file to be viewed by the user’s favorite browser, but it will make a much
better impression if you use a special-purpose help system and link to appro-
priate topics from all your dialogs and from your main window.
wxWidgets has the concept of help controller, a class that your applica-
tion uses to load help files and show topics. Several help controller classes are
supported:
wxWinHelpController
, for  controlling  RTF-based  WinHelp  files  on
Windows (extension 
hlp
).This format is deprecated,and new applications
should use 
wxCHMHelpController
.
wxCHMHelpController
, for controlling  MS HTML Help files on Windows
(extension 
chm
).
wxWinceHelpController
,for controlling Windows CE Help files (extension
htm
).
wxHtmlHelpController
,for controlling wxWidgets HTML Help files on all
platforms (extension 
htb
).
wxHtmlHelpController
is  different  from  the  others  in  that  instead  of
merely being a wrapper for an external help viewer, it is part of an entire help
system implementation, and the help window resides in the same process as
the application. If you want to use the wxWidgets HTML Help viewer as a sep-
arate process, compile HelpView in 
utils/src/helpview
in your wxWidgets dis-
tribution. The  files 
remhelp.h
and 
remhelp.cpp
implement  a  remote  help
Implementing Online Help
513
controller (
wxRemoteHtmlHelpController
) that you can link with your applica-
tion to control the HelpView instance.
Note that at the time of writing, there is no special help controller class
for Mac OS X help files. You can use wxWidgets HTML Help files on this plat-
form.
Figure 20-1 and Figure 20-2 show the same topic displayed in MS HTML
Help and wxWidgets HTML Help viewers under Windows. The two provide
similar functionality: HTML content on the right, and on the left, a hierarchy
of topics, an index of topic names, and a keyword search facility. In addition,
wxWidgets HTML Help can load multiple help files.
514
Perfecting Your Application Chapter 20
Figure 20-1 MS HTML Help
Documents you may be interested
Documents you may be interested