就像竹林的灯火,被风吹过,摇摇曳曳,但永不熄灭!

aspose-words

aspose注册

static {
    try (InputStream is = AsposeUtil.class.getResourceAsStream("/license.xml")) {
        License aposeLic = new License();
        aposeLic.setLicense(is);
    } catch (Exception e) {
        e.printStackTrace();
    }
} 

license.xml

<?xml version="1.0" encoding="UTF-8" ?>
<License>
    <Data>
        <Products>
            <Product>Aspose.Total for Java</Product>
            <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    </Data>
    <Signature>
        sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=
    </Signature>
</License>

基本操作

原文:https://blog.csdn.net/qq_38819293/article/details/126746338

1.创建word文档

//创建文档
Document doc = new Document(path);
//创建空文档
Document doc = new Document();
//获取光标
DocumentBuilder builder = new DocumentBuilder(doc); 
//writeln 方法和 write 方法的区别在于, writeln 在文本之后插入了一个段落终止符
builder.writeln("Hello,Lain!"); 
//文件保存路径
doc.save(path);

2.设置段落格式

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc); 
builder.writeln("Hello,Lain!");
builder.getFont().setColor(Color.decode("#66ccff"));//设置颜色
builder.getFont().setBold(true);//设置粗体
builder.getFont().setItalic(true);//设置斜体 
builder.getFont().setName("微软雅黑");//设置字体 
builder.getFont().setHighlightColor(Color.gray);//设置背景高亮
builder.getFont().setUnderlineColor(Color.RED);//设置字体颜色
builder.getFont().setUnderline(Underline.DOUBLE);//设置下划线 
/*
* 缩进
*/
builder.getParagraphFormat().setFirstLineIndent(30);//首行缩进
builder.getParagraphFormat().setLeftIndent(30);//缩进:文本之前
builder.getParagraphFormat().setRightIndent(30);//缩进:文本之后 
/*
* 行距:
* AT_LEAST 最小值
* EXACTLY 固定值
* MULTIPLE 多倍行距
* 注:多倍行距的值以12为基准,12为一倍行距,24为两倍,以此类推 */
builder.getParagraphFormat().setLineSpacingRule(LineSpacingRule.MULTIPLE);
builder.getParagraphFormat().setLineSpacing(24);
builder.getParagraphFormat().setSpaceBefore(10);//段前,单位磅
builder.getParagraphFormat().setSpaceAfter(10);//段后,单位磅
/*
* 对齐方式
* CENTER 居中对齐
* DISTRIBUTED 分散对齐
* JUSTIFY 两端对齐
* LEFT 左对齐
* RIGHT 右对齐 */
builder.getParagraphFormat().setAlignment(ParagraphAlignment.RIGHT);
builder.getParagraphFormat().setBidi(false);//方向:true 从右向左 
builder.writeln("Present Day,Present Time!Ahhhhhhh"); 
doc.save(getTempFileName());

3.页面分隔

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("This is the 1st section,1st Page"); 
builder.insertBreak(BreakType.PAGE_BREAK);//分页符 
builder.writeln("This is the 1st section,2nd Page");
builder.insertBreak(BreakType.LINE_BREAK);//换行符 
builder.insertBreak(BreakType.COLUMN_BREAK);//分栏符
builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS);//连续分节符 
builder.writeln("This is the 3rd section,1nd Page"); 
builder.writeln("连续分节符");
builder.insertBreak(BreakType.SECTION_BREAK_EVEN_PAGE);//偶数页分节符
builder.writeln("This is the 4th section,1nd Page"); 
builder.writeln("偶数页分节符");
builder.insertBreak(BreakType.SECTION_BREAK_ODD_PAGE);//奇数页分节符 
builder.writeln("This is the 5th section,1nd Page"); 
builder.writeln("奇数页分节符");
builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE);//下一页分节符 
builder.writeln("This is the 6th section,1nd Page"); 
builder.writeln("下一页分节符");
builder.insertBreak(BreakType.SECTION_BREAK_NEW_COLUMN);//节的结尾 
builder.writeln("This is the 7th section,1nd Page"); 
builder.writeln("节的结尾");
doc.save(getTempFileName());

4.页面属性设置

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc); builder.write("Present Day,Present Life!Ahhhhhhh");
builder.getPageSetup().setPaperSize(PaperSize.A4);//纸张大小 builder.getPageSetup().setLeftMargin(20);//设置边距 单位为磅 
builder.getPageSetup().setRightMargin(10); 
builder.getPageSetup().setTopMargin(10); builder.getPageSetup().setBottomMargin(10);
builder.getPageSetup().setTextOrientation(TextOrientation.DOWNWARD);//文字方向 builder.getPageSetup().setOrientation(Orientation.LANDSCAPE);//横纵向 PORTRAIT 纵向 LANDSCAPE 横向
doc.save(getTempFileName());

5.设置页眉页脚

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc); 
builder.write("Hello,Lain!"); 
builder.insertBreak(BreakType.LINE_BREAK); builder.moveToHeaderFooter(HeaderFooterType.HEADER_PRIMARY);//移动到页眉
builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
builder.writeln("Hello,Lain!");
builder.moveToDocumentEnd();
builder.writeln("Hello,Lain!");
builder.moveToHeaderFooter(HeaderFooterType.FOOTER_PRIMARY);//移动到页脚
builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER); 
builder.getFont().setName("微软雅黑");
builder.write("第");
builder.insertField("PAGE", "");//当前页数
builder.write("页");
builder.write(" 共");
builder.insertField("NUMPAGES", "");//总页数 
builder.write("页");
builder.moveToDocumentEnd(); 
builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE); builder.write("Hello,Lain!");
doc.save(getTempFileName());

6.生成表格

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.startTable();
builder.insertCell(); 
builder.getCellFormat().setWidth(100); 
builder.getFont().setName("华文正楷"); 
builder.getFont().setColor(Color.decode("#66ccff")); 
builder.getParagraphFormat().setLineSpacing(24); 
builder.write("Name");
builder.insertCell(); 
builder.getCellFormat().setWidth(200); 
builder.write("describe");
builder.endRow();
builder.insertCell(); 
builder.getCellFormat().setWidth(100); 
builder.write("Lain");
builder.insertCell(); 
builder.getCellFormat().setWidth(200); 
builder.write("Make Me Sad");
builder.endRow(); 
builder.endTable();
doc.save(getTempFileName());

7.图片操作

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER); 
builder.insertImage(image);
doc.save(getTempFileName());

图片布满整个页面

private static void appendImg(DocumentBuilder builder, String imgPath) throws Exception {
    if (StringUtils.hasLength(imgPath)) {

        double pageHeight = builder.getPageSetup().getPageHeight();
        double pageWidth = builder.getPageSetup().getPageWidth();

        //先把页边距设为0,不知道为什么图片的大小总是减去页边距
        double topMargin = builder.getPageSetup().getTopMargin();
        double bottomMargin = builder.getPageSetup().getBottomMargin();
        double leftMargin = builder.getPageSetup().getLeftMargin();
        double rightMargin = builder.getPageSetup().getRightMargin();
        builder.getPageSetup().setTopMargin(0);
        builder.getPageSetup().setBottomMargin(0);
        builder.getPageSetup().setLeftMargin(0);
        builder.getPageSetup().setRightMargin(0);
        builder.insertImage(imgPath, RelativeHorizontalPosition.PAGE, 0.0D,
                RelativeVerticalPosition.PAGE, 0.0D, pageWidth, pageHeight, WrapType.NONE);
        builder.getPageSetup().setTopMargin(topMargin);
        builder.getPageSetup().setBottomMargin(bottomMargin);
        builder.getPageSetup().setLeftMargin(leftMargin);
        builder.getPageSetup().setRightMargin(rightMargin);
    }
}
//分页符
//builder.insertBreak(BreakType.PAGE_BREAK);

8.大纲目录

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc); 
builder.insertTableOfContents("\\o \"1-9\" \\h \\z \\u");//参考微软官方office文档 
builder.writeln(); 
builder.getParagraphFormat().setOutlineLevel(OutlineLevel.LEVEL_1); 
builder.writeln("一级");
builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE);
builder.getParagraphFormat().setOutlineLevel(OutlineLevel.LEVEL_2); 
builder.writeln("二级");
builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE);
builder.getParagraphFormat().setOutlineLevel(OutlineLevel.LEVEL_3); 
builder.writeln("三级"); 
builder.getParagraphFormat().setOutlineLevel(OutlineLevel.BODY_TEXT); 
builder.writeln("正文");
doc.updateFields();
doc.save(getTempFileName());

9.合并文档

doc.appendDocument(new Document(), ImportFormatMode.KEEP_SOURCE_FORMATTING);

 

项目代码:

 

import java.awt.Color;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

import org.springframework.util.StringUtils;

import com.aspose.words.BreakType;
import com.aspose.words.Document;
import com.aspose.words.DocumentBuilder;
import com.aspose.words.ImportFormatMode;
import com.aspose.words.License;
import com.aspose.words.LineSpacingRule;
import com.aspose.words.PaperSize;
import com.aspose.words.ParagraphAlignment;
import com.aspose.words.RelativeHorizontalPosition;
import com.aspose.words.RelativeVerticalPosition;
import com.aspose.words.Underline;
import com.aspose.words.WrapType;
import com.gdda.archives.platform.holdings.constant.subject.StyleLevelEnum;

import cn.hutool.core.collection.CollUtil;


public class AsposeWordEditor {

    static {
        try (InputStream is = AsposeWordEditor.class.getResourceAsStream("/license.xml")) {
            License aposeLic = new License();
            aposeLic.setLicense(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 合并word并添加目录以及封面封底
     *
     * @param param 参数
     * @throws Exception 例外
     */
    public static void compilation(CompilationParam param) throws Exception {
        //样式
        final Map<String, FontStyle> styleMap = param.getDocumentStyleMap();
        //目录
        final List<CatalogNode> catalogTree = param.getCatalogTree();
        //封面路径
        final String topPath = param.getTopPath();
        //封底路径
        final String bottomPath = param.getBottomPath();

        //新建一个空文档
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        builder.getPageSetup().setPaperSize(PaperSize.A4);

        //1、封面
        appendImg(builder, topPath);
        builder.insertBreak(BreakType.PAGE_BREAK);

        //2、目录
        builder.moveToDocumentEnd();
        setStyle(builder, styleMap.get(StyleLevelEnum.CATALOG.value()));
        //对齐
        builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
        builder.writeln("目录");
        setStyle(builder, null);
        //插入目录,这是固定的
        builder.insertTableOfContents("\\o \"1-3\" \\h \\z \\u");

        //3、内容
        List<CatalogNode> blankHeading = new ArrayList<>();
        catalogIteration(catalogTree, catalog -> {
            try {
                if (StringUtils.hasLength(catalog.getWordPath())) {
                    Document nodes = new Document(catalog.getWordPath());
                    DocumentBuilder builder1 = new DocumentBuilder(nodes);
                    builder1.moveToDocumentStart();
                    //连续标题
                    for (CatalogNode heading : blankHeading) {
                        FontStyle style = styleMap.get(String.valueOf(heading.getLevel()));
                        style = style == null ? styleMap.get(StyleLevelEnum.DEFAULT_HEADLINE) : style;
                        setStyle(builder1, style);
                        builder1.getParagraphFormat().setStyleIdentifier(heading.getLevel());
                        builder1.writeln(heading.getTitle());
                    }
                    blankHeading.clear();
                    FontStyle style = styleMap.get(String.valueOf(catalog.getLevel()));
                    style = style == null ? styleMap.get(StyleLevelEnum.DEFAULT_HEADLINE) : style;
                    setStyle(builder1, style);
                    builder1.getParagraphFormat().setStyleIdentifier(catalog.getLevel());
                    builder1.writeln(catalog.getTitle());
                    //添加文档
                    //清理一下样式,不然会影响到后续内容
                    setStyle(builder1, null);
                    doc.appendDocument(nodes, ImportFormatMode.KEEP_SOURCE_FORMATTING);
                } else {
                    blankHeading.add(catalog);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        //更新目录
        doc.updateFields();

        //4、封底
        builder.moveToDocumentEnd();
        builder.insertBreak(BreakType.PAGE_BREAK);
        appendImg(builder, bottomPath);

        //保存
        doc.save(param.getOutPath());
    }

    private static void setStyle(DocumentBuilder builder, FontStyle fontStyle) throws Exception {

        //清除样式
        builder.getFont().clearFormatting();
        builder.getParagraphFormat().clearFormatting();
        if (fontStyle == null) {
            return;
        }
        //斜体
        builder.setItalic(fontStyle.getItalic());
        //加粗
        builder.setBold(fontStyle.getBold());
        //下划线
        if (fontStyle.getUnderline()) {
            //单下划线
            builder.setUnderline(Underline.SINGLE);
        }
        //字体
        if (StringUtils.hasLength(fontStyle.getFontName())) {
            builder.getFont().setName(fontStyle.getFontName());
        }
        //颜色
        if (StringUtils.hasLength(fontStyle.getColor())) {
            Color color = Color.decode(fontStyle.getColor());
            builder.getFont().setColor(color);
        }
        //大小
        if (fontStyle.getFontSize() != null && fontStyle.getFontSize() > 0) {
            builder.getFont().setSize(fontStyle.getFontSize());
        }
        //段前
        if (fontStyle.getSpaceBefore() != null && fontStyle.getSpaceBefore() > 0) {
            builder.getParagraphFormat().setSpaceBefore(fontStyle.getSpaceBefore());
        }
        //段后
        if (fontStyle.getSpaceAfter() != null && fontStyle.getSpaceAfter() > 0) {
            builder.getParagraphFormat().setSpaceAfter(fontStyle.getSpaceAfter());
        }
        //首行缩进
        if (fontStyle.getFirstLineIndent() != null && fontStyle.getFirstLineIndent() > 0) {
            builder.getParagraphFormat().setFirstLineIndent(fontStyle.getFirstLineIndent());
        }
        //行距
        if (fontStyle.getLineSpacing() != null && fontStyle.getLineSpacing() > 0) {
            builder.getParagraphFormat().setLineSpacingRule(LineSpacingRule.EXACTLY);
            builder.getParagraphFormat().setLineSpacing(fontStyle.getLineSpacing());
        }
    }

    private static void catalogIteration(List<CatalogNode> catalogTree,
                                         Consumer<CatalogNode> consumer) {
        for (CatalogNode e : catalogTree) {
            consumer.accept(e);
            List<CatalogNode> children = e.getChildren();
            if (CollUtil.isNotEmpty(children)) {
                catalogIteration(children, consumer);
            }
        }
    }

    private static void appendImg(DocumentBuilder builder, String imgPath) throws Exception {
        if (StringUtils.hasLength(imgPath)) {

            double pageHeight = builder.getPageSetup().getPageHeight();
            double pageWidth = builder.getPageSetup().getPageWidth();

            //先把页边距设为0,不知道为什么图片的大小总是减去页边距
            double topMargin = builder.getPageSetup().getTopMargin();
            double bottomMargin = builder.getPageSetup().getBottomMargin();
            double leftMargin = builder.getPageSetup().getLeftMargin();
            double rightMargin = builder.getPageSetup().getRightMargin();
            builder.getPageSetup().setTopMargin(0);
            builder.getPageSetup().setBottomMargin(0);
            builder.getPageSetup().setLeftMargin(0);
            builder.getPageSetup().setRightMargin(0);
            builder.insertImage(imgPath, RelativeHorizontalPosition.PAGE, 0.0D,
                    RelativeVerticalPosition.PAGE, 0.0D, pageWidth, pageHeight, WrapType.NONE);
            builder.getPageSetup().setTopMargin(topMargin);
            builder.getPageSetup().setBottomMargin(bottomMargin);
            builder.getPageSetup().setLeftMargin(leftMargin);
            builder.getPageSetup().setRightMargin(rightMargin);
        }
    }
}

 

posted @ 2023-11-27 16:10  竹林的灯火  阅读(91)  评论(0编辑  收藏  举报

w3school 在线教程 | 博客园 | sxsoft | 快包网 | 荆门泽优软件有限公司博客