最近一直在加班 导致看到代码就想吐 今天抽出时间来记录一下 用freemaker导出富文本信息
之前使用freemaker导出图片等信息时 使用的是xml方式,不明白的 可以看 freemaker生成Word文档(图片、超链接)
由于xml方式 不识别<p><b>等这种HTML标签,所以只能使用mht方式来解决,话不多说 干起来!
我是看到 前辈 的文章 才 有所启发!
1.准备好模板
这里我要强调一下 模板里面插入图片时 不要使用插入->上传图片,这样会是超链接的形式,里面使用的绝对路径 当把文档转给他人时 图片显示不出来
这种上传图片方式是错误的 应该直接复制图片到Word文档中
此时,模板已生成
将模板内容替换为占位符(${})形式 此时建议保留图片 这样分析文档结构 方便些
后另存为 单个文件网页(*.mht,*.mhtml)文件,于是生成一个.mht文件 最后调整后缀名为ftl文件
2.ftl占位符修改
- 全文检索gb2312/utf-8把他改成utf-8,同时需要加上3D前缀
- ${}占位符 中间会生成一些其他字符 需要将其他扰乱信息去掉 只保留占位符
- 记住这三处标识 【NextPart_ 和 Content-Location】 这里文档 全都是一样的 所以在生成图片base64定义时 也要保持一致
-
添加 ${imagesBase64String!""} 标识 在folHlink下面添加 该标识 存放图片base64信息
- 添加 ${imagesXmlHrefString!""} 标识 在filelist.xml 上面添加 该标识 存放图片base64的链接信息
- 去掉之前 保留的图片信息对应代码
其实添加的 ${imagesBase64String}和${imagesXmlHrefString}标识 就是 首先定义一个图片的base64,然后在下面引用,随后在正文中 直接调用图片的引用即可。
不明白的 可以看一下 其他图片的生成方式 【上面建议保留一张图片, 就是为了方便文档结构中图片的分析】
例如:看一下图片 image004.jpg
- 图片base64的定义
- 图片链接的引用
- 图片的显示 调用图片链接的引用 <v:shape>xxxxx</v:shape>及后面的<img/> 这些是页面显示的图片 需要动态生成
此时 报告的模板修改 已经完成,下面开始上代码
因为 本项目的富文本存储的形式 为base64,而不是存储图片的地址,所以需要先根据base64生成图片 在进行操作。
- 测试数据
Map<String, Object> dataMap = new HashMap<>();
List<String> photoNameList=new ArrayList<>();
String handledBase64Block = ""; //base64
String xmlimaHref = ""; //图片链接
//模拟数据
StringBuilder sb = new StringBuilder();
sb.append("<div>");
sb.append("<p>概况</p><p><br></p><p><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWUAAABMCAYAAAC1UabxAAAOkElEQVR4Ae2dz48cRxXH86ciDkiISMhLJLAC0l5gxWWRkBZhZAkkLOXiAwFyAaJIjnwClAs4vjjIOYSDpXAa7zr+0ehTzHfy+k1VT2/vmJ12f0uare6qV+/H9736dk2vrX2rczMCRsAIGIGDQeCtg/HEjhgBI2AEjEBnUnYRGAEjYAQOCAGT8gElw64YASNgBEzKrgEjYASMwAEhYFI+oGTYFSNgBIyASdk1YASMgBE4IARMygeUDLtiBIyAETApuwaMgBEwAgeEgEn5gJJhV4yAETACJmXXgBEwAkbggBAwKR9QMuyKETACRsCk7BowAkbACBwQAiblA0qGXTECRsAImJQn1sDLx4+7i1u3utWNG93q7bf9MQauAdfAXmrApDyBlCFkyPj5vXtdd3ExQYOXGAEjYATqCJiU67gMjnJCLoQ8KOVJI2AEjMDlETApXx6zckr2CXkCcF5iBIzATgRMyjsh2hbgHbKbETACRuB1IGBSnoCqSXkCaF5iBIzAKARMyqNg6guZlPt4+M4IGIH9IWBSnoClSXkCaF5iBIzAKASujZS//PI/3ffe+UH3jW9+q/lhHjm1p0/Pu9Of/bx79OizMvS79/9QXfvt73x3I6O1++xNyvtE07qMgBGICLwWUn715El3cXbWvVqtoq3eNWT7i1/+qoNoa435H//kp4OkXFsXxyDvd3903NMR56dem5SnIud1RsAI7EJg76T87O7d7vzkpDs/Pe2eHh933NfaZUgZ4oag46ma+xah1+ztc2wfpJxP+X/92983LoJN/BYRY81Y5G8TUoI+Hnqtlu0L2yE/JJP1Rl3R12x7rO+s44HKN56azawn+5PtMl/Tk+W4b8lmmxn3iAG2Io7RzlBukRvSg07FQY9sbNnHIT/iOq7R3codmMR4so/yKfvDuoxTtuv7bQT2TsqYeH7/frc6OupefPrptsX1SC5OJTb2OaGs4eSr1xdN5a954qqkTIHH2LiPr1wobgqapo2mgs+bBznJKmxkwDGPa54efXkTighZT1OOdM/YLn+i70VJ+DHG95pd+SEMYszZn2CuXGZ/WCs9l5Ed8j3XJbIxv7KTfdW98jSkR7LKBbk6euf7m72QMcJmzqf8yL3W5npADt+oJdnNa7mvxYtO9PEZWlvTt/SxvZMyRMwJ+cXDh+XEzKuMWiNpJJxiqzUllV6N5FIgENif/vyX3kkqkrkIiaLU6wvWUiC8k5bs1GK5KikrHvVxw8VrzeOnNi59JBViJCbhyDz4MKY10hN7dNQ2YRwHe8gl44SMdMdr9Atn+RNt7vI9yubrbCfOD81lm1Nls56Ie46Z2OPvPqKv+TqujdfIRT2xlqUDn1hD45pPbsRby3OUQ+bdHx735JR79g8f2YnruJZcnhfOY+xnnUu/3zspjwWUZFJEtc2rZFNMyKm9//s/bog1FyD3uTBiITMHGVMkNObiSUM2xvSvk5SJN38bwHdhQR/jjDHiu+a0KRQPOMe1rc0S9dU2HHrAWnmRb8pjtBtjyfbxK9vKcct3+qg3jmcfo83aOnxHF23Id+Ylu8v37FuUj9fFaPoRfRjSE+WkYsg/ycS+poMc8AD5+OP7W6T86LN/lf0Z6ybq4xqfmSdOtRgz+qfuM+lbWn+tpMwpTKfWWh+/ArLZfv2b35YC+sc/H/SIgaRRoCosio8WNz1jUZ/WaIOWBSN/7JuUo2+ZVGIcX3zx7x6xMleTZzxv8BxabTNlfeiu5Si+amEN/it/LTzjRpUvLd81r15+KK8axxZ2MyloXr3kkM06JKO+JrvLd9ZQf7GJMONYvpZe1tOG9OB3jlPyY3HM9rnHT3TX9DMvH2u4tfIS951sKMaaDx7rI3CtpExBkPRaI+EUIT2NpEK68WuhnvLoiMXFNS0WR63okJtSLPsk5VzY3OcTo+K4LlLOGxLcRBAihgJ4g1iYq23uWqzSE3vsKadxXNf4IH80pj7nON9Ljj7P6X6X7xmDmq5oR9fZ7yE9tfqV/FgcZVc9OomRVtPPeC32uD4fdJgTbrvkNO++j8BsSJl3yBSfSDkXC4VAYcUCFZkxxlwuoFw8fWjad/siZcXA5lKL/mtMG4Y5yId7tRijxui1YeNYvGa+RmRRH/bALNpDh2RqDwnmal9XFWvUJT3YabWWn1G+ZbOFZa4DdA3JtuLk4cm6jHUt1ugv1+CQ/RjSg3zOl+p3jL1snzXaS/In62d8SHf2F3nwIC59c4p9zH32x/dfIzAbUsblWEi5SEXKyFEsfOKmR54CYZzW2shlcsePfZCyilf+yGRtE+A78dG0ESVPHGwu1sWGXq2J47pmvrYJ47h8zJtJuLbIqkbK2B3ru3xEvuaj5tXLH/yNjfv8rYNYMhmyZpfskO/ojH7GOo3+6BqMaz4M6anFiE/KTSvfrXjRx2uoSJpcZ79q9UgcGsdubDkGzeErH7fdCFwrKbeeqCqUWoFAQCQ+bzbeN1NoNHrkHjx4WOTYcCoWxtGf34vuhupriauSsjZELmhZiBssF7/iYJzWKvaoQ3pjz3wkEubkFzZo4EYOdK/10SZ6+Khl/zROn+einiinmLN/kmFdtMk1Y7XGePR/quyQ75nQkc21K9/wpzU3pEeYKBZyFR9+ylXERfmMY/Ij9zk+zWe7Gs++Mt6SZS77Kz3utxG4VlKmQElkrZF0NiW9GrKQKgmmqRBrT3itUd8qOs1fpr8qKbNJ9OCJvTaPNpPmIjnFmIfiRlckqrxhaj7kB1W2JX+iXnDjXnPZ1/jwzPoiOTEn2Rx/1q1Y8ji+RD3cZ9noe66JIdkh3zMG+CXylE7usw75H3GIWEY92Mg5U70wR5Mt6c3rc7zrZaVrzUmn4tGaGskyRg6JMzfpyT5nOd933bWR8v8b/FbRTfHjqqQ8xabXGAEjsAwETMoT8mxSngCalxgBIzAKgcWQ8ig0RgqZlEcCZTEjYAQujYBJ+dKQdeXPiE9Y5iVGwAgYgZ0ImJR3QrQt4JPyNiYeMQJGYD8ImJQn4GhSngCalxgBIzAKAZPyKJj6QiblPh6+MwJGYH8ImJQnYGlSngCalxgBIzAKAZPyKJj6QqsbN7ru4qI/6DsjYASMwB4QMClPAPHi1q3u+b17E1Z6iREwAkZgGAGT8jA+1dmXjx93nJYLMfvEXMXIg0bACExDwKQ8DbcOYubEDDnzjtkfY+AacA3sowZMyhNJ2cuMgBEwAq8DAZPyBFT5Y7DP7tzZWvlqteouzs661h+L3VrgASNgBIxAQsCknAAZe/vs7t1On6GvLMjQ+CvfF7dv99RD4ucnJ93q6KjM9ybXN6yH6Ifa8/v3R78+kT81fdhBV60VX09Pe37WxrR2p08pZh5k5YG2WpWH2tObN7djSmtky70ReJMQMClPzCaExGmZXo3r1kkZkoqEyLXIGEKChFqEiGxcK3tDPToh/NqpvdgO78GxWyPR6E/toVIbk0+sbT1MamQeSVk6Wn3B6/h484DATn4wgmct9pZOjxuBQ0HApHzFTEBMkGsmBd0//+ij/52GAwky9/T4uLcGEoFEC5EGose9GontchtCapGydOoBksk1E+oWYa9PrJnc9ZBBf9YR/Y3xlGu+LQR8dj2AaqSMvdjQ0XooRDlfG4FDQ8CkfMmMRBLJ5MGciC6qFQlBxBDgZVshoZs3B0kmk3C+zzbx46sPPiinyfPT062HhEiSGCE8xapYRLrcq/F6RvExLx3VPr2KYB1+RH3Sm/sxpHwZfVm/743AdSJgUp6IfiGqO3eqp+BIQpxWX3zySSFUSAeygOAkE0/GIsDsErZYq/V5nvtMwoW40nvZ+JU+fuX/6sMPN7rxT+++8Uc+0Rc7vAdf+4JfsWVSbp1URezYUsMHHlrlG8Pp6QYf4aS+4Pn550VW67Gz5cvZ2eBDTHbdG4FDQ8CkPDEjhZTXRFUjBUiRcQiokBsEHkiZMclASEVmfSqNLhUCOzkppIPNJtGl1xWZpKNO9EBy0ldIOb1CEAnil+Q1ptcUmpPuqaQsHCBcTu/oVcN2vGcc+fitA0w2vq1fg8SHnXS5NwJzQMCkPDFLkSxqpABJiBh680dHhZxFIoWIBkgZO9JTO2HK/UzC+X4jt37Fgk5049uUk3LtlJpJWTFW+/D6AiKWL8RIwy/G+EDK3Iuca6SMnJsReBMQMClPzKLIguUikKgK4mBcJBMJFXLhI5nWSbmQT/pXGdhFb27IFvJ+8qRM5fssL5/px5yUN4S4fn0hUiauEifxpnfKNT/xI2LBPaRc/ofkGi90860COeHMGKdj4iq4hPfziiXH6HsjMEcETMoTs1bI8fbtQoSQYe00qBMuJgoRreUgF8kj0yJlyEZkGN2sjWcSzvdxPdcisqJr/WoFHyE/yJWmh4eIkbFMqEWwMt56eLR04C++oF++IRttF1/XD7P8+gI5NyPwJiBgUp6YRQhLvziLJCJ1IpmX6xNsIeHwT8lYLxmIiMYY5FKI7+SkkJP0xV7zyKtlEs73klOPz3owQHDS1SJlycY4pIs+2yOO3prwT95qOoSFTu3CJJKyTtAvRvyiL/rmayMwJwRMynvIViTlSEYiOkwUIg2/6OPrOb8w09pIVIzFtTUXN8T83nvltD5IgIEQdXqXXfRwDSnSCimfnW10Ek8kxhgHa3gwyTZ61FgT7zVOH3VoXKTMHI34pRddbkZgKQiYlJeSacdpBIzALBAwKc8iTXbSCBiBpSBgUl5Kph2nETACs0DApDyLNNlJI2AEloKASXkpmXacRsAIzAIBk/Is0mQnjYARWAoCJuWlZNpxGgEjMAsETMqzSJOdNAJGYCkImJSXkmnHaQSMwCwQMCnPIk120ggYgaUgYFJeSqYdpxEwArNAwKQ8izTZSSNgBJaCgEl5KZl2nEbACMwCAZPyLNJkJ42AEVgKAiblpWTacRoBIzALBEzKs0iTnTQCRmApCJiUl5Jpx2kEjMAsEPgvYk2T4XsoC7MAAAAASUVORK5CYII=\"></p><p><br></p><p><span style=\"color: rgb(230, 0, 0);\" class=\"ql-size-large\">去掉ip校验</span></p>");
sb.append("<p><span style=\"color: rgb(77, 77, 77);\">利用</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">来解析带</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">图片的富文本,思路是:</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板另存为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">mht</code><span style=\"color: rgb(77, 77, 77);\">格式,再修改后缀为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">ftl</code><span style=\"color: rgb(77, 77, 77);\">。将</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">字符串的图片,填充到制作的模板上。</span></p><p><span style=\"color: rgb(77, 77, 77);\">首先我们需要填充的</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板如下:</span></p>");
sb.append("</div>");
RichHtmlHandler test1handler = new RichHtmlHandler(sb.toString());
test1handler.setDocSrcLocationPrex("file:///C:/5181FBD1");
test1handler.setDocSrcParent("file3105.files");
test1handler.setNextPartId("01D73090.2D92D3A0");
test1handler.setShapeidPrex("_x56fe__x7247__x0020");
test1handler.setSpidPrex("_x0000_i");
test1handler.setTypeid("#_x0000_t75");
try {
test1handler.handledHtml(false,filePath);
} catch (IOException e) {
e.printStackTrace();
}
if (test1handler.getDocBase64BlockResults() != null
&& test1handler.getDocBase64BlockResults().size() > 0) {
for (String item : test1handler.getDocBase64BlockResults()) {
handledBase64Block += item + "\n";
}
}
if (test1handler.getXmlImgRefs() != null
&& test1handler.getXmlImgRefs().size() > 0) {
for (String item : test1handler.getXmlImgRefs()) {
xmlimaHref += item + "\n";
}
}
String bodyBlock = test1handler.getHandledDocBodyBlock();
dataMap.put("test1",bodyBlock);
StringBuilder sbTest2 = new StringBuilder();
sbTest2.append("<div>");
sbTest2.append("<img src=\"data:image/jpeg;base64,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