Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复PdfArray无法强制转换到PRStream_Java_Itextsharp_Itext - Fatal编程技术网

Java 如何修复PdfArray无法强制转换到PRStream

Java 如何修复PdfArray无法强制转换到PRStream,java,itextsharp,itext,Java,Itextsharp,Itext,为了阅读pdf文件,我使用了下面的代码段来处理iText库。但是,对于某些pdf文档,它会抛出一个异常,如下面的代码所示。我不明白为什么对某些文档发送此异常,但对另一些文档则不抛出此异常。此外,我如何解决这个问题 注:以下代码用于从pdf中提取文本,即pd fto txt转换器 private ArrayList<byte[]> contentOfPdf() { PdfReader reader = null; PdfDictionary dictionary =

为了阅读pdf文件,我使用了下面的代码段来处理iText库。但是,对于某些pdf文档,它会抛出一个异常,如下面的代码所示。我不明白为什么对某些文档发送此异常,但对另一些文档则不抛出此异常。此外,我如何解决这个问题

注:以下代码用于从pdf中提取文本,即pd fto txt转换器

private ArrayList<byte[]> contentOfPdf() {
    PdfReader reader = null;

    PdfDictionary dictionary = null;
    PRIndirectReference reference = null;

    PRStream contentStream = null;
    ArrayList<byte []> byteStream = new ArrayList<byte []>();

    try{
        reader = new PdfReader(this.filename);

        for(int currentPage = 0 ; currentPage <= this.totalPageNumber ; currentPage ++ ) {

            dictionary = reader.getPageN(currentPage);
            reference = (PRIndirectReference) dictionary.get(PdfName.CONTENTS);
/*line 166*/ contentStream = (PRStream) PdfReader.getPdfObject(reference);

            byteStream.add( PdfReader.getStreamBytes(contentStream) );
        }
    } catch(Exception e){
        e.printStackTrace();
    } finally {
        reader.close();
    }

    return byteStream;
}

每当你手动浏览PDF时,我强烈建议你在附近有一份PDF规范的副本,并查找每个键。在您的情况下,如果查找
CONTENTS
键,您将看到它显示:

该值应为单个流或一组流

我不是一个Java爱好者,但下面的C#代码应该很容易转换为Java,并且应该满足您的需求:

//将保存一个引用数组
PdfArray refs=null;
//如果我们有一个数组,直接使用它
if(dictionary.Get(PdfName.CONTENTS.IsArray()){
refs=dictionary.GetAsArray(PdfName.CONTENTS);
//如果我们只有一个引用,那么为了方便起见,将其包装在单个项数组中
}else if(dictionary.Get(PdfName.CONTENTS.IsIndirect()){
refs=newpdfarray(dictionary.Get(PdfName.CONTENTS));
//对于合格的PDF,不应进行健全性检查
}否则{
抛出新的ApplicationException(“未知内容类型”);
}
//循环遍历每个引用
foreach(参考文献中的变量r){
//这里的代码相同
reference=(PRIndirectReference)r;
contentStream=(PRStream)PdfReader.GetPdfObject(引用);
添加(PdfReader.GetStreamBytes(contentStream));
}

事实上,你并没有“解决这个问题”。在某个地方,您正在犯一个逻辑错误,即在is-a关系中使用两个不相关的类型,或者由has-a关系关联的类型。你不能把这一个抛到另一个身上,因为不存在一种关系。这就像说你的脚是一只鞋,而不是说你脚上穿了一只鞋。检查哪些元素是正确的,并使用它们来代替。@Stultuske,但是,对于某些文档来说这是可行的,我得到了结果。另一方面,对于某些文档,它抛出此异常。这两个文档是PDF格式的。我想知道为什么它会对某些情况抛出例外,而对另一些情况则不是。这个问题是另一个论坛上的重复,Zmavus说我只是试图从pdf中提取文本。这与问题中给出的代码完全矛盾!文本提取是通过
com.itextpdf.pdf.parser
类完成的,而不是在不考虑XObject、字体和其他资源的情况下提取内容流@BrunoLowagie我为什么要考虑XObject?为什么我要获取“字体”信息?你说你想知道页面流中的文本是什么。通过忽略XObject,可以忽略大块文本。通过忽略字体,您的文本可能看起来乱七八糟(直到您了解更多编码)。这就是为什么。问题实际上是由
PdfReader.getStreamBytes(contentStream)
引起的。它返回PdfArray,即问题仍然存在。@Zmavus问题实际上是由-No引起的,它是由您铸造
(PRIndirectReference)dictionary.get(PdfName.CONTENTS)
(PRStream)PdfReader.getPdfObject(reference)
引起的。正如本文和iText邮件列表中所解释的,内容可以是流或流的数组。因此,当您获取内容时,您可能会获取对流的引用、对数组的引用,或者立即获取一个数组。相应地修复代码。
java.lang.ClassCastException: com.itextpdf.text.pdf.PdfArray cannot be cast to com.itextpdf.text.pdf.PRStream
at pdfCrawler.retrieveContentOfPdf(CrawlerTask.java:166)
at pdfCrawler.call(CrawlerTask.java:55)
at pdfCrawler..call(CrawlerTask.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)