+1 to migrate to FOP 2.0 But if you do, please test that barcodes are properly rendered. Barcodes are generated using framework/base/lib/barcode4j-2.1-barcode4j-fop-ext-complete.jar and we have to make sure this version works with the new FOP 2.0.
Regards, Jacopo On Jul 15, 2015, at 7:20 AM, Shi Jinghai <huaru...@hotmail.com> wrote: > Hi, > > I'm working on OFBIZ-6504. As Scott pointed out, my current implement is not > good enough, so I tried the FOP 1.1 native encryption without lucky, FOP 2.0 > encryption works well in my environment. > > Could I upgrade FOP to 2.0 in OFBiz trunk? If yes, what test cases should I > be more careful? > > The source file affected: > framework/webapp/src/org/ofbiz/webapp/view/ApacheFopWorker.java > > The following jars will be changed: > in application/content/lib: > fontbox: from 1.7.1 to 1.8.5 > > in framework/base/lib: > batik-all: from 1.7 to 1.8 > fop: from 1.1 to 2.0 > xmlgraphics-commons: from 1.5 to 2.0.1 > > New jar: > avalon-ffamcework: 4.2.0 > > The pdfbox and jempbox in application/content/lib will be upgrade to 1.8.5 > with the font box. > > The native encryption: > FOP 1.1: http://xmlgraphics.apache.org/fop/1.1/pdfencryption.html > FOP 2.0: http://xmlgraphics.apache.org/fop/2.0/pdfencryption.html > > Kind Regards, > > Shi Jinghai/Langhua > > > 在 2015-7-13,下午4:19,Scott Gray <scott.g...@hotwaxsystems.com> 写道: > >> Is it our plan to fill the example component with things like this? It >> seems like such an obscure requirement. >> >> Once upon a time the example application was intended to provide examples >> of core framework usage. I don't think we're demonstrating the power of >> the framework here when the example requires quite a large amount of code >> to add a password. >> >> Also, it looks like you're creating the PDF with FOP (via screens) then >> deconstructing it with PDFBox and regenerating it with a password? Also, >> what is ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar? I >> think we have some admin stuff to do when adding new libs. >> >> Lastly, if we were to be "selling" this as a framework feature, I would >> expect the renderer to simply take some special input parameters in the >> context that indicate the need for password protection and the passwords to >> use and then have the renderer do it itself. >> >> >> Regards >> Scott >> >> On 13 July 2015 at 07:46, <sh...@apache.org> wrote: >> >>> Author: shijh >>> Date: Sun Jul 12 19:46:54 2015 >>> New Revision: 1690515 >>> >>> URL: http://svn.apache.org/r1690515 >>> Log: >>> OFBIZ-6504. >>> >>> Add an example to protect a pdf generated by FOP with owner password and >>> user password. >>> >>> Added: >>> ofbiz/trunk/specialpurpose/example/config/examplepdf.properties >>> (with props) >>> ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar (with >>> props) >>> >>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java >>> (with props) >>> Modified: >>> ofbiz/trunk/specialpurpose/example/build.xml >>> ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml >>> ofbiz/trunk/specialpurpose/example/ofbiz-component.xml >>> >>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml >>> ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml >>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml >>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml >>> >>> Modified: ofbiz/trunk/specialpurpose/example/build.xml >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/build.xml?rev=1690515&r1=1690514&r2=1690515&view=diff >>> >>> ============================================================================== >>> --- ofbiz/trunk/specialpurpose/example/build.xml (original) >>> +++ ofbiz/trunk/specialpurpose/example/build.xml Sun Jul 12 19:46:54 2015 >>> @@ -51,5 +51,6 @@ under the License. >>> <fileset dir="../../framework/webapp/lib" includes="*.jar"/> >>> <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/> >>> <fileset dir="../../framework/common/build/lib" includes="*.jar"/> >>> + <fileset dir="../../applications/content/lib" includes="*.jar"/> >>> </path> >>> </project> >>> >>> Modified: ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml?rev=1690515&r1=1690514&r2=1690515&view=diff >>> >>> ============================================================================== >>> --- ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml >>> (original) >>> +++ ofbiz/trunk/specialpurpose/example/config/ExampleUiLabels.xml Sun Jul >>> 12 19:46:54 2015 >>> @@ -1108,4 +1108,20 @@ >>> <value xml:lang="zh">ä½ ä¿®æ”¹äº†é€‰æ‹©æ¡†ä¸çš„值</value> >>> <value xml:lang="zh-TW">ä½ ä¿®æ”¹äº†é ¸æ“‡æ¡†ä¸çš„值</value> >>> </property> >>> + <property key="ExamplePdfPassword"> >>> + <value xml:lang="en">PDF With Password</value> >>> + <value xml:lang="zh">有密ç çš„PDF</value> >>> + </property> >>> + <property key="PageTitleSetExamplePdfPassword"> >>> + <value xml:lang="en">Set PDF Protected By Password</value> >>> + <value xml:lang="zh">设置有密ç ä¿ æŠ¤çš„PDF</value> >>> + </property> >>> + <property key="ExampleGeneratePDF"> >>> + <value xml:lang="en">Generate PDF</value> >>> + <value xml:lang="zh">ç”Ÿæˆ PDF</value> >>> + </property> >>> + <property key="password_did_not_match_confirm_password"> >>> + <value xml:lang="en">Password did not match confirm >>> password.</value> >>> + <value xml:lang="zh">密ç ä¸ŽéªŒè¯ å¯†ç ä¸ ä¸€è‡´ã€‚</value> >>> + </property> >>> </resource> >>> >>> Added: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/config/examplepdf.properties?rev=1690515&view=auto >>> >>> ============================================================================== >>> --- ofbiz/trunk/specialpurpose/example/config/examplepdf.properties (added) >>> +++ ofbiz/trunk/specialpurpose/example/config/examplepdf.properties Sun >>> Jul 12 19:46:54 2015 >>> @@ -0,0 +1,24 @@ >>> >>> +############################################################################### >>> +# Licensed to the Apache Software Foundation (ASF) under one >>> +# or more contributor license agreements. See the NOTICE file >>> +# distributed with this work for additional information >>> +# regarding copyright ownership. The ASF licenses this file >>> +# to you under the Apache License, Version 2.0 (the >>> +# "License"); you may not use this file except in compliance >>> +# with the License. You may obtain a copy of the License at >>> +# >>> +# http://www.apache.org/licenses/LICENSE-2.0 >>> +# >>> +# Unless required by applicable law or agreed to in writing, >>> +# software distributed under the License is distributed on an >>> +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> +# KIND, either express or implied. See the License for the >>> +# specific language governing permissions and limitations >>> +# under the License. >>> >>> +############################################################################### >>> + >>> +# If Y, the default.pdf.owner.password will be used as owner password, >>> the user input password will be used as user password; >>> +# if N, the user input password will be used as owner password and user >>> password. >>> +use.default.pdf.owner.password=N >>> + >>> +default.pdf.owner.password=ofbiz >>> >>> Propchange: ofbiz/trunk/specialpurpose/example/config/examplepdf.properties >>> >>> ------------------------------------------------------------------------------ >>> svn:mime-type = text/plain >>> >>> Added: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar?rev=1690515&view=auto >>> >>> ============================================================================== >>> Binary file - no diff available. >>> >>> Propchange: ofbiz/trunk/specialpurpose/example/lib/bcprov-jdk15-1.44.jar >>> >>> ------------------------------------------------------------------------------ >>> svn:mime-type = application/octet-stream >>> >>> Modified: ofbiz/trunk/specialpurpose/example/ofbiz-component.xml >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/ofbiz-component.xml?rev=1690515&r1=1690514&r2=1690515&view=diff >>> >>> ============================================================================== >>> --- ofbiz/trunk/specialpurpose/example/ofbiz-component.xml (original) >>> +++ ofbiz/trunk/specialpurpose/example/ofbiz-component.xml Sun Jul 12 >>> 19:46:54 2015 >>> @@ -30,6 +30,7 @@ under the License. >>> >>> <!-- load single or multiple external libraries --> >>> <classpath type="jar" location="build/lib/*"/> >>> + <classpath type="jar" location="lib/*"/> >>> >>> <!-- entity resources: model(s), eca(s), group, and data definitions >>> --> >>> <entity-resource type="model" reader-name="main" loader="main" >>> location="entitydef/entitymodel.xml"/> >>> >>> Added: >>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java?rev=1690515&view=auto >>> >>> ============================================================================== >>> --- >>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java >>> (added) >>> +++ >>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java >>> Sun Jul 12 19:46:54 2015 >>> @@ -0,0 +1,220 @@ >>> >>> +/******************************************************************************* >>> + * Licensed to the Apache Software Foundation (ASF) under one >>> + * or more contributor license agreements. See the NOTICE file >>> + * distributed with this work for additional information >>> + * regarding copyright ownership. The ASF licenses this file >>> + * to you under the Apache License, Version 2.0 (the >>> + * "License"); you may not use this file except in compliance >>> + * with the License. You may obtain a copy of the License at >>> + * >>> + * http://www.apache.org/licenses/LICENSE-2.0 >>> + * >>> + * Unless required by applicable law or agreed to in writing, >>> + * software distributed under the License is distributed on an >>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> + * KIND, either express or implied. See the License for the >>> + * specific language governing permissions and limitations >>> + * under the License. >>> + >>> *******************************************************************************/ >>> +package org.ofbiz.example; >>> + >>> +import java.io.ByteArrayInputStream; >>> +import java.io.ByteArrayOutputStream; >>> +import java.io.IOException; >>> +import java.io.StringReader; >>> +import java.io.StringWriter; >>> +import java.io.Writer; >>> +import java.util.Locale; >>> +import java.util.Map; >>> + >>> +import javax.servlet.ServletContext; >>> +import javax.servlet.http.HttpServletRequest; >>> +import javax.servlet.http.HttpServletResponse; >>> +import javax.xml.parsers.ParserConfigurationException; >>> +import javax.xml.transform.stream.StreamSource; >>> + >>> +import org.apache.fop.apps.FOPException; >>> +import org.apache.fop.apps.Fop; >>> +import org.apache.fop.apps.MimeConstants; >>> +import org.apache.pdfbox.exceptions.COSVisitorException; >>> +import org.apache.pdfbox.pdmodel.PDDocument; >>> +import org.apache.pdfbox.pdmodel.encryption.AccessPermission; >>> +import org.apache.pdfbox.pdmodel.encryption.BadSecurityHandlerException; >>> +import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy; >>> +import org.ofbiz.base.util.Debug; >>> +import org.ofbiz.base.util.GeneralException; >>> +import org.ofbiz.base.util.UtilCodec; >>> +import org.ofbiz.base.util.UtilHttp; >>> +import org.ofbiz.base.util.UtilProperties; >>> +import org.ofbiz.base.util.UtilValidate; >>> +import org.ofbiz.entity.Delegator; >>> +import org.ofbiz.entity.util.EntityUtilProperties; >>> +import org.ofbiz.webapp.view.ApacheFopWorker; >>> +import org.ofbiz.widget.renderer.FormStringRenderer; >>> +import org.ofbiz.widget.renderer.ScreenRenderer; >>> +import org.ofbiz.widget.renderer.ScreenStringRenderer; >>> +import org.ofbiz.widget.renderer.macro.MacroFormRenderer; >>> +import org.ofbiz.widget.renderer.macro.MacroScreenRenderer; >>> +import org.xml.sax.SAXException; >>> + >>> +import freemarker.template.TemplateException; >>> + >>> + >>> +public class ExampleEvents { >>> + >>> + public static final String module = ExampleEvents.class.getName(); >>> + >>> + public static final String examplePdfProperties = >>> "examplepdf.properties"; >>> + >>> + public static final boolean useExampleDefaultOwnerPassword = >>> UtilProperties.getPropertyValue(examplePdfProperties, >>> "use.default.pdf.owner.password", "N").equalsIgnoreCase("Y"); >>> + >>> + public static final String exampleDefaultOwnerPassword = >>> UtilProperties.getPropertyValue(examplePdfProperties, >>> "default.pdf.owner.password", "ofbiz"); >>> + >>> + public static final String resourceExample = "ExampleUiLables"; >>> + >>> + /** Set password to the specified example and output the generated >>> PDF. >>> + *@param request The HTTPRequest object for the current request >>> + *@param response The HTTPResponse object for the current request >>> + *@return String specifying the exit status of this event >>> + */ >>> + public static String setExamplePdfPassword(HttpServletRequest >>> request, HttpServletResponse response) { >>> + Delegator delegator = (Delegator) >>> request.getAttribute("delegator"); >>> + Locale locale = UtilHttp.getLocale(request); >>> + ServletContext servletContext = >>> request.getSession().getServletContext(); >>> + >>> + Map<String, Object> requestParams = >>> UtilHttp.getParameterMap(request); >>> + String password = (String) requestParams.get("PASSWORD"); >>> + String confirmPassword = (String) >>> requestParams.get("CONFIRM_PASSWORD"); >>> + >>> + if (UtilValidate.isEmpty(password) && >>> UtilValidate.isEmpty(confirmPassword) && >>> (UtilValidate.isEmpty(exampleDefaultOwnerPassword) || >>> !useExampleDefaultOwnerPassword)) { >>> + return "nopassword"; >>> + } >>> + if (UtilValidate.isNotEmpty(password) && >>> !password.equals(confirmPassword)) { >>> + String errMsg = UtilProperties.getMessage(resourceExample, >>> "password_not_equal_confirm_password", locale); >>> + request.setAttribute("_ERROR_MESSAGE_", errMsg); >>> + return "error"; >>> + } >>> + >>> + // get the original pdf >>> + String screenLocation = >>> "component://example/widget/example/ExampleScreens.xml"; >>> + String reportScreenName = "ExampleReport"; >>> + >>> + // render a screen to get the XML document >>> + Writer reportWriter = new StringWriter(); >>> + >>> + try { >>> + ScreenStringRenderer foScreenRenderer = new >>> MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", " >>> screenfop.name", delegator), >>> EntityUtilProperties.getPropertyValue("widget", "screenfop.screenrenderer", >>> delegator)); >>> + FormStringRenderer formStringRenderer = new >>> MacroFormRenderer(EntityUtilProperties.getPropertyValue("widget", >>> "screenfop.formrenderer", delegator), request, response); >>> + ScreenRenderer screens = new ScreenRenderer(reportWriter, >>> null, foScreenRenderer); >>> + screens.populateContextForRequest(request, response, >>> servletContext); >>> + >>> + // this is the object used to render forms from their >>> definitions >>> + screens.getContext().put("formStringRenderer", >>> formStringRenderer); >>> + screens.getContext().put("simpleEncoder", >>> UtilCodec.getEncoder(EntityUtilProperties.getPropertyValue("widget", >>> "screenfop.encoder", delegator))); >>> + >>> + screens.render(screenLocation, reportScreenName); >>> + } catch (GeneralException e) { >>> + String errMsg = "General error rendering screen [" + >>> screenLocation + "]: " + e.toString(); >>> + Debug.logError(e, errMsg, module); >>> + request.setAttribute("_ERROR_MESSAGE_", errMsg); >>> + return "error"; >>> + } catch (IOException e) { >>> + String errMsg = "IO error rendering screen [" + >>> screenLocation + "]: " + e.toString(); >>> + Debug.logError(e, errMsg, module); >>> + request.setAttribute("_ERROR_MESSAGE_", errMsg); >>> + return "error"; >>> + } catch (SAXException e) { >>> + String errMsg = "SAX (XML parse) error rendering screen [" + >>> screenLocation + "]: " + e.toString(); >>> + Debug.logError(e, errMsg, module); >>> + request.setAttribute("_ERROR_MESSAGE_", errMsg); >>> + return "error"; >>> + } catch (ParserConfigurationException e) { >>> + String errMsg = "Parser configuration error rendering screen >>> [" + screenLocation + "]: " + e.toString(); >>> + Debug.logError(e, errMsg, module); >>> + request.setAttribute("_ERROR_MESSAGE_", errMsg); >>> + return "error"; >>> + } catch (TemplateException e) { >>> + String errMsg = "Freemarker template error rendering screen >>> [" + screenLocation + "]: " + e.toString(); >>> + Debug.logError(e, errMsg, module); >>> + request.setAttribute("_ERROR_MESSAGE_", errMsg); >>> + return "error"; >>> + } >>> + >>> + // set the input source (XSL-FO) and generate the PDF >>> + StreamSource src = new StreamSource(new >>> StringReader(reportWriter.toString())); >>> + >>> + // create the output stream for the generation >>> + ByteArrayOutputStream out = new ByteArrayOutputStream(); >>> + >>> + try { >>> + Fop fop = ApacheFopWorker.createFopInstance(out, >>> MimeConstants.MIME_PDF); >>> + ApacheFopWorker.transform(src, null, fop); >>> + out.flush(); >>> + out.close(); >>> + } catch (FOPException e) { >>> + request.setAttribute("_ERROR_MESSAGE_", e.getMessage()); >>> + Debug.logError(e, module); >>> + return "error"; >>> + } catch (IOException e) { >>> + request.setAttribute("_ERROR_MESSAGE_", e.getMessage()); >>> + Debug.logError(e, module); >>> + return "error"; >>> + } >>> + >>> + // parse the pdf with PDFBox >>> + ByteArrayInputStream is = new >>> ByteArrayInputStream(out.toByteArray()); >>> + PDDocument document; >>> + try { >>> + document = PDDocument.load(is); >>> + int keyLength = 40; >>> + AccessPermission ap = new AccessPermission(); >>> + String ownerPassword = exampleDefaultOwnerPassword; >>> + if (UtilValidate.isEmpty(ownerPassword) || >>> !useExampleDefaultOwnerPassword) { >>> + ownerPassword = password; >>> + } >>> + StandardProtectionPolicy spp = new >>> StandardProtectionPolicy(ownerPassword, password, ap); >>> + spp.setEncryptionKeyLength(keyLength); >>> + document.protect(spp); >>> + } catch (IOException e) { >>> + request.setAttribute("_ERROR_MESSAGE_", e.getMessage()); >>> + Debug.logError(e, module); >>> + return "error"; >>> + } catch (BadSecurityHandlerException e) { >>> + request.setAttribute("_ERROR_MESSAGE_", e.getMessage()); >>> + Debug.logError(e, module); >>> + return "error"; >>> + } finally { >>> + try { >>> + if (is != null) { >>> + is.close(); >>> + } >>> + } catch (IOException e) { >>> + // ignore >>> + } >>> + } >>> + >>> + out = new ByteArrayOutputStream(); >>> + try { >>> + document.save(out); >>> + // set the content type and length >>> + response.setContentType(MimeConstants.MIME_PDF); >>> + response.setContentLength(out.size()); >>> + out.flush(); >>> + out.close(); >>> + // write to the browser >>> + response.getOutputStream().write(out.toByteArray()); >>> + response.getOutputStream().flush(); >>> + } catch (COSVisitorException e) { >>> + request.setAttribute("_ERROR_MESSAGE_", e.getMessage()); >>> + Debug.logError(e, module); >>> + return "error"; >>> + } catch (IOException e) { >>> + request.setAttribute("_ERROR_MESSAGE_", e.getMessage()); >>> + Debug.logError(e, module); >>> + return "error"; >>> + } >>> + >>> + return "success"; >>> + } >>> + >>> +} >>> >>> Propchange: >>> ofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleEvents.java >>> >>> ------------------------------------------------------------------------------ >>> svn:mime-type = text/plain >>> >>> Modified: >>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml?rev=1690515&r1=1690514&r2=1690515&view=diff >>> >>> ============================================================================== >>> --- >>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml >>> (original) >>> +++ >>> ofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/controller.xml >>> Sun Jul 12 19:46:54 2015 >>> @@ -225,6 +225,19 @@ under the License. >>> <response name="success" type="view" value="ExamplePieChart"/> >>> </request-map> >>> >>> + <!-- Pdf Report Options --> >>> + <request-map uri="ExampleReportPdfOptions"> >>> + <security https="true" auth="true"/> >>> + <response name="success" type="view" >>> value="ExampleReportPdfOptions"/> >>> + </request-map> >>> + <request-map uri="setExamplePdfPassword"> >>> + <security https="true" auth="true"/> >>> + <event type="java" path="org.ofbiz.example.ExampleEvents" >>> invoke="setExamplePdfPassword"/> >>> + <response name="success" type="none"/> >>> + <response name="nopassword" type="view" value="ExampleReportPdf"/> >>> + <response name="error" type="view" >>> value="ExampleReportPdfOptions"/> >>> + </request-map> >>> + >>> <!-- end of request mappings --> >>> >>> <!-- View Mappings --> >>> @@ -283,5 +296,6 @@ under the License. >>> application/vnd.oasis.opendocument.presentation >>> --> >>> >>> + <view-map name="ExampleReportPdfOptions" type="screen" >>> page="component://example/widget/example/ExampleScreens.xml#ExampleReportPdfOptions"/> >>> <!-- end of view mappings --> >>> </site-conf> >>> >>> Modified: >>> ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff >>> >>> ============================================================================== >>> --- ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml >>> (original) >>> +++ ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml >>> Sun Jul 12 19:46:54 2015 >>> @@ -103,6 +103,10 @@ under the License. >>> <parameter >>> param-name="exampleId"/> >>> <image url-mode="raw" >>> src="${iconsLocation}/page_white_acrobat.png"/> >>> </link> >>> + <link >>> target="ExampleReportPdfOptions" text="${uiLabelMap.ExamplePdfPassword}" >>> style="buttontext"> >>> + <parameter >>> param-name="exampleId"/> >>> + <image url-mode="raw" >>> src="${iconsLocation}/page_white_acrobat.png"/> >>> + </link> >>> <link target="help" >>> text="${uiLabelMap.CommonHelp}" style="buttontext" target-window="_blank"> >>> <parameter >>> param-name="topic" value="ExampleEditHelp"/> >>> <image url-mode="raw" >>> src="${iconsLocation}/help.png"/> >>> >>> Modified: >>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml?rev=1690515&r1=1690514&r2=1690515&view=diff >>> >>> ============================================================================== >>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml >>> (original) >>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml Sun >>> Jul 12 19:46:54 2015 >>> @@ -311,4 +311,11 @@ under the License. >>> </field> >>> <field name="submitButton" >>> title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field> >>> </form> >>> + >>> + <form name="SetExamplePdfPassword" type="single" >>> target="setExamplePdfPassword" title=""> >>> + <field name="exampleId"><hidden/></field> >>> + <field name="PASSWORD" >>> title="${uiLabelMap.CommonPassword}"><password size="15" >>> maxlength="250"/></field> >>> + <field name="CONFIRM_PASSWORD" >>> title="${uiLabelMap.CommonPassword}" tooltip="* >>> ${uiLabelMap.CommonConfirm}"><password size="15" maxlength="250"/></field> >>> + <field name="submitButton" >>> title="${uiLabelMap.ExampleGeneratePDF}"><submit >>> button-type="button"/></field> >>> + </form> >>> </forms> >>> >>> Modified: >>> ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml?rev=1690515&r1=1690514&r2=1690515&view=diff >>> >>> ============================================================================== >>> --- ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml >>> (original) >>> +++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml >>> Sun Jul 12 19:46:54 2015 >>> @@ -494,4 +494,21 @@ under the License. >>> </widgets> >>> </section> >>> </screen> >>> + >>> + <screen name="ExampleReportPdfOptions"> >>> + <section> >>> + <actions> >>> + <set field="titleProperty" >>> value="PageTitleSetExamplePdfPassword"/> >>> + <set field="tabButtonItem" value="EditExample"/> >>> + <set field="exampleId" from-field="parameters.exampleId"/> >>> + </actions> >>> + <widgets> >>> + <decorator-screen name="CommonExampleDecorator" >>> location="${parameters.mainDecoratorLocation}"> >>> + <decorator-section name="body"> >>> + <include-form name="SetExamplePdfPassword" >>> location="component://example/widget/example/ExampleForms.xml"/> >>> + </decorator-section> >>> + </decorator-screen> >>> + </widgets> >>> + </section> >>> + </screen> >>> </screens> >>> >>> >>> >