itext操作word,设置页眉页脚,html转word

这两天学习了itext操作word生成可用的docx文档,以下是我翻阅网上资料最后的结果及相关记录,如下:

我的maven项目导入必要的itext依赖 

<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.1.7</version>
</dependency>

<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext-rtf</artifactId>
    <version>2.1.7</version>
</dependency>

创建 Document 设置了纸张 A4,设置了页边距 (90.0F, 90.0F, 72.0F, 72.0F)

设置了页眉,标题、内容、图片、页脚

tring path = "D:/WORKBENCH/word/test_"+System.currentTimeMillis()+".docx"; 
String logUrl = "D:/WORKBENCH/word/img/logo.png";

Document document = new Document(PageSize.A4, 90.0F, 90.0F, 72.0F, 72.0F);
RtfWriter2.getInstance(document,new FileOutputStream(new File(path)));
document.open();

//设置页眉,(左上角加了个logo)
Image headerImage = Image.getInstance(logUrl);
float width = headerImage.getWidth() * (15.0F / headerImage.getHeight());
headerImage.scaleAbsolute(width,15.0F);
headerImage.setAbsolutePosition(0,0);
headerImage.setBorder(10);
RtfHeaderFooter headerFooter = new RtfHeaderFooter(headerImage);
headerFooter.setAlignment(headerFooter.ALIGN_LEFT);
document.setHeader(headerFooter);

//设置标题
String title = "这是标题";
Paragraph p = new Paragraph(title+"\n",new RtfFont("黑 体", 16.0F, Font.BOLD, Color.BLACK));
p.setAlignment(Element.ALIGN_CENTER);
document.add(p);

//设置内容
String content = "国内经济逐步恢复,市场需求扩大,加之春节临近,猪肉、鲜菜、鲜果价格可能出现季节性上涨,会一定程度加大价格上涨压力。" ;
p = new Paragraph("\n"+content,contentFont);
p.setAlignment(Element.ALIGN_LEFT);
//设置段落缩进
p.setIndentationLeft(30F);
p.setIndentationRight(30F);
//设置首行缩进
p.setFirstLineIndent(20F);
//段前断后间距
//p.setSpacingAfter(10f);
//p.setSpacingBefore(5F);
//设置行间距
p.setLeading(20F);
document.add(p);

//设置图片
 try {
        Image image =  Image.getInstance("D:\\WORKBENCH\\word\\img\\123.png");
        image.setAlignment(Element.ALIGN_CENTER);// 设置图片对齐方式
        image.scaleAbsolute(200.0F, 200.0F);//设定显示尺寸
//      image.setAbsolutePosition(0, 0);
//      image.scalePercent(50);// 表示显示的大小为原尺寸的50%
//      image.scalePercent(25, 12);// 图像高宽的显示比例
//      image.setRotation(30);// 图像旋转一定角度
        document.add(image);
    } catch (Exception e) {
        e.printStackTrace();
    }


//设置页脚
String footerTxt = "特别说明:不代表任何立场。";
Phrase phrase=new Phrase(footerTxt,new RtfFont("黑 体", 7F, Font.NORMAL, Color.BLACK));
HeaderFooter footer = new HeaderFooter(phrase,false);
footer.setAlignment(Rectangle.ALIGN_CENTER);
document.setFooter(footer);
document.close();

本次没有涉及到表格类型的生成,我也只匆匆看了几眼,网上针对这类的设置方法很多,后面有机会在补上。

以上是通用类型,我这边实际应用中,主要是通过html的文本内容转word文件,所以入参上调至为html文本输入。在通过 HTMLWorker.parseToList 解析元素,然后设置样式后再设置入Document中,当然也可以按自己的方法直接解析html文本后得到各项元素后再逐一设置,但是我图省事直接用HTMLWorker解析了,如你发现更好的方式,可以在评论区留言。

设置html内容入document中 如下:

String htmlContent = "<p>北国风光,千里冰封,万里雪飘。望长城内外,惟余莽莽;大河上下,顿失滔滔。山舞银蛇,原驰蜡象,欲与天公试比高。</p><p><img src=\"https://xxxxxxx/1.png\" alt=\"\" data-href=\"\" style=\"width: 100px;\"/></p><p>惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。一代天骄,成吉思汗,只识弯弓射大雕。俱往矣,数风流人物,还看今朝。</p>";
StyleSheet ss =  new StyleSheet();
ArrayList htmlList = HTMLWorker.parseToList(new StringReader(htmlContent),ss);
for (int i = 0; i < htmlList.size(); i++) {
    Element element = (Element) htmlList.get(i);
    ArrayList list = element.getChunks();
    if(list!=null &&list.size()>0){
    for (int i1 = 0; i1 < list.size(); i1++) {
        JSONObject object = JSON.parseObject(JSON.toJSONString(list.get(i1)));
        if(object.get("image")!=null){
         JSONObject object1 = object.getJSONObject("image");
         String url = object1.getString("url");
         image = Image.getInstance(url);
         image.setAlignment(Element.ALIGN_CENTER);// 设置图片对齐方式
         image.scaleAbsolute(200.0F, 200.0F);//设定显示尺寸
         if(list.size()==1){//换行显示
                 document.add(image);
             }else{//不换行显示
                Paragraph content = new Paragraph();
                 content.add(image);
                document.add(content);
              }
           }else{
            String text1 = object.getString("content");
            Paragraph paragraph2 = new Paragraph(text1,new RtfFont("黑 体", 10F, Font.NORMAL, Color.BLACK));//设置文字内容和字体及大小
            paragraph2.setAlignment(Element.ALIGN_LEFT);//设置对齐方式
            paragraph2.setFirstLineIndent(20F);//设置首行缩进
            paragraph2.setLeading(20);//设置行距
            document.add(paragraph2);
           }
       }
    }
}

2023年3月10日 更新

使用过程中发现生成的word文档在macOS系统打开无法查看 页眉插入的图片,可能是兼容性问题,未找到完美的解决办法,只能不在页眉添加图片,改为在内容左上角添加图片,暂时解决logo不显示的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值