发新话题
打印

JOR苹果Mac OS X下有问题

JOR苹果Mac OS X下有问题

一.问题描述:
     1.模型定义面板的右键菜单无法弹出
     2.tomcat.with.jor 目录必须手动添加 logs 目录,否则 Tomcat 无法启动,报告:tomcat.with.jor/logs/catalina.out: No such file or directory
     3. designer/bin/start.sh 的执行脚本也有误。正确脚本见附件。
     4.运行Tomact中的示例时,在有数据的情况下,点击导出PDF时,报告:
     HTTP Status 500 -
javax.servlet.ServletException: The document has no pages.
        jatools.server.ReportExporter.service(ReportExporter.java:246)
        jatools.server.JatoolsReportServlet.jrservice(JatoolsReportServlet.java:57)
        jatools.server.JatoolsReportServlet.doGet(JatoolsReportServlet.java:81)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

二.系统环境:
     1.Mac OS X 版本: 10.6.5
     2.JDK 版本: 1.6.0_22-b04-307-10M3261

[ 本帖最后由 flashcloud 于 2010-11-16 15:30 编辑 ]
附件: 您所在的用户组无法下载或查看附件

TOP

1.模型定义面板的右键菜单无法弹出
有没有错误堆栈,如果有,请贴上来。

2.运行Tomact中的示例时,在有数据的情况下,点击导出PDF时,报告:
检查数据库连接有没有错误,还有,请确保,itext.jar包,是用我们jor自带的包,因为itext.jar是经过我们自己扩展的

TOP

楼主神速!这是做事的精神,赞一个!
关于错误堆栈我立即测试下,稍候给出。

PS: designer/bin/start.sh 的执行脚本也有误,见0楼的补充

TOP

刚仔细测试了,无错误堆栈信息。楼主可以测试下。同时还发现其他几个小问题,见0楼帖更新

PS:提个小建议,请见新帖

[ 本帖最后由 flashcloud 于 2010-11-16 15:30 编辑 ]

TOP

点击导出PDF时的log打印的错误堆栈

1.说明:报表显示有数据,itext.jar包未作替换
2.堆栈信息:
2010-11-16 15:35:24 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jatoolsreport threw exception
ExceptionConverter: java.io.IOException: The document has no pages.
        at com.lowagie.text.pdf.PdfPages.writePageTree(PdfPages.java:107)
        at com.lowagie.text.pdf.PdfWriter.close(PdfWriter.java:848)
        at com.lowagie.text.pdf.PdfDocument.close(PdfDocument.java:1043)
        at com.lowagie.text.Document.close(Document.java:497)
        at jatools.engine.export.pdf.PdfExport.close(PdfExport.java:141)
        at jatools.engine.export.pdf.PdfExport1.close(PdfExport1.java:91)
        at jatools.engine._Job.printAsPDF(_Job.java:87)
        at jatools.engine.ReportJob.printAsPDF(ReportJob.java:109)
        at jatools.server.ReportExporter.export(ReportExporter.java:82)
        at jatools.server.ReportExporter.service(ReportExporter.java:241)
        at jatools.server.JatoolsReportServlet.jrservice(JatoolsReportServlet.java:57)
        at jatools.server.JatoolsReportServlet.doGet(JatoolsReportServlet.java:81)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
        at java.lang.Thread.run(Thread.java:680)

TOP

用xls输出不知道是否可以? 我估计是没有报表页面输出,可调一下_Job ,是否有下面的 pages.length输出为0

    private static void generatePage(ReportDocument doc, Map paramValues, ExportRunnable runner,
        DisplayStyleManager styleManager) throws Exception {
        if (doc == null) {
            throw new Exception(Util.debug(logger, "doc is null"));
        }
        doc.validate();
        int count = 0;
        PageView[] pages = null;
        try {
            ReportPrinter printer = new ReportPrinter(doc, paramValues, styleManager);
            runner.init(printer);
            printer.print();
            pages = printer.getPages();
            for (int i = 0; i < pages.length; i++) {
                runner.view = pages;
                runner.index = i;
                runner.run();
                count++;
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        if (count == 0) {
            throw new Exception(App.messages.getString("res.49"));
        }
    }

TOP

XLS和RTF就没有任何问题的。我再测试下,有结果回复你,谢谢!

TOP

经跟踪调试,在你提到的_Job. generatePage() 方法中 pages.length输出是正确的。
         pages = printer.getPages();
            for (int i = 0; i < pages.length; i++) {
                runner.view = pages;
                runner.index = i;
                runner.run();
                count++;
            }
错误发生在 for 循环体内的 runner.run(); 语句,调用此语句后的错误堆栈如下,我猜测应该是与 jatools.properties 中无法读取字体路径有关。暂时未找到解决办法。赐教了!
ExceptionConverter: ExceptionConverter: java.lang.Exception: 既找不到字体 [Dialog ],也找不到默认字体.
        at com.lowagie.text.pdf.DefaultFontMapper.awtToPdf(DefaultFontMapper.java:61)
        at com.lowagie.text.pdf.PdfGraphics2D.getCachedBaseFont(PdfGraphics2D.java:895)
        at com.lowagie.text.pdf.PdfGraphics2D.setFont(PdfGraphics2D.java:887)
        at com.lowagie.text.pdf.PdfGraphics2D.<init>(PdfGraphics2D.java:167)
        at com.lowagie.text.pdf.PdfContentByte.createGraphics(PdfContentByte.java:2312)
        at jatools.engine.export.pdf.PdfExport.export(PdfExport.java:113)
        at jatools.engine.export.pdf.PdfExport1.export(PdfExport1.java:79)
        at jatools.engine.export.runnable.PdfRunnable.run(PdfRunnable.java:41)
        at jatools.engine._Job.generatePage(_Job.java:157)
        at jatools.engine._Job.printAsPDF(_Job.java:85)
        at jatools.engine.ReportJob.printAsPDF(ReportJob.java:109)
        at jatools.server.ReportExporter.export(ReportExporter.java:82)
        at jatools.server.ReportExporter.service(ReportExporter.java:241)
        at jatools.server.JatoolsReportServlet.jrservice(JatoolsReportServlet.java:57)
        at jatools.server.JatoolsReportServlet.doGet(JatoolsReportServlet.java:81)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at org.eclipse.equinox.http.registry.internal.ServletManager$ServletWrapper.service(ServletManager.java:180)
        at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61)
        at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:126)
        at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:318)

TOP

我将 jatools.properties 文件中的 “font.dirs=c:/winnt/fonts;d:/winnt/fonts;c:/windows/fonts;d:/windows/fonts;”
替换为“font.dirs=/Library/Fonts;/System/Library/Fonts” ,即 Mac OS X 的系统字体路径依然无法解决。我看了下iText.jar,楼主对 DefaultFontMapper 类作了更改,不知症结地否在此。

TOP

解决了!分享下,希望对楼主提高JOR的跨平台及Mac的苹果粉丝们有帮助!

经过源码查看,发现楼主自行扩展的iText.jar的 DefaultFontMapper.insertDirectory() 中 提供的默认字体为“宋体”,而Mac OS下本身不自带该字体,只有安装Mac版Office后,宋体才在 /Library/Fonts/Microsoft 下提供,字体文件名叫 “SimSun.ttf” 。发现原因,解决办法就简单了,修改 jatools.properties 文件的 font.dirs 属性,增加 /Library/Fonts/Microsoft,即 font.dirs=c:/winnt/fonts;d:/winnt/fonts;c:/windows/fonts;d:/windows/fonts;/Library/Fonts;/System/Library/Fonts;/Library/Fonts/Microsoft;

总共耗费了我两小时,汗,希望对楼主提供JOR的跨平台容错能力,杰表的产品成熟有用!也算是对楼主开源JOR的小小回报了!

但如果我修改设计器中的字体为其他字体,似乎仍会报错,我跟踪了jatools的源码,在
    public PdfExport(OutputStream os, Dimension size) {
        if (mapper == null) {
            mapper = new DefaultFontMapper();

            String fontDirs = System2.getProperty("font.dirs");
            String[] dirs = fontDirs.split(";");

            for (int i = 0; i < dirs.length; i++) {
                String dir = dirs.trim();

                if (!dir.equals("")) {
                    mapper.insertDirectory(dir);
                }
            }
        }
在mapper.insertDirectory(dir);中能提取所有指定的MAC下的字体文件,但不管是在设计器还是在WEB环境下导出PDF仍失败,只有靠楼主了!

[ 本帖最后由 flashcloud 于 2010-11-18 23:26 编辑 ]
附件: 您所在的用户组无法下载或查看附件

TOP

楼主辛苦。
至于mac字体,已经加载不能用,估计可能不是标准格式的ttf文件。烦请你贴上来一个mac字体文件,我们来测一下。


注: 如何在非windows操作系统中,使用windows字体进行pdf导出
jor的itext.jar是经过我们扩展的,目的是让 itext.jar 支持粗体,斜体,支持windows字体等。默认字体是宋体,jor会在你jatools.properties的font.dirs找匹配字体,如果找不到,会用宋体。

如果非windows操作系统,而且要进行pdf导出,需要设置把windows 操作系统下的 windows/fonts 所有字体,复制到你macos的一个目录中,如/myfonts中,然后 font.dirs指向它即可

font.dirs=/myfonts

这样做不知道,算不算侵权

TOP

是的,有些Mac字体是非ttf的,但标准的ttf也似出错。一劳永逸的办法就是将 Office of Mac 的 宋体字体文件 SimSun.ttf 所在的路径 /Library/Fonts/Microsoft 加入到 jatools.properties 。更多的测试以后有时间了再给出真正答案了。虽然只能用宋体,但能导出PDF就达到目的了。

TOP

关于 Mac 下设计器的 模型定义面板等 树形右键菜单无法弹出已找到答案

由于Mac 与 Windows 的操作模式问题,两者弹出触发器的时机不一样。

上下文菜单
上 下文菜单在Java中称为弹出菜单,Mac OS X平台完全支持这种菜单。在Mac OS X上,上下文菜单可以通过Control-click键或者right-click来触发。请注意,虽然Control-click和right- click会产生相同的结果,但它们是不同的鼠标事件。在Windows平台上,鼠标的右键是上下文菜单的标准触发器。

上下文菜单触发器的不同可能会导致一些零碎和有条件执行的代码。这两种触发器的一个重要的共同点就是使用鼠标点击。同样地,我们也有一个好方法来保证您的程序可以解析正确的上下文菜单出发器,那就是通过调用java.awt.event.MouseEvent.isPopupTrigger方法来请求AWT进行这个解析。

上述的方法在java.awt.event.MouseEvent包中定义,因为当某个构件上的鼠标事件被检测到时,需要在该构件的java.awt.event.MouseListener这个鼠标事件侦听方法中激活上下文菜单。重要的是如何以及何时可以检测正确的事件,在Mac OS X平台上,弹出触发器被设定为MOUSE_PRESSED,而在Windows上则被设定为MOUSE_RELEASED,即鼠标松开的时机。为了程序的可移植性,这两种情况都需要加以考虑,如“Java应用程序的Info.plist文件”部分所示。

--原文引自:http://blog.csdn.net/casularm/archive/2008/12/29/3636049.aspx(CSDN也有此好文啊 )。

建议JOR的开发者参考实现之。

我只能临时将JOR.SRC 的 XmlSourceTree.TreeMouserListener.mouseReleased()方法按如下代码小改造下。不过,这样左键也会弹出了。虽然上述参考可以尝试,没有这个精力了,留给我们亲爱的JOR们了!

        public void mouseReleased(MouseEvent e) {
            if (enablePopup) {
      String os = System.getProperty("os.name");
                if (e.isPopupTrigger() || "Mac OS X".equalsIgnoreCase(os))
{

                    int row = getRowForLocation(e.getX(), e.getY());

                    if (row != -1) {
                        setSelectionInterval(row, row);

                        TreePath path = getPathForRow(row);
                        DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
                        TreeNodeValue nodeValue = (TreeNodeValue) node.getUserObject();

                        JPopupMenu menu = TreePopupFactory.createPopup(XmlSourceTree.this,
                                nodeValue.getSourceType(), node);

                        if (menu != null) {
                            Rectangle b = getPathBounds(getSelectionPath());

                            menu.show(e.getComponent(), e.getX(), b.y + b.height);
                        }
                    }
                }
            }
        }

[ 本帖最后由 flashcloud 于 2010-11-20 15:47 编辑 ]

TOP

发新话题