2016-06-22 15 views
9

Ich muss jede Zelle der MS-Word-Tabelle in Bilder konvertieren. Ich habe schreiben Code für getImage sowie getText, aber ich möchte beide zusammenführen und in ein einzelnes Bild konvertieren, so dass ich nur die Zelle in das Bild konvertieren möchte.Konvertieren einer Zelle von Ms Word-Tabelle in ein Bild mit Java

Reference

XWPFDocument doc = new XWPFDocument(new FileInputStream(fileName)); 
     List<XWPFTable> table = doc.getTables(); 
     for (XWPFTable xwpfTable : table) { 
      List<XWPFTableRow> row = xwpfTable.getRows(); 
      for (XWPFTableRow xwpfTableRow : row) { 
       List<XWPFTableCell> cell = xwpfTableRow.getTableCells(); 
       for (XWPFTableCell xwpfTableCell : cell) { 
        if (xwpfTableCell != null) { 
         System.out.println(xwpfTableCell.getText()); 
         String s = xwpfTableCell.getText(); 
         for (XWPFParagraph p : xwpfTableCell.getParagraphs()) { 
          for (XWPFRun run : p.getRuns()) { 
           for (XWPFPicture pic : run.getEmbeddedPictures()) { 
            byte[] pictureData = pic.getPictureData().getData(); 
            System.out.println("picture : " + pictureData); 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
+0

So achieve mit Die eigentliche Frage ist, wie man Text und Bild zusammenführt, oder? Oder gibt es ein Problem mit Apache Poi? – tak3shi

+0

Ja, ich möchte Text, Bild, Cliparts, Flussdiagramm usw. zusammenfügen und in eine Einheit als Bild konvertieren ... eigentlich habe ich keine Idee, die Zellen- oder Tabellenzeilen in ein Bild zu konvertieren ...! –

+0

So fügen Sie Text zu einem Bild hinzu: http://stackoverflow.com/questions/10929524/how-to-add-text-to-an-image-in-java – tak3shi

Antwort

3

habe ich die Lösung dieses Problems können Sie Aspose-Wort Java-Bibliothek .. Haupt Methode

public static void main(String[] args) throws Exception { 
    // The path to the documents directory. 
    String dataDir = "D://test//"; 

    // Load the documents which store the shapes we want to render. 
    Document doc = new Document(dataDir + "TestFile.doc"); 

    // Retrieve the target shape from the document. In our sample document 
    // this is the first shape. 

    RenderCellToImage(dataDir, doc); 
} 

// RenderCellToImage

public static void RenderCellToImage(String dataDir, Document doc) 
     throws Exception { 

     Cell cell = (Cell) doc.getChild(NodeType.CELL, 0, true); 
     RenderNode(cell, dataDir + "TestFile.RenderCell".png", 
       null); 
     System.out.println("Cell rendered to image__successfully."); 

    } 
} 
    ///<summary> 
///Renders any node in a document to the path specified using the image 
// save options. 
///</summary> 
///<param name="node">The node to render.</param> 
///<param name="path">The path to save the rendered image to.</param> 
///<param name="imageOptions">The image options to use during rendering. 
// This can be null.</param> 
public static void RenderNode(Node node, String filePath, 
     ImageSaveOptions imageOptions) throws Exception { 
    // Run some argument checks. 
    if (node == null) 
     throw new IllegalArgumentException("Node cannot be null"); 

    // If no image options are supplied, create default options. 
    if (imageOptions == null) 
     imageOptions = new ImageSaveOptions(FileFormatUtil.extensionToSaveFormat((filePath.split("\\.")[filePath 
         .split("\\.").length - 1]))); 

    // Store the paper color to be used on the final image and change to 
    // transparent. 
    // This will cause any content around the rendered node to be removed 
    // later on. 
    Color savePaperColor = imageOptions.getPaperColor(); 
    // imageOptions.PaperColor = Color.Transparent; 
    imageOptions.setPaperColor(new Color(0, 0, 0, 0)); 
    // There a bug which affects the cache of a cloned node. To avoid this 
    // we instead clone the entire document including all nodes, 
    // find the matching node in the cloned document and render that 
    // instead. 
    Document doc = (Document) node.getDocument().deepClone(true); 
    node = doc.getChild(NodeType.ANY,node.getDocument().getChildNodes(NodeType.ANY, true).indexOf(node), true); 

    // Create a temporary shape to store the target node in. This shape will 
    // be rendered to retrieve 
    // the rendered content of the node. 
    Shape shape = new Shape(doc, ShapeType.TEXT_BOX); 

    Section parentSection = (Section) node.getAncestor(NodeType.SECTION); 

    // Assume that the node cannot be larger than the page in size. 
    shape.setWidth(parentSection.getPageSetup().getPageWidth()); 
    shape.setHeight(parentSection.getPageSetup().getPageHeight()); 
    shape.setFillColor(new Color(0, 0, 0, 0)); // We must make the shape and 
               // paper color transparent. 

    // Don't draw a surrounding line on the shape. 
    shape.setStroked(false); 

    // Move up through the DOM until we find node which is suitable to 
    // insert into a Shape (a node with a parent can contain paragraph, 
    // tables the same as a shape). 
    // Each parent node is cloned on the way up so even a descendant node 
    // passed to this method can be rendered. 
    // Since we are working with the actual nodes of the document we need to 
    // clone the target node into the temporary shape. 
    Node currentNode = node; 
    while (!(currentNode.getParentNode() instanceof InlineStory 
      || currentNode.getParentNode() instanceof Story || currentNode 
       .getParentNode() instanceof ShapeBase)) { 
     CompositeNode parent = (CompositeNode) currentNode.getParentNode() 
       .deepClone(false); 
     currentNode = currentNode.getParentNode(); 
     parent.appendChild(node.deepClone(true)); 
     node = parent; // Store this new node to be inserted into the shape. 
    } 

    // We must add the shape to the document tree to have it rendered. 
    shape.appendChild(node.deepClone(true)); 
    parentSection.getBody().getFirstParagraph().appendChild(shape); 

    // Render the shape to stream so we can take advantage of the effects of 
    // the ImageSaveOptions class. 
    // Retrieve the rendered image and remove the shape from the document. 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    shape.getShapeRenderer().save(stream, imageOptions); 
    shape.remove(); 

    // Load the image into a new bitmap. 
    BufferedImage renderedImage = ImageIO.read(new ByteArrayInputStream(
      stream.toByteArray())); 

    // Extract the actual content of the image by cropping transparent space 
    // around 
    // the rendered shape. 
    Rectangle cropRectangle = FindBoundingBoxAroundNode(renderedImage); 

    BufferedImage croppedImage = new BufferedImage(cropRectangle.width, 
      cropRectangle.height, BufferedImage.TYPE_INT_RGB); 

    // Create the final image with the proper background color. 
    Graphics2D g = croppedImage.createGraphics(); 
    g.setBackground(savePaperColor); 
    g.clearRect(0, 0, croppedImage.getWidth(), croppedImage.getHeight()); 

    g.drawImage(renderedImage, 0, 0, croppedImage.getWidth(), 
      croppedImage.getHeight(), cropRectangle.x, cropRectangle.y, 
      cropRectangle.x + cropRectangle.width, cropRectangle.y 
        + cropRectangle.height, null); 




    ImageIO.write(croppedImage, "png", new File(filePath)); 
} 
+0

wird es gut funktionieren. –