Jdeveloper itext致命的内部错误

时间:2014-06-25 12:21:29

标签: jsp itext jdeveloper

我正在使用Jdeveloper来使用JSP创建动态PDF。但是,在编译代码时出现“错误:内部编译错误,以致命异常终止”。 我不确定问题是什么。 我的JSP页面(名称Make.jsp)的代码是:

<%@ page import="java.text.*,java.util.*,java.sql.*,javax.servlet.Filter.*,javax.sql.*,java.io.*"  %>
<%@ page import="com.itextpdf.text.*,com.itextpdf.text.pdf.*"  %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN "http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html;charset=windows-1252"%>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/>
   <title>Make</title>
 </head>
 <body>
<%
 OutputStream file=new FileOutputStream(new File("E:\\CreatedPDF\\JdevFile.pdf"));
 Document document=new Document();
 PdfWriter.getInstance(document,file);
 document.open();
 document.add(new Paragraph("Hello World"));
 document.close();
%>
</body>

日志文件显示以下内容:

   errorFound:         true
   class:              _Make
   method:              void _jspService(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
  field:               

  source:              C:\Users\e\Documents\BHEL Bhopal\jdevstudio1013\jdev\mywork\Test\EstimationProj\public_html\WEB-INF\classes\.jsps\_Make.java
   line:                56

    java.lang.NullPointerException
    at oracle.ojc.compiler.Symbol.checkForAmbigousImport(Symbol.java:261)
    at oracle.ojc.compiler.UnresolvedClassSymbol.resolveType(Symbol.java:8515)
    at  oracle.ojc.compiler.UnresolvedClassSymbol.resolveActualTypeParameters(Symbol.java:8260)
    at oracle.ojc.compiler.UnresolvedClassSymbol.resolveType(Symbol.java:8527)
    at oracle.ojc.compiler.ClassFileReader.readClassFile(ClassFileReader.java:1684)
    at oracle.ojc.compiler.RawClassSymbol.loadType(Symbol.java:6418)
    at oracle.ojc.compiler.RawClassSymbol.loadType(Symbol.java:6402)
    at oracle.ojc.compiler.ImportDescriptor.importInnerClasses(Parser.java:8780)
    at oracle.ojc.compiler.ImportDescriptor.importInnerClasses(Parser.java:8807)
    at oracle.ojc.compiler.ImportDescriptor.importInnerClasses(Parser.java:8807)
    at oracle.ojc.compiler.ImportSymbol.resolveAndCheck(Symbol.java:11257)
    at oracle.ojc.compiler.StorageScope.lookupSpecificSymbolInScope(Scope.java:823)
    at oracle.ojc.compiler.PackageScope.lookupSpecificSymbol(Scope.java:1088)
    at oracle.ojc.compiler.ClassScope.lookupSpecificSymbol(Scope.java:1282)
    at oracle.ojc.compiler.MethodScope.lookupSpecificSymbol(Scope.java:1414)
    at oracle.ojc.compiler.BlockScope.lookupSpecificSymbol(Scope.java:1518)
    at oracle.ojc.compiler.MemberExpression.resolveQualifiedName(Expression.java:1540)
    at oracle.ojc.compiler.InvokeExpression.resolveAndCheck(Expression.java:5094)
    at oracle.ojc.compiler.ExpressionStatement.resolveAndCheck(Statement.java:225)
    at oracle.ojc.compiler.StatementList.resolveAndCheck(Statement.java:4476)
    at oracle.ojc.compiler.TryStatement.resolveAndCheck(Statement.java:3499)
    at oracle.ojc.compiler.StatementList.resolveAndCheck(Statement.java:4476)
    at oracle.ojc.compiler.MethodSymbol.resolveMethod(Symbol.java:10822)
    at oracle.ojc.compiler.RawClassSymbol.resolveMethodBodies(Symbol.java:6648)
    at oracle.ojc.compiler.Parser.resolveMethodBodies(Parser.java:8316)
    at oracle.ojc.compiler.Parser.parse(Parser.java:7823)
    at oracle.ojc.compiler.Compiler.main_internal(Compiler.java:978)
    at oracle.ojc.compiler.Compiler.main(Compiler.java:745)
    at oracle.jdeveloper.compiler.Ojc.translate(Ojc.java:1486)
    at oracle.jdeveloper.compiler.UnifiedBuildSystem$CompileThread.buildGraph(UnifiedBuildSystem.java:300)
    at oracle.jdeveloper.compiler.UnifiedBuildSystem$CompileThread.buildProjectFiles(UnifiedBuildSystem.java:516)
    at oracle.jdeveloper.compiler.UnifiedBuildSystem$CompileThread.buildAll(UnifiedBuildSystem.java:715)
    at oracle.jdeveloper.compiler.UnifiedBuildSystem$CompileThread.run(UnifiedBuildSystem.java:893)

我在Eclipse上尝试了上面的代码并且它工作正常,但我正在为一个组织工作,他们希望我只在jdeveloper上工作。所以,如果有人能够指出问题,那将会非常有帮助。 我正在使用Jdeveloper 10g和itext 5.5.1

1 个答案:

答案 0 :(得分:0)

PDF是二进制格式。每个PDF都以%PDF-开头,以%%EOF结尾。在它们之间,有一些对象,其中一些对象包含二进制流。

正如您(应该)所知,JSP不应该用于创建二进制文件,因此您需要&#34;要求&#34;从JSP创建PDF是......不明智。可以从JSP创建PDF。这是一个概念证明:http://itextpdf.com:8180/book/helloworld.jsp

本POC是在我的书"iText in Action - Second Edition"的上下文中编写的,用于解释为什么从JSP创建PDF是个坏主意。如果您需要参数来确保编写您的要求的人看到他的方式和重新考虑的错误,您可以使用该书中的secion 9.1.3。

至于你的代码。这在许多层面都是错误的。

例如,PDF应以%PDF-开头,而JSP文件的结果应以:

开头
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/>
    <title>Make</title>
</head>
<body>

这个HTML,而不是PDF,它将如何运作? (它不是!)

我想您想要将PDF发送到浏览器。但是,我看到您创建了FileOutputStream。这意味着您要在服务器上创建文件,更具体地说,在E:磁盘上创建文件。如果您的Web服务器可以访问该磁盘,那真的会让我感到惊讶。 (这是可能的,但做这样的事情并不明智。)

异常本身可能与iText无关。它说的是含糊不清的导入。您正在导入:

  • java.text中。*
  • java.util中。*
  • java.sql中。*
  • javax.servlet.Filter的。*
  • javax.sql中。*
  • java.io。*
  • com.itextpdf.text。*
  • com.itextpdf.text.pdf。*

在这些包的不同中使用了大量的类名。例如:有java.util.List,还有com.itextpdf.text.List。这是一个简单的示例,我并不是说这是您的异常的原因,但 草率使用*而不是导入您的特定类需要。

长话短说:请丢掉你的代码。不要像在Chapter 9 of my book中那样使用JSP编写Servlet。