You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Shi Jinghai <hu...@hotmail.com> on 2015/07/15 07:20:06 UTC
I need some advices/guides on whether to upgrade to FOP 2.0 in OFBiz trunk.
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 <sc...@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>
>>
>>
>>
Re: I need some advices/guides on whether to upgrade to FOP 2.0 in OFBiz trunk.
Posted by Shi Jinghai <hu...@hotmail.com>.
Jacopo,
Thank you. I'll test the barcode.
在 2015-7-15,下午10:18,Jacopo Cappellato <ja...@hotwaxsystems.com> 写道:
> +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 <hu...@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 <sc...@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>
>>>>
>>>>
>>>>
>>
>
Re: I need some advices/guides on whether to upgrade to FOP 2.0 in OFBiz trunk.
Posted by Jacopo Cappellato <ja...@hotwaxsystems.com>.
+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 <hu...@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 <sc...@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>
>>>
>>>
>>>
>