4

我试图将简单的 XHTML 文件转换为 PDF,并使用 Flying Saucer 和 iText 来实现。它在 Java 中没有问题,但是,当我尝试使用相同的代码制作 Lotus Notes 代理时,我遇到了一个我不确定如何处理的异常。

编码:

import lotus.domino.*;
import java.io.*;
import com.lowagie.text.DocumentException;
import org.xhtmlrenderer.pdf.ITextRenderer; 
import org.xhtmlrenderer.util.XRLog;
import java.util.*;

public class JavaAgent extends AgentBase {

    public void NotesMain() {

      try {
        Session session = getSession();
        AgentContext agentContext = session.getAgentContext();
        String received = agentContext.getDocumentContext().
             getItemValueString("Query_String");
        String[] split;
        split = received.split("&");
        String url = split[1];
        split = url.split("/");
        String outputFile = split[split.length-1];
        String direc = session.getEnvironmentString("Directory", true);
        outputFile = direc + "\\" + outputFile + ".pdf"; 
        OutputStream os = new FileOutputStream(outputFile);
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(url);
        renderer.layout();
        renderer.createPDF(os);
        os.close();
        System.exit(0);

      } catch(Exception e) {
        e.printStackTrace();
      }
   }
}

这会产生以下结果:

2011 年 9 月 5 日 13:33:29 HTTP JVM:无法初始化飞碟库的配置。消息是:找不到包 java.util.PropertyResourceBundle 的资源,键 access_properties_not_allowed

2011 年 9 月 5 日 13:33:29 HTTP JVM:java.util.MissingResourceException:找不到包 java.util.PropertyResourceBundle 的资源,键 access_properties_not_allowed

2011 年 9 月 5 日 13:33:29 HTTP JVM:在 java.util.MissingResourceException.(MissingResourceException.java:50)

2011 年 9 月 5 日 13:33:29 HTTP JVM:在 java.util.ResourceBundle.getObject(ResourceBundle.java:400)

2011 年 9 月 5 日 13:33:29 HTTP JVM:在 java.util.ResourceBundle.getString(ResourceBundle.java:421)

09-05-2011 13:33:29 HTTP JVM:在 lotus.notes.JavaString.getString(未知来源)

2011 年 9 月 5 日 13:33:29 HTTP JVM:在 lotus.notes.AgentSecurityManager.checkPropertiesAccess(未知来源)

2011 年 9 月 5 日 13:33:30 HTTP JVM:在 java.lang.System.getProperties(System.java:323)

2011 年 9 月 5 日 13:33:30 HTTP JVM:在 org.xhtmlrenderer.util.Configuration.loadSystemProperties(Configuration.java:419)

2011 年 9 月 5 日 13:33:30 HTTP JVM:在 org.xhtmlrenderer.util.Configuration.(Configuration.java:147)

2011 年 9 月 5 日 13:33:30 HTTP JVM:在 org.xhtmlrenderer.util.Configuration.instance(Configuration.java:742)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 org.xhtmlrenderer.util.Configuration.valueFor(Configuration.java:463)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 org.xhtmlrenderer.util.Configuration.isTrue(Configuration.java:709)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 org.xhtmlrenderer.util.XRLog.init(XRLog.java:250)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 org.xhtmlrenderer.util.XRLog.log(XRLog.java:203)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 org.xhtmlrenderer.util.XRLog.render(XRLog.java:194)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 org.xhtmlrenderer.util.XRLog.render(XRLog.java:190)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 org.xhtmlrenderer.layout.SharedContext.(SharedContext.java:107)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 org.xhtmlrenderer.pdf.ITextRenderer.(ITextRenderer.java:111)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 org.xhtmlrenderer.pdf.ITextRenderer.(ITextRenderer.java:102)

2011 年 9 月 5 日 13:33:31 HTTP JVM:在 JavaAgent.NotesMain(未知来源)

09-05-2011 13:33:31 HTTP JVM:在 lotus.domino.AgentBase.runNotes(未知来源)

09-05-2011 13:33:31 HTTP JVM:在 lotus.domino.NotesThread.run(未知来源)

违规行是

ITextRenderer renderer = new ITextRenderer();

谷歌搜索“access_properties_not_allowed”实际上什么也没有。

4

2 回答 2

5

1) Notes/Domino 中的代理在设置代理的安全级别的代理属性中具有附加的安全特性。默认情况下,此设置设置为不允许受限操作(默认设置为“不允许受限操作”)。

为了让代理运行该属性,它必须设置为以下选项之一:

“允许受限操作” “允许具有完全管理权限的受限操作”

该属性位于“代理属性”对话框的第二个选项卡,即键选项卡上。

2) 正如“通往 yamburg 的道路”已经解释的那样,JVM 的安全管理器不允许访问系统的属性,因为安全策略未指定允许此操作。您必须更改 Java 虚拟机 (JVM) 的安全策略才能允许访问系统属性。为此,您可以添加“permission java.security.AllPermission;”行 到 Notes/Domino 目录中的“/jvm/lib/security/java.policy”文件。

进行更改后,java.policy 文件将与此类似:

grant { 
    permission java.security.AllPermission;
    permission java.util.PropertyPermission "java.version", "read";
    permission java.util.PropertyPermission "java.vendor", "read";
    permission java.util.PropertyPermission "java.vendor.url", "read";
    permission java.util.PropertyPermission "java.class.version", "read";
    permission java.util.PropertyPermission "os.name", "read";
        // ... and so on ...
}

一旦客户端/服务器重新启动,任何需要访问 System.getProperties() 的 Java 程序现在都将被授予访问权限。

于 2011-05-10T06:53:59.163 回答
1

这可能是安全配置:

XhtmlRenderer 尝试从系统属性中读取其配置:

09-05-2011 13:33:30 HTTP JVM: at java.lang.System.getProperties(System.java:323)
09-05-2011 13:33:30 HTTP JVM: at org.xhtmlrenderer.util.Configuration.loadSystemProperties(Configuration.java:419)

但这是不允许的(SecurityManager),

09-05-2011 13:33:29 HTTP JVM: at lotus.notes.AgentSecurityManager.checkPropertiesAccess(Unknown Source)

必须有一个异常被抛出、捕获并且需要产生一个错误信息。该错误消息必须从资源包中加载,但找不到该包。

09-05-2011 13:33:29 HTTP JVM: Could not initialize configuration for Flying Saucer library. Message is: Can't find resource for bundle java.util.PropertyResourceBundle, key access_properties_not_allowed

解决方案:

  • 尝试查找 Lotus Domino JVM 的安全属性(不知道它们可能在或应该在哪里),并让代码读取系统属性

或者

  • 为 org.xhtmlrenderer 包打补丁以捕获安全异常并自行处理它们。
于 2011-05-09T14:53:26.523 回答