Динамическое создание и загрузка offline Adobe Forms может вам потребоваться в том случае, если имеется один общий Adobe документ, но в зависимотси от условий значение некоторых полей будет изменяться.
Разработка будет вестись на SAP AS JAVA 7.31 и 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 его необходимо добавить в вашу View, из которой будет выполняться вызов методов. Это делается в Properties View в разделе References
6. Генерируем xml на основе xsd или просто пишем его руками - неважно. Главное чтоб документ был валидный.
После создания документа его необходимо добавит в наш проект:
Открываем перспективу Web Dynpro -> Открываем наш проект -> Переходим в директорию, указанную на рисунке ниже -> импортируем из файловой системы.
7. Для разработки шаблона Adobe документа потребуется Adobe Life Cycle Designer.
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;
}
Разработка будет вестись на 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 для работы с Offline Interactive Adobe Forms |
6. Генерируем xml на основе xsd или просто пишем его руками - неважно. Главное чтоб документ был валидный.
После создания документа его необходимо добавит в наш проект:
Открываем перспективу Web Dynpro -> Открываем наш проект -> Переходим в директорию, указанную на рисунке ниже -> импортируем из файловой системы.
Добавление ресурсов в проект |
7. Для разработки шаблона Adobe документа потребуется Adobe Life Cycle Designer.
- Создаю новый проект
- Перехожу на вкладку Data View, создаю новый Data Connection
- Источник данных выбираю либо XML Schema либо Sample XML Data
- Накидываю компоненты на форму и создаю Binding (либо сразу перетягиваю их мышью на Форму из Data View)
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;
}
Спасибо Дима, помог.
ОтветитьУдалитьРад, что статья пригодилась :)
УдалитьЭтот комментарий был удален автором.
УдалитьЭтот комментарий был удален автором.
Удалить