You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@poi.apache.org by xmcs05 <zh...@gmail.com> on 2011/02/10 12:25:18 UTC

Trouble with merging ppt files

I had merge two powerpoint files with the code below, generally, it works
ok.But, any textbox(POI take it as AutoShape) with text list in it,it will
omit list info(After Copied, Square or ◆ before every line missed)


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ppt;

import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.hslf.*;
import org.apache.poi.hslf.model.*;
import org.apache.poi.hssf.usermodel.HSSFSimpleShape;

import java.io.*;
import java.util.regex.*;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Dimension;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2010</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class PPTmerge {
    
    private static final String[] USAGE_MESSAGE = {
    "Usage: java PPTMerge.jar <pptfile1> [pptfile2] [pptfile3] ...",
    ""};

    public PPTmerge() {
    }

    private static String GetResultFileName(String file[]){

        String ret="";

        try{

            File file1 = new File(file[0]);
            String[] Array1 = Pattern.compile("_").split(file1.getName());

            switch (file.length){
                case 0 :
                    break;
                case 1 :
                if (file1.getParent()!=null){
                ret=file1.getParent() + "/";
                }else{
                ret="";
                }
                    for (int j=0; j < Array1.length-1; j++){
                        if (j>0){
                            ret += "_";
                        }
                        ret += Array1[j];
                    }
                    if (ret.toUpperCase().lastIndexOf(".PPT") == -1){
                        ret += ".PPT";
                    }
                    break;
                default :
                    File file2 = new File(file[1]);
                    String[] Array2 =
Pattern.compile("_").split(file2.getName());
                    for (int i=0; i < Array1.length; i++){
                        if (Array1[i].compareTo(Array2[i])!=0){
                            if (i==0){
                               ret=file[0];
                            }else{
                            if (file1.getParent()!=null){
                            ret=file1.getParent() + "/";
                            }else{
                            ret="";
                            }
                                for (int j=0; j < i; j++){
                                    if (j>0){
                                        ret += "_";
                                    }
                                    ret += Array1[j];
                                }
                                if (ret.toUpperCase().lastIndexOf(".PPT") ==
-1){
                                    ret += ".PPT";
                                }
                            }
                        }
                    }
            }
        }catch (Exception e){
            System.err.println("Error! Get merged ppt name ! ");
            e.printStackTrace();
        }
        return ret;
    }

    public static String concatenateFiles( String file[] ) {

        String filename = "";

        try {
            filename = GetResultFileName(file);
            if (filename.length()==0){
                //Error! Get merged ppt name
                filename = file[0];
            }
            SlideShow write_SlideShow = new SlideShow( new HSLFSlideShow(
file[0] ) );
            // Get page size
            Dimension write_pgsize = write_SlideShow.getPageSize();

            for (int  i = 1; i < file.length; i++) {
                SlideShow read_SlideShow = new SlideShow( new HSLFSlideShow(
file[i] ) );
                // Add Font
                for (int k=0; k < read_SlideShow.getNumberOfFonts(); k++){
                    PPFont rf=read_SlideShow.getFont(k);
                    int j=0;
                    for (j=0; j < write_SlideShow.getNumberOfFonts(); j++){
                        if (rf.equals(write_SlideShow.getFont(j))){
                            break;
                        }
                    }
                    if (j>=write_SlideShow.getNumberOfFonts()){
                        write_SlideShow.addFont(rf);
                    }
                }
                // Get page size
                Dimension read_pgsize = read_SlideShow.getPageSize();
                Slide read_slides[] = read_SlideShow.getSlides();
                // Get Slide number
                int slnum=0;
                for ( Slide sld : read_slides ) {
                    Slide write_slide = write_SlideShow.createSlide();
                    Shape shapes[] = sld.getShapes();

                    for ( Shape shape : shapes ) {
                        try {
                            if (shape instanceof Picture) {
                                Picture pict = (Picture) shape;
                                PictureData pictData =
pict.getPictureData();

                                int idx =
write_SlideShow.addPicture(pictData.
                                        getData(), pictData.getType());

                                Picture p = new Picture(idx);
                                Rectangle write_rt = shape.getAnchor();
                                write_rt.x = write_rt.x * write_pgsize.width
/
                                             read_pgsize.width;
                                write_rt.width = write_rt.width *
                                                 write_pgsize.width /
                                                 read_pgsize.width;
                                write_rt.y = write_rt.y *
write_pgsize.height /
                                             read_pgsize.height;
                                write_rt.height = write_rt.height *
                                                  write_pgsize.height /
                                                  read_pgsize.height;
                                p.setAnchor(write_rt);
                                write_slide.addShape(p);
                            } else if (shape instanceof TextBox) {
                                TextBox read_tb = (TextBox) shape;
                                TextBox write_tb = new TextBox();
                                Rectangle write_rt = shape.getAnchor();
                                write_rt.x = write_rt.x * write_pgsize.width
/
                                             read_pgsize.width;
                                write_rt.width = write_rt.width *
                                                 write_pgsize.width /
                                                 read_pgsize.width;
                                write_rt.y = write_rt.y *
write_pgsize.height /
                                             read_pgsize.height;
                                write_rt.height = write_rt.height *
                                                  write_pgsize.height /
                                                  read_pgsize.height;
                                write_tb.setAnchor(write_rt);

                                write_tb.setText(read_tb.getText());

                                if (read_tb.getHyperlink() != null) {
                                    int link_id =
write_SlideShow.addHyperlink(
                                            read_tb.getHyperlink());
                                    write_tb.setHyperlink(link_id,
                                           
read_tb.getHyperlink().getStartIndex(),
                                           
read_tb.getHyperlink().getEndIndex());
                                }

                               
write_tb.setFillColor(read_tb.getFillColor());
                                write_tb.setHorizontalAlignment(read_tb.
                                        getHorizontalAlignment());
                                write_tb.setVerticalAlignment(read_tb.
                                        getVerticalAlignment());
                                write_tb.setWordWrap(read_tb.getWordWrap());

                               
write_tb.setMarginLeft(read_tb.getMarginLeft());
                               
write_tb.setMarginTop(read_tb.getMarginTop());
                               
write_tb.setMarginRight(read_tb.getMarginRight());
                               
write_tb.setMarginBottom(read_tb.getMarginBottom());

                                RichTextRun read_rtx = read_tb.getTextRun().
                                        getRichTextRuns()[0];
                                RichTextRun write_rtx =
write_tb.getTextRun().
                                        getRichTextRuns()[0];

                                write_rtx.setBold(read_rtx.isBold());
                                write_rtx.setItalic(read_rtx.isItalic());
                               
write_rtx.setShadowed(read_rtx.isShadowed());
                               
write_rtx.setUnderlined(read_rtx.isUnderlined());

                               
write_rtx.setFontName(read_rtx.getFontName());
                               
write_rtx.setFontSize(read_rtx.getFontSize());
                               
write_rtx.setFontColor(read_rtx.getFontColor());

                                write_slide.addShape(write_tb);
                            } else if (shape instanceof Line) {
                                Line read_line = (Line) shape;
                                Line write_line = new Line();
                                // Позиционирование
                                Rectangle write_rt = shape.getAnchor();
                                write_rt.x = write_rt.x * write_pgsize.width
/
                                             read_pgsize.width;
                                write_rt.width = write_rt.width *
                                                 write_pgsize.width /
                                                 read_pgsize.width;
                                write_rt.y = write_rt.y *
write_pgsize.height /
                                             read_pgsize.height;
                                write_rt.height = write_rt.height *
                                                  write_pgsize.height /
                                                  read_pgsize.height;
                                write_line.setAnchor(write_rt);

                               
write_line.setFillColor(read_line.getFillColor());
                               
write_line.setLineColor(read_line.getLineColor());
                               
write_line.setLineDashing(read_line.getLineDashing());
                               
write_line.setLineStyle(read_line.getLineStyle());
                               
write_line.setLineWidth(read_line.getLineWidth());
                               
write_line.setRotation(read_line.getRotation());

                                // Hyperlink
                                if (read_line.getHyperlink() != null) {
                                    Hyperlink
read_hl=read_line.getHyperlink();
                                    Hyperlink write_hl = new Hyperlink();
                                    write_hl.setTitle(read_hl.getTitle());
                                   
write_hl.setAddress(read_hl.getAddress());
                                    write_hl.setType(read_hl.getType());
                                    write_SlideShow.addHyperlink(write_hl);
                                    write_line.setHyperlink(write_hl);
                                }

                                write_slide.addShape(write_line);
                            } else if (shape instanceof Table) {
                                Table read_table = (Table) shape;
                                Table write_table = new Table(read_table.
                                        getNumberOfRows(),
                                                   
read_table.getNumberOfColumns());
                                // Position
                                Rectangle write_rt = shape.getAnchor();
                                write_rt.x = write_rt.x * write_pgsize.width
/
                                             read_pgsize.width;
                                write_rt.width = write_rt.width *
                                                 write_pgsize.width /
                                                 read_pgsize.width;
                                write_rt.y = write_rt.y *
write_pgsize.height /
                                             read_pgsize.height;
                                write_rt.height = write_rt.height *
                                                  write_pgsize.height /
                                                  read_pgsize.height;
                                write_table.setAnchor(write_rt);
                                for (int row = 0; row <
read_table.getNumberOfRows();
                                               row++) {
                                    for (int col = 0;
                                                   col <
read_table.getNumberOfColumns();
                                                   col++) {
                                        TableCell read_cell =
read_table.getCell(
                                                row, col);
                                        if (read_cell != null) {
                                            TableCell write_cell =
write_table.
                                                    getCell(row, col);
                                            // Cell
                                            if (read_cell.getText() != null)
{
                                               
write_cell.setText(read_cell.
                                                        getText());
                                            }
                                            // Hyperlink
                                            if (read_cell.getHyperlink() !=
null) {
                                                int link_id =
write_SlideShow.addHyperlink(
                                                       
read_cell.getHyperlink());
                                               
write_cell.setHyperlink(link_id,
                                                       
read_cell.getHyperlink().getStartIndex(),
                                                       
read_cell.getHyperlink().getEndIndex());
                                            }
                                            // Font
                                            RichTextRun read_rtx =
read_cell.
                                                   
getTextRun().getRichTextRuns()[
                                                    0];
                                            RichTextRun write_rtx =
write_cell.
                                                   
getTextRun().getRichTextRuns()[
                                                    0];
                                           
write_rtx.setBold(read_rtx.isBold());
                                           
write_rtx.setItalic(read_rtx.isItalic());
                                            write_rtx.setShadowed(read_rtx.
                                                    isShadowed());
                                           
write_rtx.setUnderlined(read_rtx.
                                                    isUnderlined());
                                            write_rtx.setFontName(read_rtx.
                                                    getFontName());
                                            write_rtx.setFontSize(read_rtx.
                                                    getFontSize());
                                            write_rtx.setFontColor(read_rtx.
                                                    getFontColor());
                                            // Size
                                            write_rt =
read_cell.getAnchor();
                                            write_rt.x = write_rt.x *
                                                    write_pgsize.width /
                                                    read_pgsize.width;
                                            write_rt.width = write_rt.width
*
                                                    write_pgsize.width /
                                                    read_pgsize.width;
                                            write_rt.y = write_rt.y *
                                                    write_pgsize.height /
                                                    read_pgsize.height;
                                            write_rt.height =
write_rt.height *
                                                    write_pgsize.height /
                                                    read_pgsize.height;
                                            write_cell.setAnchor(write_rt);
                                            // Border
                                            // Left
                                            Line borderLeft = write_table.
                                                    createBorder();
                                            if (read_cell.getBorderLeft() !=
null) {

                                               
borderLeft.setLineColor(read_cell.
                                                        getBorderLeft().
                                                        getLineColor());
                                               
borderLeft.setLineStyle(read_cell.
                                                        getBorderLeft().
                                                        getLineStyle());
                                               
borderLeft.setLineWidth(read_cell.
                                                        getBorderLeft().
                                                        getLineWidth());
                                               
borderLeft.setLineDashing(read_cell.
                                                        getBorderLeft().
                                                        getLineDashing());
                                            } else {
                                               
borderLeft.setLineColor(Color.BLACK);
                                                borderLeft.setLineStyle(
                                                        HSSFSimpleShape.
                                                        LINESTYLE_SOLID);
                                            }
                                           
write_cell.setBorderLeft(borderLeft);
                                            // Top
                                            Line borderTop = write_table.
                                                    createBorder();
                                            if (read_cell.getBorderTop() !=
null) {

                                               
borderTop.setLineColor(read_cell.
                                                       
getBorderTop().getLineColor());
                                               
borderTop.setLineStyle(read_cell.
                                                       
getBorderTop().getLineStyle());
                                               
borderTop.setLineWidth(read_cell.
                                                       
getBorderTop().getLineWidth());
                                               
borderTop.setLineDashing(read_cell.
                                                        getBorderTop().
                                                        getLineDashing());
                                            } else {
                                               
borderTop.setLineColor(Color.BLACK);
                                                borderTop.setLineStyle(
                                                        HSSFSimpleShape.
                                                        LINESTYLE_SOLID);
                                            }
                                           
write_cell.setBorderTop(borderTop);
                                            // Right
                                            Line borderRight = write_table.
                                                    createBorder();
                                            if (read_cell.getBorderRight()
!= null) {

                                               
borderRight.setLineColor(read_cell.
                                                        getBorderRight().
                                                        getLineColor());
                                               
borderRight.setLineStyle(read_cell.
                                                        getBorderRight().
                                                        getLineStyle());
                                               
borderRight.setLineWidth(read_cell.
                                                        getBorderRight().
                                                        getLineWidth());
                                                borderRight.setLineDashing(
                                                        read_cell.
                                                        getBorderRight().
                                                        getLineDashing());
                                            } else {
                                               
borderRight.setLineColor(Color.
                                                        BLACK);
                                                borderRight.setLineStyle(
                                                        HSSFSimpleShape.
                                                        LINESTYLE_SOLID);
                                            }
                                           
write_cell.setBorderRight(borderRight);
                                            // Bottom
                                            Line borderBottom = write_table.
                                                    createBorder();
                                            if (read_cell.getBorderBottom()
!= null) {

                                               
borderBottom.setLineColor(read_cell.
                                                        getBorderBottom().
                                                        getLineColor());
                                               
borderBottom.setLineStyle(read_cell.
                                                        getBorderBottom().
                                                        getLineStyle());
                                               
borderBottom.setLineWidth(read_cell.
                                                        getBorderBottom().
                                                        getLineWidth());
                                                borderBottom.setLineDashing(
                                                        read_cell.
                                                        getBorderBottom().
                                                        getLineDashing());
                                            } else {
                                               
borderBottom.setLineColor(Color.
                                                        BLACK);
                                                borderBottom.setLineStyle(
                                                        HSSFSimpleShape.
                                                        LINESTYLE_SOLID);
                                            }
                                           
write_cell.setBorderBottom(borderBottom);
                                            // Fill
                                           
write_cell.setFillColor(read_cell.
                                                    getFillColor());
                                            // Text orientation
                                           
write_cell.setHorizontalAlignment(
                                                    read_cell.
                                                   
getHorizontalAlignment());
                                            write_cell.setVerticalAlignment(
                                                   
read_cell.getVerticalAlignment());
                                           
write_cell.setMarginLeft(read_cell.
                                                    getMarginLeft());
                                           
write_cell.setMarginTop(read_cell.
                                                    getMarginTop());
                                           
write_cell.setMarginRight(read_cell.
                                                    getMarginRight());
                                           
write_cell.setMarginBottom(read_cell.
                                                    getMarginBottom());
                                           
write_cell.setWordWrap(read_cell.
                                                    getWordWrap());
                                        }
                                    }
                                }
                                write_slide.addShape(write_table);
                            } else if (shape instanceof AutoShape) {
                                AutoShape read_shape = (AutoShape) shape;
                                AutoShape write_shape = new
AutoShape(read_shape.
                                        getShapeType());
                                //
                               
write_shape.setLineColor(read_shape.getLineColor());
                                write_shape.setLineDashing(read_shape.
                                        getLineDashing());
                               
write_shape.setLineStyle(read_shape.getLineStyle());
                               
write_shape.setLineWidth(read_shape.getLineWidth());
                               
write_shape.setRotation(read_shape.getRotation());
                                // Text
                                if (read_shape.getText() != null) {
                                   
write_shape.setText(read_shape.getText());
                                    // Font
                                    RichTextRun read_rtx =
read_shape.getTextRun().
                                            getRichTextRuns()[0];
                                    RichTextRun write_rtx =
write_shape.getTextRun().
                                            getRichTextRuns()[0];
                                    write_rtx.setBold(read_rtx.isBold());
                                   
write_rtx.setItalic(read_rtx.isItalic());
                                   
write_rtx.setShadowed(read_rtx.isShadowed());
                                   
write_rtx.setUnderlined(read_rtx.isUnderlined());
                                   
write_rtx.setFontName(read_rtx.getFontName());
                                   
write_rtx.setFontSize(read_rtx.getFontSize());
                                   
write_rtx.setFontColor(read_rtx.getFontColor());
                                    // Text position
                                   
write_shape.setHorizontalAlignment(read_shape.
                                            getHorizontalAlignment());
                                   
write_shape.setVerticalAlignment(read_shape.
                                            getVerticalAlignment());
                                    write_shape.setMarginLeft(read_shape.
                                            getMarginLeft());
                                    write_shape.setMarginTop(read_shape.
                                            getMarginTop());
                                    write_shape.setMarginRight(read_shape.
                                            getMarginRight());
                                    write_shape.setMarginBottom(read_shape.
                                            getMarginBottom());
                                   
write_shape.setWordWrap(read_shape.getWordWrap());
                                }
                                // Hyperlink
                                if (read_shape.getHyperlink() != null) {
                                    int link_id =
write_SlideShow.addHyperlink(
                                            read_shape.getHyperlink());
                                    write_shape.setHyperlink(link_id,
                                           
read_shape.getHyperlink().getStartIndex(),
                                           
read_shape.getHyperlink().getEndIndex());
                                }
                                // Fill
                               
write_shape.setFillColor(read_shape.getFillColor());
                                // Size
                                Rectangle write_rt = shape.getAnchor();
                                if (write_rt != null) {
                                    write_rt.x = write_rt.x *
write_pgsize.width /
                                                 read_pgsize.width;
                                    write_rt.width = write_rt.width *
                                                     write_pgsize.width /
                                                     read_pgsize.width;
                                    write_rt.y = write_rt.y *
write_pgsize.height /
                                                 read_pgsize.height;
                                    write_rt.height = write_rt.height *
                                                      write_pgsize.height /
                                                      read_pgsize.height;
                                    if ((write_rt.width != 0) &&
                                        (write_rt.height != 0)) {
                                        try {
                                            write_shape.setAnchor(write_rt);
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }
                                try {
                                    write_slide.addShape(write_shape);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                                //}else if (shape instanceof SimpleShape){
                                //SimpleShape read_shape =
(SimpleShape)shape;
                                //SimpleShape write_shape = new
SimpleShape(read_shape.getShapeType());
                            } else {
                                //
                                //HSSFPatriarch patriarch =
write_SlideShow.createDrawingPatriarch();
                                //    a = new HSSFClientAnchor( 0, 0, 1023,
255, (short) 1, 0, (short) 1, 0 );
                                //    HSSFSimpleShape write_shape =
patriarch.createSimpleShape(a1);
                               
//shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
                                //
                                // Hyperlink
                                if (shape.getHyperlink() != null) {
                                   
write_SlideShow.addHyperlink(shape.getHyperlink());
                                }

                                Rectangle write_rt = shape.getAnchor();
                                if (write_rt != null) {
                                    write_rt.x = write_rt.x *
write_pgsize.width /
                                                 read_pgsize.width;
                                    write_rt.width = write_rt.width *
                                                     write_pgsize.width /
                                                     read_pgsize.width;
                                    write_rt.y = write_rt.y *
write_pgsize.height /
                                                 read_pgsize.height;
                                    write_rt.height = write_rt.height *
                                                      write_pgsize.height /
                                                      read_pgsize.height;
                                    if ((write_rt.width != 0) &&
                                        (write_rt.height != 0)) {
                                        try {
                                            shape.setAnchor(write_rt);
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }
                                try {
                                    write_slide.addShape(shape);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }catch(Exception e){
                            e.printStackTrace();
                        }
                    }
                }
            }
            FileOutputStream out = new FileOutputStream( filename );
            write_SlideShow.write( out );
            out.close();
        }
        catch ( Exception e ) {
            e.printStackTrace();
            return null;
        }
        return filename;
    }

    /**
     * Prints out a message.
     *
     * @param msg the message to be printed.
     */
    private static void printMessage(String[] msg) {
      for (String s : msg) {
        System.out.println(s);
      }
    }

    public static void main(String[] args) {
        if ((args.length<1)){
            printMessage(USAGE_MESSAGE);
            System.exit(1);
        }
        if (concatenateFiles(args) == null){
            System.out.println("Some error found");

            System.exit(1);
        }else{
            System.out.println("All Ok");
            System.exit(0);
        }
    }
}


-- 
View this message in context: http://apache-poi.1045710.n5.nabble.com/Trouble-with-merging-ppt-files-tp3379143p3379143.html
Sent from the POI - User mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@poi.apache.org
For additional commands, e-mail: user-help@poi.apache.org