gpt4 book ai didi

java - 使用Java读取Excel中嵌入的pdf文件

转载 作者:行者123 更新时间:2023-12-01 14:12:01 24 4
gpt4 key购买 nike

我是 Java 编程新手。我当前的项目要求我读取 Excel 工作表中的嵌入(ole)文件并获取其中的文本内容。阅读嵌入式 Word 文件的示例效果很好,但是我无法找到阅读嵌入式 pdf 文件的帮助。通过查看类似的例子尝试了一些事情......但没有成功。

http://poi.apache.org/spreadsheet/quick-guide.html#Embedded

我有下面的代码,也许在帮助下我可以找到正确的方向。我使用 Apache POI 读取 excel 中的嵌入文件,并使用 pdfbox 来解析 pdf 数据。

public class ReadExcel1 {

public static void main(String[] args) {

try {

FileInputStream file = new FileInputStream(new File("C:\\test.xls"));

POIFSFileSystem fs = new POIFSFileSystem(file);
HSSFWorkbook workbook = new HSSFWorkbook(fs);

for (HSSFObjectData obj : workbook.getAllEmbeddedObjects()) {

String oleName = obj.getOLE2ClassName();

if(oleName.equals("Acrobat Document")){
System.out.println("Acrobat reader document");

try{
DirectoryNode dn = (DirectoryNode) obj.getDirectory();
for (Iterator<Entry> entries = dn.getEntries(); entries.hasNext();) {

DocumentEntry nativeEntry = (DocumentEntry) dn.getEntry("CONTENTS");
byte[] data = new byte[nativeEntry.getSize()];

ByteArrayInputStream bao= new ByteArrayInputStream(data);
PDFParser pdfparser = new PDFParser(bao);

pdfparser.parse();
COSDocument cosDoc = pdfparser.getDocument();
PDFTextStripper pdfStripper = new PDFTextStripper();
PDDocument pdDoc = new PDDocument(cosDoc);
pdfStripper.setStartPage(1);
pdfStripper.setEndPage(2);
System.out.println("Text from the pdf "+pdfStripper.getText(pdDoc));
}
}catch(Exception e){
System.out.println("Error reading "+ e.getMessage());
}finally{
System.out.println("Finally ");
}
}else{
System.out.println("nothing ");
}
}

file.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}

下面是eclipse中的输出

Acrobat reader document

读取时出错错误:文件结尾,预期行最后什么都没有

最佳答案

PDF 不是 OLE 1.0 打包的,但以某种方式嵌入 - 至少提取对我有用。这不是一个通用的解决方案,因为它取决于嵌入应用程序如何命名条目......当然,对于 PDF,您可以检查所有 DocumentNode -s 中的魔数(Magic Number)“%PDF” - 并在对于 OLE 1.0 打包元素,这需要以不同的方式完成...

我认为,pdf 的真实文件名隐藏在 \1OleCompObj 条目中,但对于示例以及显然对于您的用例而言,这是不必要的来确定。

import java.io.*;
import java.net.URL;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.util.IOUtils;

public class EmbeddedPdfInExcel {
public static void main(String[] args) throws Exception {
NPOIFSFileSystem fs = new NPOIFSFileSystem(new URL("http://jamesshaji.com/sample.xls").openStream());
HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(), true);
for (HSSFObjectData obj : wb.getAllEmbeddedObjects()) {
String oleName = obj.getOLE2ClassName();
DirectoryNode dn = (DirectoryNode)obj.getDirectory();
if(oleName.contains("Acro") && dn.hasEntry("CONTENTS")){
InputStream is = dn.createDocumentInputStream("CONTENTS");
FileOutputStream fos = new FileOutputStream(obj.getDirectory().getName()+".pdf");
IOUtils.copy(is, fos);
fos.close();
is.close();
}
}
fs.close();
}
}

关于java - 使用Java读取Excel中嵌入的pdf文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18444803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com