upload and view pdf in asp net c# : Paste picture into pdf preview Library control component asp.net azure html mvc samplechapter63-part846

183
Adding content with PdfStamper
duration: Text
category: Radiobutton
GP_3: Checkbox
GP_4: Checkbox
year: Text
Possible values for CP_1:
- Off
- Yes
Possible values for category:
spec, toro, anim, comp, hero, Off, worl, rive, teen, kim,
kauf, zha, fest, s-am, fdir, lee, kubr, kuro, fran, scan
Note that the movie theaters are stored in the database like this: 
CP.1
GP.3
MA.3
, ...
But  when  you  define  the  check  boxes  using  Open  Office  (as  in  figure  6.11), you
replace the dot with an underscore character because the dot character is forbidden
in field names.
A check box has two possible values that correspond with an appearance state. In the
case of the locations, the value can be 
Off
—the check box isn’t checked—or 
Yes
—the
check box  is  checked.  These values can vary  from 
PDF
to 
PDF
, so  it’s important to
check the possible states before you start filling out the form. The possible values for
the group of radio buttons is either Off—no radio button is selected—or a code that
corresponds with the keyword field in the festival_category table (see figure 3.4). 
Now that you’ve inspected the form, you have enough information to fill it out
using iText.
FILLING OUT THE FORM 
Filling out forms programmatically is usually done for two reasons: prefilling data in
an editable form, and presenting information in a standard layout.
Imagine an online insurance company. When a customer wants to report an inci-
dent, they can log in, and choose among a number of 
PDF
forms. These forms contain
a number of standard fields with content that’s already present in the company’s data-
base: name,  address,  and so  on. When  the customer logs in,  the application  could
have access to this information, so why require the customer to enter all this informa-
tion manually? Wouldn’t it be better to take the blank form and prefill part  of the
information to save time for the customer? 
That’s what’s done in figure 6.14. The film data sheet is filled with data from the
database, but the data is still editable. In the context of an insurance company, the
customer’s phone number could be filled in, but the customer could still change it in
case his number has changed.
Another typical use of 
PDF
forms is when you want to use the form as a standard
template. You don’t really need  a form to communicate with an end user. You just
want to create documents that share the same structure, but with differing content. 
The 
PDF
shown in figure 6.15 was made using the Film Data Sheet form, but it’s no
longer interactive. The form has disappeared. The fields were only used as placehold-
ers for the film title, director, and so on.
The process of  keeping the data but  removing the form is called flattening, and
there  are  different  possibilities  in-between. You can  choose  to flatten  only  specific
Paste picture into pdf preview - copy, paste, cut PDF images in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Detailed tutorial for copying, pasting, and cutting image in PDF page using C# class code
paste picture pdf; copy pictures from pdf to word
Paste picture into pdf preview - VB.NET PDF copy, paste image library: copy, paste, cut PDF images in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET Tutorial for How to Cut or Copy an Image from One Page and Paste to Another
how to copy pdf image; how to copy images from pdf
184
C
HAPTER
6
Working with existing PDFs
fields, or you can change the status of specific fields to read-only. For instance, a cus-
tomer of an insurance company is allowed to change their telephone number on the
prefilled form, but not their name. Flattening will be discussed in chapter 8; in this
chapter, you’ll only use the basic mechanism of form filling.
Figure 6.14 A form filled out using iText
Figure 6.15 A form filled out and flattened using iText
C# PDF insert image Library: insert images into PDF in C#.net, ASP
Import graphic picture, digital photo, signature and logo Ability to put image into specified PDF page component supports inserting image to PDF in preview
paste jpeg into pdf; how to copy a picture from a pdf file
VB.NET PDF insert image library: insert images into PDF in vb.net
Import graphic picture, digital photo, signature and logo into Insert images into PDF form field in VB.NET. component supports inserting image to PDF in preview
how to copy picture from pdf to powerpoint; copy image from pdf to pdf
185
Adding content with PdfStamper
public static void main(String[] args)
throws SQLException, IOException, DocumentException {
DatabaseConnection connection = new HsqldbConnection("filmfestival");
List movies = PojoFactory.getMovies(connection);
PdfReader reader;
PdfStamper stamper;
for (Movie movie : movies) {
if (movie.getYear() < 2007)
continue;
reader = new PdfReader(DATASHEET);            
stamper = new PdfStamper(reader,                   
new FileOutputStream(                       
String.format(RESULT, movie.getImdb()))); 
fill(stamper.getAcroFields(), movie);            
if (movie.getYear() == 2007)                   
stamper.setFormFlattening(true);             
stamper.close();                    
}
connection.close();
}
public static void fill(AcroFields form, Movie movie)
throws IOException, DocumentException {
form.setField("title", movie.getMovieTitle());                         
form.setField("director", getDirectors(movie));              
form.setField("year",                                                  
String.valueOf(movie.getYear()));                                    
form.setField("duration",                                              
String.valueOf(movie.getDuration()));                                
form.setField("category",                                              
movie.getEntry().getCategory().getKeyword());                        
for (Screening screening :                                             
movie.getEntry().getScreenings()) {                                  
form.setField(                                                       
screening.getLocation().replace('.', '_'), "Yes");                 
                                                                     
}
In this listing, you’re creating a separate document for every movie in the database
that was made after 2006. The new reader instance is created inside the loop.
FAQ
Why  do  I  get  a 
DocumentException
saying  “The  original  document  was
reused. Read it again from file.”? Every 
PdfReader
object can be used for one
and only one 
PdfStamper
object. Looking at the example in listing 6.19, you
might argue that 
new  PdfReader(DATASHEET)
could  be moved  outside the
loop,  because  it’s the  same for all  the 
PdfStamper
objects,  but  that  won’t
work.  As  soon  as  you  use  a 
PdfReader
object  to  create a 
PdfStamper
,  the
reader  object  is  tampered.  You  can  check  this  by  adding  the  line
reader.isTampered();
 If  this  method  returns 
true
 you  can’t  use  the
reader to create a new stamper object. You have to create a new instance—
which is exactly what the error message tells you.
Listing 6.19 FillDataSheet.java
Gets AcroFields
instance from stamper
Creates reader 
and stamper
B
Flattens forms for 
movies in 2007
Closes 
stamper
Fills out 
fields
C# PDF remove image library: remove, delete images from PDF in C#.
Support removing vector image, graphic picture, digital photo, scanned signature, logo, etc. Able to cut and paste image into another PDF file.
paste jpg into pdf preview; how to cut image from pdf
VB.NET PDF remove image library: remove, delete images from PDF in
PDF Image Extract; VB.NET Write: Insert text into PDF; C#.NET PDF pages extract, copy, paste, C#.NET Support removing vector image, graphic picture, digital photo
how to copy and paste a picture from a pdf; how to paste a picture into a pdf
186
C
HAPTER
6
Working with existing PDFs
If you want to fill out a form, you need to have an 
AcroFields
object. You can get an
instance of this object using the method 
getAcroFields()
.
FAQ
Why do I get a 
DocumentException
saying “This AcroFields instance is read-
only?” If you look closely at listings 6.18 and 6.19, you’ll see that the 
getAc-
roFields()
method  exists  in  the 
PdfReader
class  as  well  as  in  the 
Pdf-
Stamper
class. The 
AcroFields
retrieved in listing 6.18  is  read-only,  and it
will  throw  a 
DocumentException
as  soon  as  you try to  fill  out a  field.  You
need to use the method with 
PdfStamper
if you want to update the form.
Filling out the form is easy. If you know the field name, such as “title”, you can set its
value using only one line:
form.setField("title", movie.getMovieTitle());
As  you  can  see  in  listing  6.19 
B
 the  filled-out  data  sheets  of  movies  dating
from 2007 are flattened. Figure 6.15  shows such a data sheet. It looks like an ordi-
nary 
PDF
file. The content is stamped on  the document; it’s no longer an  editable
form. In figure 6.14, you see a data sheet for a movie made in 2008. It’s still a form;
you can change the title manually.
There’s much more to say about forms, but we can’t go into further detail until
we’ve talked about annotations. Also, I haven’t said anything about the different types
of 
PDF
forms yet: there are forms based on AcroForm technology (like the form you
created using Open Office), and there are 
XFA
forms (created with Adobe Designer).
This will have to wait until chapter 8, because we have one more group of 
PDF
manip-
ulation classes left to cover. 
6.4
Copying pages with PdfCopy
In the previous section, each 
PdfStamper
object was associated with one and only one
PdfReader
object. As soon as you want to assemble pages from more than one docu-
ment, you should use another 
PDF
manipulation class: 
PdfCopy
.
PdfCopy
extends 
PdfWriter
, and you’ll immediately recognize the five steps in the
PDF
creation process: 
public static void main(String[] args)
throws IOException, DocumentException {
new MovieTemplates().createPdf(MovieTemplates.RESULT);
PdfReader reader = new PdfReader(MovieTemplates.RESULT);
reader.selectPages("4-8");
...
manipulateWithCopy(reader);
}
private static void manipulateWithCopy(PdfReader reader)
throws IOException, DocumentException {
int n = reader.getNumberOfPages();
Document document = new Document();                 
Listing 6.20 SelectPages.java
Step 1
C# Word - Document Processing in C#.NET
Open(docFilePath); //Get the main ducument IDocument doc = document.GetDocument(); //Document clone IDocument doc0 = doc.Clone(); //Get all picture in document
how to copy an image from a pdf in; paste image into pdf acrobat
187
Copying pages with PdfCopy
PdfCopy copy = new PdfCopy(                
document, new FileOutputStream(RESULT2));      
document.open();                                    
for (int i = 0; i < n;) {                         
copy.addPage(copy.getImportedPage(reader, ++i));    
                                                
document.close();              
}
The main difference between  these  five  steps and  the ones  from  chapter  1 is that
you’re now using 
PdfCopy
instead of 
PdfWriter
in step 2. You can only add content
using 
addPage()
. Listing 6.20 is a variation on listing 6.11, with only one document
being involved in this example. Let’s extend the example and concatenate two 
PDF
s.
6.4.1
Concatenating and splitting PDF documents
In  chapter  2,  we  created  a  list  with  movies containing  links to  the Internet  Movie
Database  (
IMDB
).  We also created  a historical overview  of  these  movies  with  book-
marks that were generated automatically. Now let’s combine those two 
PDF
s into one
new document.
String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT };
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT));
document.open();
PdfReader reader;
int n;
for (int i = 0; i < files.length; i++) {
reader = new PdfReader(files[i]);
n = reader.getNumberOfPages();
for (int page = 0; page < n; ) {
copy.addPage(copy.getImportedPage(reader, ++page));
}
document.close();
MovieLinks1.RESULT
is  a  document  with  34  pages. 
MovieHistory.RESULT
has  26
pages. The page count of the concatenated file is 60.
FAQ
After merging two 
PDF
s, I’m seeing unnecessary white space. Why are there so
many blank areas? Sometimes people expect that a document with one page
concatenated with another document counting one page will result in a doc-
ument with only one page. They expect that, when the pages of the original
document are only half full, the new document will put both halves on one
page. That’s not how 
PDF
works! In 
PDF
, you work with complete pages; it’s
not possible to reflow the content on those pages.
There are two different versions of the 
addPage()
method. You can add blank pages if
you use a 
Rectangle
and a rotation value as parameters, or you can add a 
PdfImport-
edPage
obtained from the same 
PdfCopy
instance using 
getImportedPage()
.
Listing 6.21 Concatenate.java
Step 2
Step 3
Step 4
Step 5
188
C
HAPTER
6
Working with existing PDFs
PRESERVATION OF INTERACTIVE FEATURES 
You’ve used imported pages with 
PdfWriter
in section 6.2 and with 
PdfStamper
in sec-
tion 6.3. You’ve scaled these imported pages, rotated them, and so on. All of this isn’t
possible with the 
PdfImportedPage
objects obtained from 
PdfCopy
. You can only add
them to a new document in their original form and size. 
This limitation comes with a major advantage: most of the interactive features of
the page are preserved. The links that are present in 
MovieLinks1.RESULT
are lost if
you import a page using 
PdfWriter
or 
PdfStamper
, but they still work if you import
the same page with 
PdfCopy
. Links are a special type of annotation, and we’ll discuss
the different types of annotations in chapter 7. For now, it’s sufficient to know that all
annotations are kept with 
PdfCopy
. The bookmarks of 
MovieHistory.RESULT
, on the
other hand, are lost.
We’ll find a way to work around this in the next chapter.
ADDING CONTENT WITH PDFCOPY 
In  previous  sections,  I  explained  that 
PdfImportedPage
is  a  read-only  subclass  of
PdfTemplate
. You can’t add any content to an imported page. This wasn’t a big deal
when using imported pages with 
PdfWriter
and 
PdfStamper
because we could easily
add content over or under the imported page. When using 
PdfCopy
, it would be inter-
esting if we could somehow add extra content too.
It would be interesting if we could add a “page X of Y” footer that reflects the new
page numbers. 
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT));
document.open();
PdfReader reader1 = new PdfReader(MovieLinks1.RESULT);  
int n1 = reader1.getNumberOfPages();                         
PdfReader reader2 = new PdfReader(MovieHistory.RESULT); 
int n2 = reader2.getNumberOfPages();                      
PdfImportedPage page;
PdfCopy.PageStamp stamp;
for (int i = 0; i < n1; ) {                                    
page = copy.getImportedPage(reader1, ++i);                    
stamp = copy.createPageStamp(page);        
ColumnText.showTextAligned(                       
stamp.getUnderContent(), Element.ALIGN_CENTER,     
new Phrase(                                   
String.format("page %d of %d", i, n1 + n2)),
297.5f, 28, 0);                                 
stamp.alterContents();       
copy.addPage(page);                                          
}                                                              
for (int i = 0; i < n2; ) {                          
page = copy.getImportedPage(reader2, ++i);           
stamp = copy.createPageStamp(page);        
ColumnText.showTextAligned(          
stamp.getUnderContent(), Element.ALIGN_CENTER,       
Listing 6.22 ConcatenateStamp.java
Document 1: reader 
and page count
Document 2: reader 
and page count
Adds 
document 1
B
C
D
Adds 
document 2
B
C
189
Copying pages with PdfCopy
new Phrase(                                            
String.format("page %d of %d", n1 + i, n1 + n2)),
297.5f, 28, 0);                                    
stamp.alterContents();                               
copy.addPage(page);      
}                                                             
document.close();
With 
PdfCopy
, we can add content to a 
PdfImportedPage
using a 
PdfCopy.PageStamp
object. Such an object can be obtained with the 
createPageStamp()
method 
B
. This
object has  two methods  for getting a direct content layer: 
getUnderContent()
and
getOverContent()
. These methods return a 
PdfCopy.StampContent
object. 
PdfCopy.
StampContent
extends 
PdfContentByte
, and you can use it just as you’d use any other
PdfContentByte
object. In listing 6.22, you use it to add text at an absolute position 
C
.
There’s one caveat: you mustn’t forget to invoke the 
alterContents()
method 
D
.
SPLITTING A PDF 
Using  a 
PdfReader
instance  with 
PdfCopy
doesn’t  tamper  the  reader  the  way 
Pdf-
Stamper
does. You can reuse the same reader object for different 
PdfCopy
objects. You
can, for instance, construct one reader  instance that reads the timetable 
PDF
from
chapter 3, and create a new 
PdfCopy
instance for every page to split the document
into individual pages. In 
PDF
terminology, this process is often called 
PDF
bursting.
PdfReader reader = new PdfReader(MovieTemplates.RESULT);
Document document;
PdfCopy copy;
int n = reader.getNumberOfPages();
for (int i = 0; i < n; ) {
document = new Document();
copy = new PdfCopy(document,
new FileOutputStream(String.format(RESULT, ++i)));
document.open();
copy.addPage(copy.getImportedPage(reader, i));
document.close();
}
The original file representing the timetable contained 8 pages, and its size was about 15
KB
. Bursting this file results in 8 different single-page documents, each with a file size
of about 4 
KB
. 8 times 4 
KB
is 32 
KB
, which is more than the original 15 
KB
, because
resources that were shared among pages in the original document are now copied into
each separate document. So you might wonder what would happen if you concatenated
PDF
documents containing duplicate content. 
6.4.2
PdfCopy versus PdfSmartCopy
In section 6.3.5, you filled out and flattened the film data sheet form to create a sepa-
rate file for movies made in the year 2007. Wouldn’t it be nice to create one single
document that contains the data sheets for all the movies in the database? 
Listing 6.23 Burst.java
C
D
Adds
document 2
190
C
HAPTER
6
Working with existing PDFs
Here you’ll fill the data sheet using 
PdfStamper
. The resulting 
PDF
files will be kept
in memory just long enough to copy the page into a new document with 
PdfCopy
.
public void createPdf(String filename)
throws IOException, DocumentException, SQLException {
Document document = new Document();                   
PdfCopy copy = new PdfCopy(                     
document, new FileOutputStream(filename));     
document.open();                               
addDataSheets(copy);         
document.close();       
}
public void addDataSheets(PdfCopy copy)
throws SQLException, IOException, DocumentException {
DatabaseConnection connection =
new HsqldbConnection("filmfestival");
List<Movie> movies = PojoFactory.getMovies(connection);
PdfReader reader;
PdfStamper stamper;
ByteArrayOutputStream baos;
for (Movie movie : movies) {
reader = new PdfReader(DATASHEET);      
baos = new ByteArrayOutputStream();           
stamper = new PdfStamper(reader, baos); 
fill(stamper.getAcroFields(), movie);   
stamper.setFormFlattening(true);        
stamper.close();                        
reader = new PdfReader(baos.toByteArray());   
copy.addPage(copy.getImportedPage(reader, 1));     
}
connection.close();
}
This example works perfectly, and at first sight you won’t find anything wrong with the
resulting 
PDF
when you open it in Adobe Reader. Only when you look at the file size
will you have doubts. The original datasheet.pdf was less than 60 
KB
, but the resulting
PDF
is almost 5 
MB
.
This document has 120 pages that are almost identical. Only the specific movie
information differs from page to page; the form template is repeated over and over
again.  But 
PdfCopy
isn’t  aware  of  that:  it  takes  every  page  you  add,  including  its
resources, and copies everything to the writer. The code in listing 6.24 adds the same
bits and bytes representing the original form to the same document 120 times. The
resulting 
PDF
is full of redundant information.
This can be avoided by using 
PdfSmartCopy
instead of 
PdfCopy
in step 2. 
public void createPdf(String filename)
throws IOException, DocumentException, SQLException {
Document document = new Document();                   
Listing 6.24 DataSheets1.java
Listing 6.25 DataSheets2.java
Step 1
Step 2
Step 3
Step 4
Step 5
Creates single 
page in memory
Adds page 
to PdfCopy
Step 1
191
Copying pages with PdfCopy
PdfSmartCopy copy = new PdfSmartCopy(                   
document, new FileOutputStream(filename));          
document.open();                            
addDataSheets(copy);             
document.close();       
}
Now the size of the resulting 
PDF
file is only about 300 
KB
; that’s a much better result.
PdfSmartCopy
extends 
PdfCopy
. It inherits the  same functionality, but it  checks
every page that’s added for redundant objects, so it can save plenty of disk space or
bandwidth. There’s a price to pay for this extra “intelligence.” 
PdfSmartCopy
needs
more memory and more time to concatenate files than 
PdfCopy
. It will be up to you to
decide what’s more important: file size and bandwidth, or memory and time. It will
also depend on the nature of the documents you want to concatenate. If there is little
resemblance  between  the  pages,  you  might  as  well  use 
PdfCopy
.  If different  docu-
ments  all  have  the  same company logo on every page, you might want to consider
using 
PdfSmartCopy
to detect that logo. 
In  this  example,  you’ve  concatenated  flattened  forms.  But  what  happens  if
you concatenate  the  original  forms?  You  don’t  have  to  try  this:  it  won’t  work.
Although 
PdfCopy
(and 
PdfSmartCopy
) preserve the annotations used to visualize a
form,  the form functionality will be  broken if  you try to concatenate two or more
documents  containing forms using 
PdfCopy
.  Your best  chance  to achieve  this is  to
use 
PdfCopyFields
.
6.4.3
Concatenating forms
Suppose you want to create a film data sheet form with two or more pages. This can
easily be done with only four lines of code.
NOTE
These examples will only work if your forms are created using Acro-
Form technology. It’s not possible to concatenate 
XFA
forms using iText.
PdfCopyFields copy = new PdfCopyFields(new FileOutputStream(RESULT));
copy.addDocument(new PdfReader(DATASHEET));
copy.addDocument(new PdfReader(DATASHEET));
copy.close();
DATASHEET
refers to the file datasheet.pdf. 
RESULT
refers to a new form with two identi-
cal pages. This form probably won’t work the way you expect it to. You probably want
to be  able to  enter  the information  about one  movie on  the first page, and about
another movie on the second page. That’s impossible with this form. Although the
field  “title”  is  physically present  in  two  different  locations  in  the  same  document,
there’s only one logical field with the name “title” in the form. This single field can
only have one value. If you enter a title on page one, you’ll see the same title appear
on page two. That may not be your intention; you probably want to create a form with
two pages that can be used to enter information about two different movies.
Listing 6.26 ConcatenateForms1.java
Step 2
Step 3
Step 4
Step 5
192
C
HAPTER
6
Working with existing PDFs
That’s only possible if you use forms with different field names, or if you rename
the fields. 
public static void main(String[] args)
throws IOException, DocumentException {
PdfCopyFields copy = new PdfCopyFields(new FileOutputStream(RESULT));
copy.addDocument(new PdfReader(renameFieldsIn(DATASHEET, 1)));
copy.addDocument(new PdfReader(renameFieldsIn(DATASHEET, 2)));
copy.close();
}
private static byte[] renameFieldsIn(String datasheet, int i)
throws IOException, DocumentException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfStamper stamper =                                       
new PdfStamper(new PdfReader(datasheet), baos);             
AcroFields form = stamper.getAcroFields();                 
Set<String> keys                            
= new HashSet(form.getFields().keySet());       
for (String key : keys) {                   
form.renameField(                         
key, String.format("%s_%d", key, i));   
                                          
stamper.close();                                           
return baos.toByteArray();
}
This code snippet renames fields such as “title” into “title_1” (on page 1) and “title_2”
(on page 2). Now there’s no longer a conflict between the field names on the differ-
ent pages.
NOTE
Don’t  use 
PdfCopyFields
to  concatenate 
PDF
documents  without
form  fields.  As  opposed  to  concatenating  documents  using 
PdfCopy
Pdf-
CopyFields
needs to keep all the documents in memory to update the com-
bined  form.  This  can  become  problematic  if  you’re  trying  to  concatenate
large documents.
The 
PdfCopyFields
example completes this chapter on the different 
PDF
manipula-
tion classes. It’s high time for a summary with an overview that will help you pick the
right class for the job. 
6.5
Summary
In  this  chapter, you’ve  been  introduced  to the  different 
PDF
manipulation  classes
available in iText. You’ve used these classes to solve a series of common problems: N-
up copying  and  tiling 
PDF
documents,  using  a 
PDF
as company  stationery,  adding
headers, footers, watermarks, and “page X of Y” to existing documents, concatenating
and splitting 
PDF
s, and so on.
Every class had its specific specialties and limitations. Table 6.1 gives an overview of
the classes that were discussed in this chapter.
Listing 6.27 ConcatenateForms2.java
Creates new 
version of 
form
Renames 
fields
Documents you may be interested
Documents you may be interested