lunedì 5 novembre 2012

Binding xml con un pdf in c#

L'esempio seguente permette di fare un binding tra un file xml e un pdf in ambiente .Net con linguaggio c#.
Immaginiamo un file .aspx con due soli campi: una listbox e un pulsante.
All'evento click del pulsante alcuni "campi testo" di un documento pdf "example.pdf" verranno popolati con dei valori presenti in un file xml "example.xml" e verrà creato su di un path (ad esempio c:\).
La listbox è per il tracciamento delle operazioni.
Tool/ambienti utilizzati: .Net 2005, Acrobat Professional e SDK 9 di Adobe.
Sorgente e immagini:

protected void btnExample_Click(object sender, EventArgs e)
{
 Object newDoc = new Object();

 string sourceDocument = @"" + Server.HtmlEncode(Request.PhysicalApplicationPath) +
  "example.pdf"; //where is pdf
 string outputString = @"c:\\";  //path output pdf
 string pathXmlToMerge = @"C:\example.xml";//is file temp

 //create a file xml to merge
 CreateXmlFileNamePdf(pathXmlToMerge, ddlist.Text);

 bool booleOpenDocument;

 AcroAVDoc avDoc = new AcroAVDoc();
 CAcroApp acroApp = new AcroAppClass();

 booleOpenDocument = avDoc.Open(sourceDocument, "");
 if (!booleOpenDocument)
  listOperation.Items.Add("Failed to open source document.");

 CAcroPDDoc pdDoc = (CAcroPDDoc)avDoc.GetPDDoc();

 Object jsObj = pdDoc.GetJSObject();

 object[] getTemplateParam = { "Templates:1" };
 Object template = new Object();

 Type T = jsObj.GetType();
 template = T.InvokeMember(
  "getTemplate",
  BindingFlags.InvokeMethod |
  BindingFlags.Public |
  BindingFlags.Instance,
  null, jsObj, getTemplateParam);

 if (template == null)
 {
  template = T.InvokeMember(
   "createTemplate",
   BindingFlags.InvokeMethod |
   BindingFlags.Public |
   BindingFlags.Instance,
   null, jsObj, getTemplateParam);
 }

 if (template == null)
 {
  listOperation.Items.Add("Failed to acquire form template.");
  avDoc.Close(1);
  acroApp.CloseAllDocs();
  acroApp.Exit();
 }
 object[] spawnParam = { 1, false, false };

 try
 {
  for (int i = 0; i < 1; i++)
  {
   Type templateType = template.GetType();
   templateType.InvokeMember(
    "spawn",
    BindingFlags.InvokeMethod |
    BindingFlags.Public |
    BindingFlags.Instance,
    null, template, spawnParam);

   object[] extractPagesParam = { 1 };
   newDoc = T.InvokeMember(
    "extractPages",
    BindingFlags.InvokeMethod |
    BindingFlags.Public |
    BindingFlags.Instance,
    null, jsObj, extractPagesParam);

   //merge xml to pdf
   object[] importTextDataParam = { pathXmlToMerge, 0 };
   T.InvokeMember(
    "importXFAData",
    BindingFlags.InvokeMethod |
    BindingFlags.Public |
    BindingFlags.Instance,
    null, newDoc, importTextDataParam);

   //save pdf
   object[] saveAsParam = { outputString + "example_" + nameFilePdf +
    ".pdf" };
   T.InvokeMember(
    "saveAs",
    BindingFlags.InvokeMethod |
    BindingFlags.Public |
    BindingFlags.Instance,
    null, newDoc, saveAsParam);

   bool formDataExists = true;

   object[] closeDocParam = { !formDataExists };
   T.InvokeMember(
    "closeDoc",
    BindingFlags.InvokeMethod |
    BindingFlags.Public |
    BindingFlags.Instance,
    null, newDoc, closeDocParam);
  }
  avDoc.Close(1);
  acroApp.CloseAllDocs();
  acroApp.Exit();
  listOperation.Items.Add("File PDF created.");
 }
 catch (Exception ex)
 {
  listOperation.Items.Add("Error: " + ex.Message);
 }
}

Configurazione progetto:


Operazioni:


Output su pdf: