我正在编写一个java代码,它利用Apache-poi来读取ms-office .doc文件和itext jar API来创建和写入pdf文件。我已经读完了.doc文件中打印的文本和表格。现在我正在寻找一种能够读取文档中所写图像的解决方案。我编写如下代码来读取文档文件中的图像。为什么这段代码不起作用。
public static void main(String[] args) {
POIFSFileSystem fs = null;
Document document = new Document();
WordExtractor extractor = null ;
try {
fs = new POIFSFileSystem(new FileInputStream("C:\\DATASTORE\\tableandImage.doc"));
HWPFDocument hdocument=new HWPFDocument(fs);
extractor = new WordExtractor(hdocument);
OutputStream fileOutput = new FileOutputStream(new File("C:/DATASTORE/tableandImage.pdf"));
PdfWriter.getInstance(document, fileOutput);
document.open();
Range range=hdocument.getRange();
String readText=null;
PdfPTable createTable;
CharacterRun run;
PicturesTable picture;
for(int i=0;i<range.numParagraphs();i++) {
Paragraph par = range.getParagraph(i);
readText=par.text();
if(!par.isInTable()) {
if(readText.endsWith("\n")) {
readText=readText+"\n";
document.add(new com.itextpdf.text.Paragraph(readText));
} if(readText.endsWith("\r")) {
readText += "\n";
document.add(new com.itextpdf.text.Paragraph(readText));
}
run =range.getCharacterRun(i);
picture=hdocument.getPicturesTable();
if(picture.hasPicture(run)) {
//if(run.isSpecialCharacter()) {
Picture pic=picture.extractPicture(run, true);
byte[] picturearray=pic.getContent();
com.itextpdf.text.Image image=com.itextpdf.text.Image.getInstance(picturearray);
document.add(image);
}
} else if (par.isInTable()) {
Table table = range.getTable(par);
TableRow tRow1= table.getRow(0);
int numColumns=tRow1.numCells();
createTable=new PdfPTable(numColumns);
for (int rowId=0;rowId<table.numRows();rowId++) {
TableRow tRow = table.getRow(rowId);
for (int cellId=0;cellId<tRow.numCells();cellId++) {
TableCell tCell = tRow.getCell(cellId);
PdfPCell c1 = new PdfPCell(new Phrase(tCell.text()));
createTable.addCell(c1);
}
}
document.add(createTable);
}
}
}catch(IOException e) {
System.out.println("IO Exception");
e.printStackTrace();
}
catch(Exception exep) {
exep.printStackTrace();
}finally {
document.close();
}
}
问题是: 1.条件if(picture.hasPicture(run))不满意但文件有jpeg图像。
我在阅读桌子时遇到异常。
java.lang.IllegalArgumentException:此段落不是表格中的第一段 在org.apache.poi.hwpf.usermodel.Range.getTable(Range.java:876) at pagecode.ReadDocxOrDocFile.main(ReadDocxOrDocFile.java:113)
任何人都可以帮我解决问题。 谢谢。
答案 0 :(得分:0)
关于您的例外:
您的代码会遍历所有段落,并为每个段落调用isInTable()
。由于表通常由几个这样的段落组成,因此对{1}}的调用也会针对单个表执行多次。
但是,你的代码应该做的是找到表的第一段,然后处理其中的所有段落(通过getTable()
)并最终继续在表后面的第一段中的外部循环。 Codewise这可能看起来大致如下(假设没有合并的单元格,没有嵌套的表格,没有其他有趣的边缘情况):
getRow(m).getCell(n)
关于图片问题:
我是否正确地猜测您正在尝试获取固定在给定段落中的图片?遗憾的是,POI的预定义方法仅在图片未嵌入字段内时才起作用(实际上这种情况相当罕见)。对于基于字段的图像(即嵌入式OLE的预览图像),您应该执行以下操作(未经测试!):
if (par.isInTable()) {
Table table = range.getTable(par);
for (int rn=0; rn<table.numRows(); rn++) {
TableRow row = table.getRow(rn);
for (int cn=0; cn<row.numCells(); cn++) {
TableCell cell = row.getCell(cn);
for (int pn=0; pn<cell.numParagraphs(); pn++) {
Paragraph cellParagraph = cell.getParagraph(pn);
// your PDF conversion code goes here
}
}
}
i += table.numParagraphs()-1; // skip the already processed (table-)paragraphs in the outer loop
}
有关Field.getType()
的可能值列表,请参阅here。