Java 使用iText读取pdf时出错

Java 使用iText读取pdf时出错,java,itext,pdf-reader,Java,Itext,Pdf Reader,我已经编写了一个简单的程序,从一个pdf文件中读取,代码如下所示,我正在上载两个pdf文件,它们读取pdf并以字符串格式返回数据,问题是第一个pdf文件被完全读取,当我再次尝试读取同一个pdf时,会导致以下错误: //Fetch media from media1 InputStream is; is = media1.getStreamData(); PdfReaderUtility pru = new PdfReaderUtility(); String s1 = pru.readPdfFi

我已经编写了一个简单的程序,从一个pdf文件中读取,代码如下所示,我正在上载两个pdf文件,它们读取pdf并以字符串格式返回数据,问题是第一个pdf文件被完全读取,当我再次尝试读取同一个pdf时,会导致以下错误:

//Fetch media from media1
InputStream is;
is = media1.getStreamData();
PdfReaderUtility pru = new PdfReaderUtility();
String s1 = pru.readPdfFile(is);
tb1.setText(s1);
//Fetch media from media2

InputStream ins;
ins = media2.getStreamData();
PdfReaderUtility pru2 = new PdfReaderUtility();
pru2.readPdfFile(ins);
String s2 = pru.readPdfFile(ins);
tb2.setText(s2);
错误::

12:31:18,763 SEVERE [org.zkoss] (http-localhost-127.0.0.1-8080-5) >>org.zkoss.zk.ui.UiException: com.lowagie.text.exceptions.InvalidPdfException: PDF header signature not found.
>>com.lowagie.text.exceptions.InvalidPdfException: PDF header signature not found.
>>  at com.lowagie.text.pdf.PRTokeniser.checkPdfHeader(PRTokeniser.java:204)
>>  at com.lowagie.text.pdf.PdfReader.readPdf(PdfReader.java:492)
>>  at com.lowagie.text.pdf.PdfReader.<init>(PdfReader.java:233)
>>  at com.lowagie.text.pdf.PdfReader.<init>(PdfReader.java:243)
>>  at com.abc.utility.PdfReaderUtility.readPdfFile(PdfReaderUtility.java:15)
>>  at com.abc.controller.ComparisonFormController.onClick$submitButton(ComparisonFormController.java:99)
>>  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>>  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>  at java.lang.reflect.Method.invoke(Method.java:606)
>>  at org.zkoss.zk.ui.event.GenericEventListener.onEvent(GenericEventListener.java:82)
>>  at org.zkoss.zk.ui.AbstractComponent.onEvent(AbstractComponent.java:2742)
>>  at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2713)
>>  at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2654)
>>  at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:136)
>>  at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:534)
>>  at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.sendEvent(EventProcessingThreadImpl.java:126)
>>  at org.zkoss.zk.ui.event.Events.sendEvent(Events.java:338)
>>  at org.zkoss.zk.ui.event.Events.sendEvent(Events.java:348)
>>  at org.zkoss.zk.ui.AbstractComponent$ForwardListener.onEvent(AbstractComponent.java:3180)
>>  at org.zkoss.zk.ui.AbstractComponent.onEvent(AbstractComponent.java:2742)
>>  at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2713)
>>  at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2654)
>>  at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:136)
>>  at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:534)
>>  at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.run(EventProcessingThreadImpl.java:461)
12:31:18763严重[org.zkoss](http-localhost-127.0.0.1-8080-5)>>org.zkoss.zk.ui.UiException:com.lowagie.text.exceptions.invaliddfdfeption:PDF头签名未找到。
>>com.lowagie.text.exceptions.InvalidPdfException:未找到PDF标头签名。
>>请访问com.lowagie.text.pdf.PRTokeniser.checkPdfHeader(PRTokeniser.java:204)
>>请访问com.lowagie.text.pdf.PdfReader.readPdf(PdfReader.java:492)
>>请访问com.lowagie.text.pdf.PdfReader(PdfReader.java:233)
>>请访问com.lowagie.text.pdf.PdfReader(PdfReader.java:243)
>>在com.abc.utility.pdfreaderputility.readPdfFile(pdfreaderputility.java:15)
>>在com.abc.controller.ComparisonFormController.onClick$submitButton上(ComparisonFormController.java:99)
>>在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
>>在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
>>在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
>>位于java.lang.reflect.Method.invoke(Method.java:606)
>>位于org.zkoss.zk.ui.event.GenericEventListener.onEvent(GenericEventListener.java:82)
>>位于org.zkoss.zk.ui.AbstractComponent.OneEvent(AbstractComponent.java:2742)
>>位于org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2713)
>>位于org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2654)
>>位于org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:136)
>>位于org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:534)
>>位于org.zkoss.zk.ui.impl.EventProcessingThreadImpl.sendEvent(EventProcessingThreadImpl.java:126)
>>位于org.zkoss.zk.ui.event.Events.sendEvent(Events.java:338)
>>位于org.zkoss.zk.ui.event.Events.sendEvent(Events.java:348)
>>位于org.zkoss.zk.ui.AbstractComponent$ForwardListener.onEvent(AbstractComponent.java:3180)
>>位于org.zkoss.zk.ui.AbstractComponent.OneEvent(AbstractComponent.java:2742)
>>位于org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2713)
>>位于org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2654)
>>位于org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:136)
>>位于org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:534)
>>位于org.zkoss.zk.ui.impl.EventProcessingThreadImpl.run(EventProcessingThreadImpl.java:461)
任何小费都行

这是我的PdfReaderUtility

public String readPdfFile(InputStream is) throws IOException {

        // loads the pdf file.
        PdfReader pr = new PdfReader(is);

        // Used for the reading purpose
        PdfTextExtractor pte = new PdfTextExtractor(pr);

        int noOfPages = pr.getNumberOfPages();
        String wholeText="";
        String page="";
        for(int i = 1 ; i <= noOfPages;i++) {
            page = pte.getTextFromPage(i);
            wholeText+=page;
        }

        wholeText.trim();

        return wholeText;
    }
公共字符串readPdfile(InputStream is)引发IOException{
//加载pdf文件。
PdfReader pr=新PdfReader(is);
//用于阅读目的
PDFTEXTRACTOR pte=新的PDFTEXTRACTOR(pr);
int noOfPages=pr.getNumberOfPages();
字符串wholeText=“”;
字符串页=”;

对于(int i=1;i,在第二段代码中,使用
pru
而不是
pru2

String s2 = pru.readPdfFile(ins);
应该是:

String s2 = pru2.readPdfFile(ins);
完整来源

//Fetch media from media1
InputStream is;
is = media1.getStreamData();
PdfReaderUtility pru = new PdfReaderUtility();
String s1 = pru.readPdfFile(is);
tb1.setText(s1);
//Fetch media from media2

InputStream ins;
ins = media2.getStreamData();
PdfReaderUtility pru2 = new PdfReaderUtility();
pru2.readPdfFile(ins);
String s2 = pru2.readPdfFile(ins); //replaced pru with pru2
tb2.setText(s2);

对于第二个文件,您使用输入流两次,在第二次使用时,它必须失败:

ins = media2.getStreamData();
PdfReaderUtility pru2 = new PdfReaderUtility();
pru2.readPdfFile(ins);
String s2 = pru.readPdfFile(ins);
看最后两行

我想这是一个复制粘贴错误,这两行应该是一行:

ins = media2.getStreamData();
PdfReaderUtility pru2 = new PdfReaderUtility();
String s2 = pru2.readPdfFile(ins);

@Aayush Kevin的评论只涵盖了问题的一部分。真正的问题是他将
pru
替换为
pru2
。@Kevin Bowersox和mkl谢谢,我太累了,我多次比较了代码,但我错过了你的建议。。。