【问题标题】:Read .doc file content and write into pdf file in java读取.doc文件内容并写入java中的pdf文件
【发布时间】:2013-06-06 10:02:29
【问题描述】:

我正在编写一个 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图片。

  1. 我在阅读表格时遇到以下异常。

    java.lang.IllegalArgumentException: 这一段不是表中的第一个 在 org.apache.poi.hwpf.usermodel.Range.getTable(Range.java:876) 在 pagecode.ReadDocxOrDocFile.main(ReadDocxOrDocFile.java:113)

谁能帮我解决这个问题。 谢谢。

【问题讨论】:

    标签: java pdf apache-poi .doc hwpf


    【解决方案1】:

    关于您的例外情况:

    您的代码遍历所有段落并为每个段落调用isInTable()。由于表格通常由多个这样的段落组成,因此您对 getTable() 的调用也会针对单个表格执行多次。

    但是,您的代码应该做的是找到表格的第一段,然后处理其中的所有段落(通过getRow(m).getCell(n))并最终在表格之后的第一段中继续外循环。从代码上看,这可能看起来大致如下(假设没有合并单元格、没有嵌套表和其他有趣的边缘情况):

    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
    }
    

    关于图片问题:

    我猜对了,您正在尝试获取锚定在给定段落中的图片吗?不幸的是,POI 的预定义方法仅在图片未嵌入到字段中时才有效(实际上这种情况很少见)。对于基于字段的图像(即嵌入式 OLE 的预览图像),您应该执行以下操作(未经测试!):

    PictureStore pictureStore = new PictureStore(hdocument);
    // bla bla ...
    for (int cr=0; cr < par.numCharacterRuns(); cr++) {
        CharacterRun characterRun = par.getCharacterRun(cr);
        Field field = hdocument.getFields().getFieldByStartOffset(FieldsDocumentPart.MAIN, characterRun.getStartOffset());
        if (field != null && field.getType() == 0x3A) { // 0x3A is type "EMBED"   
            Picture pic = pictureStore.getPicture(field.secondSubrange(characterRun));
        }
    }
    

    有关Field.getType() 的可能值列表,请参阅here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2011-04-21
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多