суббота, 13 октября 2012 г.

Динамическое создание и скачивание offline Adobe Interactive Forms на WebDynpro for Java/ Dynamically creating and downloads offline Adobe Interactive Forms on WebDynpro for Java

     Динамическое создание и загрузка offline Adobe Forms может вам потребоваться в том случае, если имеется один общий Adobe документ, но в зависимотси от условий значение некоторых полей будет изменяться.

Разработка будет вестись на SAP AS JAVA 7.31 и NWDS соответствующей версии.

Предварительное требование:


  • Установленный и настроенный ADS
  • Adobe LCD 9.8 (можно другую версию)
  • Настроенный NWDS



Что необходимо сделать:

1. Создать SC и DC типа WebDynpro
2. Создать Application в WD
3. Создать Component, Window, View
4. Создать Model, если необходимо (я использую EJB)
5. Создать Custom Controller (необязательно, но более структурированно и красиво)
6. Разработать xml (желательно на основе xsd)
7. Разработать шаблон Adobe InteractiveForms (xdp)
8. Разработка кода

Перейду непосредственно к реализации функционала, пропустив первые четыре пункта, так как они являются стандартными, и перейду сразу к контроллеру

5.
Custom controller for Offline Adobe Interactive Forms
Custom Controller для работы с Offline Interactive Adobe Forms
После создания Custom Controller его необходимо добавить в вашу View, из которой будет выполняться вызов методов. Это делается в Properties View в разделе References

6. Генерируем xml на основе xsd или просто пишем его руками - неважно. Главное чтоб документ был валидный.

После создания документа его необходимо добавит в наш проект:
Открываем перспективу Web Dynpro -> Открываем наш проект -> Переходим в директорию, указанную на рисунке ниже -> импортируем из файловой системы. 


Adding resources to Project
Добавление ресурсов в проект


7.  Для разработки шаблона Adobe документа потребуется Adobe Life Cycle Designer.

  • Создаю новый проект
  • Перехожу на вкладку Data View, создаю новый Data Connection

New Data Connection
New Data Connection
  • Источник данных выбираю либо XML Schema либо Sample XML Data



  • Накидываю компоненты на форму и создаю Binding (либо сразу перетягиваю их мышью на Форму из Data View)

Binding
Binding

  • После подготовки формы, сохраняю в формате xdp
  • Импортирую в проект, как описано в пункте 6

8.   Теперь все готово для написания кода (конечно кроме размещения компонентов на View и создания Actions)

В моем Custom Controller' е (AdobeCtrl) используется один public метод, он может быть доступен другим контроллерам. Остальные методы расположены в секции //@@begin others и имеют модификатор доступа private.

Доступ из View к AdobeCtrl можно получить следующим способом:
wdThis.wdGetAdobeCtrlController()

Сам код:

  //@@begin javadoc:generatePDF()
  /**
   * Генерирует AdobeForm (PDF) и возвращает в виде IWDResource
   */
  //@@end

public com.sap.tc.webdynpro.services.sal.datatransport.api.IWDResource generatePDF( int typeDoc, java.lang.String name )  {
    //@@begin generatePDF()
byte[] data = null;
String xmlPath="";
try{
IWDPDFDocumentHandler hndlr = WDPDFDocumentFactory.getDocumentHandler();
IWDPDFDocumentCreationContext cxt = hndlr.getDocumentCreationContext();

switch (typeDoc) {
case 1:
cxt.setTemplate(WDURLGenerator.getResourcePath(wdComponentAPI.getDeployableObjectPart(), "Form1.xdp"));
xmlPath = WDURLGenerator.getResourcePath(wdComponentAPI.getDeployableObjectPart(),"Form1.xml");
break;
case 2:
cxt.setTemplate(WDURLGenerator.getResourcePath(wdComponentAPI.getDeployableObjectPart(), "Form2.xdp"));
xmlPath = WDURLGenerator.getResourcePath(wdComponentAPI.getDeployableObjectPart(),"Form2.xml");
break;
default:
return null;
}

data = insertDataToXml(xmlPath);
cxt.setData(data);

IWDPDFDocument document = cxt.execute();
return WDResourceFactory.createResource(document.getPDF(),name,WDWebResourceType.PDF);
}catch (Exception e) {
e.printStackTrace();
}
return null;
   //@@end
}

//@@begin others

private void setItemTagValue( org.w3c.dom.Document doc, java.lang.String parentTag, java.lang.String childTag, int item, java.lang.String value )  {

String strNodeValue = null;
Node xmlRootTagNode = doc.getElementsByTagName(parentTag).item(item);

if (xmlRootTagNode != null){
NodeList xmlItemNodeList = xmlRootTagNode.getChildNodes();

for (int iCtr = 0; iCtr < xmlItemNodeList.getLength(); iCtr++) {
Node xmlChildNode = xmlItemNodeList.item(iCtr);

if (xmlChildNode.getNodeName() == childTag) {
Node xmlChildNodeValue = xmlChildNode.getChildNodes().item(0);
if (xmlChildNodeValue == null) {
xmlChildNode.appendChild( doc.createTextNode(value));
} else {
xmlChildNodeValue.setNodeValue(value);
}
}
}
}
}

public void setTagValue( org.w3c.dom.Document doc, java.lang.String tag, java.lang.String value )  {

Node xmlTagNode = doc.getElementsByTagName(tag).item(0);
Node xmlTagValue = xmlTagNode.getChildNodes().item(0);

if (xmlTagValue == null) {
xmlTagNode.appendChild(doc.createTextNode(value));
} else {
xmlTagValue.setNodeValue(value);
}
}

public byte[] insertDataToXml( java.lang.String xmlPath )  {

Document xmlDoc = getDocument(xmlPath);

        // Для примера нужно заменить свои кодом
setTagValue(xmlDoc, "ns1:ReportingDate",wdContext.currentPeriodElement().getDescr());

setItemTagValue(xmlDoc, "ns1:NameSigner1", "ns1:FirstName", 0, "Имя Signer1");
return getDataFromDocument(xmlDoc);
}

public org.w3c.dom.Document getDocument( java.lang.String xmlPath )  {
Document doc = null;
try{
FileReader fr = new FileReader(xmlPath);
InputSource in = new InputSource(fr);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();

return db.parse(in);
}catch (Exception e) {
return null;
}
}

public byte[] getDataFromDocument( org.w3c.dom.Document doc )  {
try {
Source source = new DOMSource(doc);
ByteArrayOutputStream out = new ByteArrayOutputStream();
Result result = new StreamResult(out);

TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.transform(source, result);
return out.toByteArray();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
return null;
}


4 комментария: