我正在使用iText阅读PDF文档。我得到一个ArrayIndexOutOfBoundsException。奇怪的是它只发生在某些文件和这些文件中的某些位置。我怀疑这与PDF在这些位置编码的方式有关,但无法弄清问题是什么。
我看过这个问题Read pdf using iText,但他似乎通过改变这个文件的位置来解决他的问题。这对我来说不起作用,因为我在某些文件中的某些位置获得了异常 - 所以它不是文件本身,而是导致异常的相关页面。
堆栈跟踪
线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:无效索引:02 at com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID(Unknown Source) at com.lowagie.text.pdf.CMapAwareDocumentFont.decode(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor $ ShowText.invoke(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent(Unknown Source) at com.lowagie.text.pdf.parser.PdfTextExtractor.getTextFromPage(Unknown Source) 在com.pdfextractor.main.Extractor.main(Extractor.java:61)
第61行对应此行:
content = extractor.getTextFromPage(page);
所以很明显getTextFromPage()方法不起作用。
public static void main(String[] args) throws IOException{
ArrayList<String> keywords = new ArrayList<String>();
keywords.add("location");
keywords.add("Mass Spectrometry");
keywords.add("vacuole");
keywords.add("cytosol");
String directory = "C:/Ankur/Projects/PEB/Extractor/papers/";
File directoryToRead = new File(directory);
String[] sa_filesToRead = directoryToRead.list();
List<String> filesToRead = Arrays.asList(sa_filesToRead);
Iterator<String> fileItr = filesToRead.iterator();
while(fileItr.hasNext()){
String nextFile = fileItr.next();
PdfReader reader = new PdfReader(directory+nextFile);
int noPages = reader.getNumberOfPages();
PdfTextExtractor extractor = new PdfTextExtractor(reader);
String content="";
for(int page=1;page<=noPages;page++){
int index = 1;
System.out.println(page);
content = extractor.getTextFromPage(page);
}
}
}
答案 0 :(得分:1)
大多数Java类/库希望像getTextFromPage(int)
这样的方法从0开始编制索引 - 这意味着getTextFromPage(0)
应该从第1页返回文本,getTextFromPage(1)
应该从页面返回文本2。
导致ArrayIndexOutOfBoundsException的for循环从1开始编制索引。
您确定iText的getTextFromPage(int)
是从1开始编号而不是(几乎)标准0吗?
答案 1 :(得分:0)
您是否尝试在非常活跃的IText邮件列表上发帖?
答案 2 :(得分:0)
我有一个类似的问题,它总是出现在文本包含特殊字符的地方。我想知道是否有办法解决编码问题。
(更新) 我在5.1.3的com.itextpdf.itextpdf中遇到了这个问题,但在更新到5.3.4之后。这个问题已得到解决。