线程" main"中的例外情况java.lang.reflect.InvocationTargetException

时间:2017-08-01 06:53:19

标签: java itext

我正在使用iText PDF 5.5.11将PDF转换为XML。我已经在stackoverflow上检查了类似的答案。当我在ubuntu上使用命令行运行jar文件时,我收到以下错误。 java版本" 1.8.0_101"

 Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoClassDefFoundError: org/bouncycastle/asn1/ASN1Encodable
    at com.itextpdf.text.pdf.PdfEncryption.<init>(PdfEncryption.java:147)
    at com.itextpdf.text.pdf.PdfReader.readDecryptedDocObj(PdfReader.java:1063)
    at com.itextpdf.text.pdf.PdfReader.readDocObj(PdfReader.java:1469)
    at com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:751)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:198)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:236)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:224)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:214)
    at test.pdfreader.readXml(pdfreader.java:34)
    at test.pdfreader.main(pdfreader.java:30)

我对java不太熟悉。我使用PHP exec函数从PHP调用这个jar文件。 下面是我用来将PDF转换为XML的代码。

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.XfaForm;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class pdfreader {
    public static void main(String[] args) throws IOException, DocumentException, TransformerException {
        String SRC = "";
        String DEST = "";

        for (String s : args) {
            SRC = args[0];
            DEST = args[1];
        }
        File file = new File(DEST);
        file.getParentFile().mkdirs();
        new pdfreader().readXml(SRC, DEST);
    }

    public void readXml(String src, String dest) throws IOException, DocumentException, TransformerException {
        PdfReader reader = new PdfReader(src);

        AcroFields form = reader.getAcroFields();
        XfaForm xfa = form.getXfa();
        Node node = xfa.getDatasetsNode();
        NodeList list = node.getChildNodes();
        for (int i = 0; i < list.getLength(); ++i) {
            if ("data".equals(list.item(i).getLocalName())) {
                node = list.item(i);

                break;
            }
        }
        list = node.getChildNodes();

        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.setOutputProperty("encoding", "UTF-8");
        tf.setOutputProperty("indent", "yes");
        FileOutputStream os = new FileOutputStream(dest);

        tf.transform(new DOMSource(node), new StreamResult(os));
        reader.close();
    }
}

2 个答案:

答案 0 :(得分:3)

当您将Maven用于Java项目时,您需要做的就是为iText添加依赖项。然后Maven将处理所有传递依赖,如BouncyCastle。 Maven带走了所有繁重的工作。 同样的原则适用于Gradle等其他构建系统。

现在,如果你想手动完成并在你的类路径上放置正确的jar,那么你需要做一些功课。这意味着查看每个依赖项的pom.xml,查看它们具有哪些传递依赖项,这些依赖项具有哪些依赖项,等等 ad nauseam

如果是iText,您可以查看Maven Central上可以找到的pom.xmlhttps://search.maven.org/#artifactdetails%7Ccom.itextpdf%7Citextpdf%7C5.5.11%7Cjar

特别是这部分:

  <dependencies>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk15on</artifactId>
      <version>1.49</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcpkix-jdk15on</artifactId>
      <version>1.49</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.santuario</groupId>
      <artifactId>xmlsec</artifactId>
      <version>1.5.1</version>
      <optional>true</optional>
    </dependency>
  </dependencies>

这告诉您iText 5.5.11对BouncyCastle 1.49具有可选的依赖性。

BouncyCastle即使进行微小更新也会随机更改和破坏其API,这就是为什么您需要非常精确地使用BouncyCastle版本。

答案 1 :(得分:0)

您好,只需将zookeeper.service文件更改为Environment =“ KAFKA_ARGS = -javaagent:/home/ec2-user/prometheus/jmx_prometheus_javaagent-0.3.1.jar=8080:/ home / ec2-user / prometheus / kafka- 0-8-2.yml”到下面,问题已解决: Environment =“ KAFKA_OPTS = -javaagent:/home/ec2-user/prometheus/jmx_prometheus_javaagent-0.3.1.jar=8080:/home/ec2-user/prometheus/zookeeper.yml”