Using: iText v 5.4.3 - Jdk 1.7_u25 32bit
First, read the PDF format specification v1.7, section 3.4.5 page 98
http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf
Talks about "Incremental Updates." Read this section for more info of what
I'm talking here.
Second, in my previous posts when I referred to pdfStamper.extractRevision
() I was actually referring to me
pdfStamperInstance.getAcroFields().extractRevision();
I edited my previous posts to make it clear.
Third, let it clear what I'm trying to do:
I have files that are signed multiple times. The first time the file is
requested flow is as follows:
1 - I get a template server.
2 - I open this file fill some fields and sign. Saved and closed the file.
3 - We reopen this file and try to extract the file revision.
4 - Mando InputStream to the revision to the server.
5 - The server receives the inputStream and must make a revision in the
append template.
If the second (or later) file to be sent will be the last revision.
Below the code:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
public class ItextIncrementalUpdater {
public static void main(String[] args)
throws IOException, DocumentException, GeneralSecurityException
{
//-------------------------------------------------
// Filling and signing pdf
//Here we simulate a server sending the template and
//the client filling the fields and sign
//-------------------------------------------------
System.out.println("#> FILLING PDF");
File pdfTemplate = new File("template.pdf");
FileInputStream pdfTemplateFis = new
FileInputStream(pdfTemplate);
byte[] pdfTemplateFisBuffer = new
byte[pdfTemplateFis.available()];
pdfTemplateFis.read(pdfTemplateFisBuffer);
pdfTemplateFis.close();
File outputFilled1Pdf = new File("filled1.pdf");
FileOutputStream outputFilled1PdfFos = new
FileOutputStream(outputFilled1Pdf);
PdfReader reader = new PdfReader(pdfTemplateFisBuffer);
PdfStamper stamper = new PdfStamper(reader,
outputFilled1PdfFos);
AcroFields fields = stamper.getAcroFields();
fields.setField("FIELD1", "VALUE_FOR_FIELD_1");
stamper.close();
reader.close();
outputFilled1PdfFos.flush();
outputFilled1PdfFos.close();
System.out.println("#> SIGNING PDF");
File outputSignedPdf = new File("outputSig1.pdf");
//ItextSmartCardPdfSigner is my signer class
ItextSmartCardPdfSigner signer = new
ItextSmartCardPdfSigner("smartCardPasswordHere".toCharArray());
signer.sign(outputFilled1Pdf, outputSignedPdf, "reason",
"local",
"contact", 0, 1, "SignatureFieldNameHere");
System.out.println("#> PDF SIGNED");
//-------------------------------------------------
// Extracting Revision
//Here we intend to extract the revison on the
//client side to send only the revision back to server
//-------------------------------------------------
System.out.println("#> LOADING SIGNED FILE");
FileInputStream pdfSignedFis = new
FileInputStream(outputSignedPdf);
byte[] pdfSignedBuffer = new byte[pdfSignedFis.available()];
pdfSignedFis.read(pdfSignedBuffer);
pdfSignedFis.close();
File revisionFile = new File("revision.pdf");
FileOutputStream revisionFos = new
FileOutputStream(revisionFile);
PdfReader reader2 = new PdfReader(pdfSignedBuffer);
PdfStamper stamper2 = new PdfStamper(reader2, revisionFos);
System.out.println("#> EXTRACTING REVISION");
AcroFields revisionFields = stamper2.getAcroFields();
InputStream revisionIs =
revisionFields.extractRevision("Sig1"); //<--
revision is supposed to be here
System.out.println("#> INPUTSTREAM AVAIBLE COUNT : " +
revisionIs.available());
byte[] revisionBuffer = new byte[revisionIs.available()];
revisionIs.read(revisionBuffer);
revisionIs.close();
System.out.println("##> REVISION SIZE " +
revisionBuffer.length);
String revisionStr = new String(revisionBuffer);
System.out.println(revisionStr);
stamper2.close();
reader2.close();
revisionFos.flush();
revisionFos.close();
System.out.println("#> END OF REVISION EXTRACT");
//-------------------------------------------------
// Incremental Update (!i want to know how to do this
part!)
//Here we simulate the server received the revision
//and is trying to append the revision on the template
//-------------------------------------------------
System.out.println("#> STARTING THE INCREMENTAL UPDATE");
FileInputStream templateFis = new FileInputStream(pdfTemplate);
byte[] templateFisBuffer = new byte[templateFis.available()];
templateFis.read(templateFisBuffer);
templateFis.close();
File outputFile = new File("out.pdf");
FileOutputStream fos = new FileOutputStream(outputFile);
fos.write(templateFisBuffer);
fos.flush();
fos.write(revisionBuffer);
fos.flush();
fos.close();
System.out.println("#> END OF THE INCREMENTAL UPDATE");
}
}
--
View this message in context:
http://itext-general.2136553.n4.nabble.com/Pdf-Incremental-Updates-tp4659069p4659093.html
Sent from the iText - General mailing list archive at Nabble.com.
------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
iText-questions mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/itext-questions
iText(R) is a registered trademark of 1T3XT BVBA.
Many questions posted to this list can (and will) be answered with a reference
to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples:
http://itextpdf.com/themes/keywords.php