Converting a cell of Ms word table into image using java
Asked Answered
C

1

8

I need to Convert each cells of ms word table into images. I have write code for getImage as well getText but I want to merge both of them and convert into single image so I just want to convert the cell into the image.

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);
                                }
                            }
                        }
                    }
                }
            }
        }
Centenarian answered 22/6, 2016 at 12:6 Comment(6)
So the real question is how to merge text and image, right? Or is there any problem with apache poi?Ricebird
Yes, i want to merge text,image,cliparts, flow diagram etc and convert into single unit as image.... actually i don't have idea to convert the cell or table rows into image... !Centenarian
How to add text to an image: #10930024Ricebird
@Ricebird No i can't do this, because the cell also contains shapes clip-art in a proper format so how do i manage...!Centenarian
POI does not offer anything to convert a table to an image, you are going to have to create the image and draw the table to it yourself. Here is a starting point #18801217Invariant
I don't think there is any such support but i think u can try to draw the image and text as output and take a screenshot of that cause i don't see any other approach to thisCaundra
A
3

I got the solution of this problem, you can achieve using aspose-word java library.. Main Method

    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));
}
Aggregation answered 30/6, 2016 at 6:31 Comment(1)
this works great except the Font of the text in the cell is not being preserved in the Image. Any ideas why ?Anselme

© 2022 - 2024 — McMap. All rights reserved.