用EmEditor实现PDF转Word后的对齐排版
Redraw = false//禁止重绘(类似于VBA中的: Application.screenupdating=FALSE),以提高运行效率
//去除所有空行和只由空白字符构成的行
document.selection.replace("^\\s*?\\n|\\r\\n$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF )
//下面是Plan A
function planA(n){
//去除所有不是由数字或\t开头的非空行
document.selection.replace("\\r\\n^[^\\d\\t].*?$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF )
//以下是核心代码,我把它们写进了一个块中,会根据实际情况自动生成具体的解决方案
{
var find = "^([^\\t\\r]+)",replace = "$1",str = ""//初始化一些变量
//如下是1个迭代的过程并包括下面的拼接,我把它们写进了一个块中,是核心代码中的关键代码
{
for(var i=1;i<=n;i++){
str = str+"\\t([^\\t\\r]*)"
replace = replace+"\\t$"+(i+1)+"$"+(n+i+1)
}
find = find+str+"\\r\\n"+str+"$"
}
document.selection.Replace(find, replace, eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF )
}
}
//下面是Plan B
function planB(n){
//去除所有不是由数字或\t开头的非空行
document.selection.replace("\\r\\n^[^\\d\\t].*?$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF )
lines = document.getLines()//获取此时文档中的行数
if(lines-1){//如果行数>1,则进行进一步处理
document.selection.startOfDocument()//光标移动到文档开头
document.selection.lineDown(0,1)//光标向下移动1行
//如下是1个迭代的过程,是核心代码
for(var lineNo=2;lineNo<=lines;){
document.selection.charRight(1,1)//光标向右移动1个字符并选中之间的部分
if(document.selection.text=="\t"){//如果选中的是\t,则进行进一步处理
//获取相邻的2行中的文本,分别传递给2个变量
var str1=document.getLine(lineNo-1)+"\t\t"
var str2=document.getLine(lineNo)+"\t\t"
//创建2个正则表达式对象
var reg1 = editor.regex
var reg2 = editor.regex
//定义这2个正则表达式
reg1.Global = true
reg1.Pattern = "([^\t]*)\t"
reg2.Global = true
reg2.Pattern = "([^\t]*)\t"
//声明并初始化strr1和strr2
var strr1 = reg1.Find(str1).Item(1).Value,strr2 = reg2.Find(str2).Item(1).Value
var str = ""//初始化str
///如下是1个迭代的过程,是核心代码中的关键代码
for(var i = 0;i<=n;i++){
if(i>0){
str+="\t"
}
str=str+strr1+strr2
strr1 = reg1.Find(str1).Item(1).Value
strr2 = reg2.Find(str2).Item(1).Value
}
document.selection.endOfLine()//光标移动到当前行尾
document.selection.startOfLine(1)//光标移动到当前行首,并选中之间部分
document.selection.lineUp(1,1)//光标向上移动1行,并选中之间部分
document.write(str)//把str写入文档以替换当前选中部分
document.selection.charRight(0,1)//光标向右移动1个字符
lines--//因为以上处理会使文档减少1行,所以lines=lines-1
}else{
document.selection.charLeft(0,1)//光标向左移动1个字符
document.selection.lineDown(0,1)//向下移动光标一定的行数
lineNo++
}
}
}
}
//使用try{}catch(err){},如果捕获错误,则弹出对话框并终止宏
try{//尝试获取第2行,如果没有第2行,就会抛出错误
document.GetLine(2)
}
catch(err){//发生错误时将其捕获,并进行进一步处理
alert("其实你并没有必要再做多余的处理")
quit()//终止执行宏
}
var n = document.getLine(2).match(/\t/g)//分析str中\t的情况
if(n){//如果n!=null,则进行进一步处理
n = n.length//获取当前第2行的\t数目并赋值给n
if(n<5){
planA(n)
}else{
answer = confirm(//在特殊情况下,弹出对话框让用户自行决定是否选择替换方案
"目前貌似有"+(n+1)+"列,但是如果表格的列数>=6,\
Plan A就不能正确处理,因为EmEditor的正则表达式\
引擎最多只支持9个分组和10组反向引用,"+(n+1)+"列\
就需要"+(2*n+1)+"个分组。不过我有一个PlanB,或许\
能得到正确的处理结果,请问是否要选用Plan B?")
if(answer ){//如果用户选择了是,则进行进一步处理
planB(n)
}else{//否则终止执行宏
quit()
}
}
}else{//如果n==null
alert("我认为这个宏不足以解决问题")
}
Redraw = true//允许重绘
序号为首列的表格排版(实现1-基于EmEditor的正则表达式引擎)
Redraw = false//禁止重绘(类似于VBA中的: Application.screenupdating=FALSE),以提高运行效率
//去除所有空行和只由空白字符构成的行
document.selection.replace("^\\s*?\\n|\\r\\n$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF )
lines = document.getLines()//获取此时文档中的行数
if(lines==1){//如果只有1行,则不需要进行处理
alert("其实你并没有必要再做多余的处理")
}else{//如果行数>1,则进行进一步处理
//由于第1行可能是某些描述性文字,所以分析第2行,并进行一些判断和选择
if(document.getLine(2).indexOf("\t")>-1){//如果存在\t
//去除所有不是由数字或\t开头的非空行
document.selection.replace("\\r\\n^[^\\d\\t].*?$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF )
lines = document.getLines()//获取此时文档中的行数
if(lines-1){//如果行数>1,则进行进一步处理
document.selection.startOfDocument()//光标移动到文档开头
document.selection.lineDown(0,1)//光标向下移动1行
//如下是1个迭代的过程,是核心代码
for(var lineNo=2;lineNo<=lines;){
document.selection.charRight(1,1)//光标向右移动1个字符并选中之间的部分
if(document.selection.text=="\t"){//如果选中的是\t,则进行进一步处理
//获取相邻的2行中的文本,并用\t进行分组,把得到的2个数组分别传递给2个变量
str1=document.getLine(lineNo-1).split("\t")
str2=document.getLine(lineNo).split("\t")
document.selection.selectLine()//选中光标所在行
document.selection.Delete()//删除选中的这一行,所有下面的行(如果有的话)上移1行
document.selection.lineUp(0,1)//光标向上移动1行
document.selection.selectLine()//选中光标所在行
document.selection.Delete()//删除选中的这一行,所有下面的行(如果有的话)上移1行
document.selection.lineOpen(true)//在光标所在行和上一行之间插入1个空白行,并把光标移过去
///如下是1个迭代的过程,是核心代码中的关键代码
for(var i=0,n=str1.length;i<n;i++){
if(i){
document.write("\t")
}
document.write(str1[i]+str2[i])
}
document.selection.charRight(0,1)//光标向右移动1个字符
lines--//因为以上处理会使文档减少1行,所以lines=lines-1
}else{
document.selection.charLeft(0,1)//光标向左移动1个字符
document.selection.lineDown(0,1)//向下移动光标一定的行数
lineNo++
}
}
}
}else{//tabs==null时的提示信息
alert("我认为这个宏不足以解决问题")
}
}
Redraw = true//允许重绘
序号为首列的表格排版(实现2-基于JavaScript的split()方法)
Redraw = false//禁止重绘(类似于VBA中的: Application.screenupdating=FALSE),以提高运行效率
//去除所有空行和只由空白字符构成的行
document.selection.replace("^\\s*?\\n|\\r\\n$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF )
lines = document.getLines()//获取此时文档中的行数
if(lines==1){//如果只有1行,则不需要进行处理
alert("其实你并没有必要再做多余的处理")
}else{//如果行数>1,则进行进一步处理
//由于第1行可能是某些描述性文字,所以分析第2行,并进行一些判断和选择
if(document.getLine(2).indexOf("\t")>-1){//如果存在\t
//去除所有不是由数字或\t开头的非空行
document.selection.replace("\\r\\n^[^\\d\\t].*?$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF )
lines = document.getLines()//获取此时文档中的行数
if(lines-1){//如果行数>1,则进行进一步处理
document.selection.startOfDocument()//光标移动到文档开头
document.selection.lineDown(0,1)//光标向下移动1行
//如下是1个迭代的过程,是核心代码
for(var lineNo=2;lineNo<=lines;){
document.selection.charRight(1,1)//光标向右移动1个字符并选中之间的部分
if(document.selection.text=="\t"){//如果选中的是\t,则进行进一步处理
//获取相邻的2行中的文本,分别传递给2个变量
var str1=document.getLine(lineNo-1)
var str2=document.getLine(lineNo)
//创建2个正则表达式对象
var reg1 = /[^\t]*/g, reg2 = /[^\t]*/g
//声明并初始化strr1和strr2
var strr1 = reg1.exec(str1),strr2 = reg2.exec(str2)
var str = ""//初始化str
///如下是1个迭代的过程,是核心代码中的关键代码
for(var i = 0;strr1!=null;i++){
if(i>0){
str+="\t"
}
str=str+strr1+strr2
if(strr1!=""){
reg1.exec(str1)
}
if(strr2!=""){
reg2.exec(str2)
}
strr1 = reg1.exec(str1)
strr2 = reg2.exec(str2)
}
document.selection.endOfLine()//光标移动到当前行尾
document.selection.startOfLine(1)//光标移动到当前行首,并选中之间部分
document.selection.lineUp(1,1)//光标向上移动1行,并选中之间部分
document.write(str)//把str写入文档以替换当前选中部分
document.selection.charRight(0,1)//光标向右移动1个字符
lines--//因为以上处理会使文档减少1行,所以lines=lines-1
}else{
document.selection.charLeft(0,1)//光标向左移动1个字符
document.selection.lineDown(0,1)//向下移动光标一定的行数
lineNo++
}
}
}
}else{//如果不存在\t
alert("我认为这个宏不足以解决问题")
}
}
Redraw = true//允许重绘
序号为首列的表格排版(实现3-基于JavaScript的exec()方法)
用EmEditor实现PDF转Word后的对齐排版的更多相关文章
- 基于DevExpress实现对PDF、Word、Excel文档的预览及操作处理
http://www.cnblogs.com/wuhuacong/p/4175266.html 在一般的管理系统模块里面,越来越多的设计到一些常用文档的上传保存操作,其中如PDF.Word.Excel ...
- 15个最好的PDF转word的在线转换器,将PDF文件转换成doc文件
PDF是一种文件格式,包含文本,图像,数据等,这是独立于操作系统的文件类型.它是一个开放的标准,压缩,另一方面DOC文件和矢量图形是由微软文字处理文件.该文件格式将纯文本格式转换为格式化文档.它支持几 ...
- iText导出pdf、word、图片
一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...
- PDF转WORD工具 Solid Converter PDF v9.1.6744
Solid Converter PDF中文破解版(pdf转换成word转换器)是一款功能强大的PDF格式转换软件.Solid Converter PDF允许用户将PDF转换为Word(PDF to W ...
- 如何保存PDF、Word和Excel文件到数据库中
在项目中,有时候我们很需要把PDF.Word和Excel文档等等上传到数据库,以便日后使用.今天这篇文章向大家讲解如何将这些文件保存到数据库的. 详细步骤 第一步:打开数据库,单击新建查询,创建一个名 ...
- 判断pdf、word文档、图片等文件类型(格式)、大小的简便方法
判断pdf.word文档.图片等文件类型(格式).大小的简便方法 很久没发文了,今天有时间就写一下吧. 关于上传文件,通常我们都需要对其进行判断,限制上传的类型,如果是上传图片,我们甚至会把图片转化成 ...
- 某pdf转word v6.3.0.2算法分析
某pdf转word v6.3.0.2算法分析 [文章标题]某pdf转word v6.3.0.2算法分析 [文章作者]jieliuhouzi[原版下载]www.pdfcword.cn [保护方式]序列号 ...
- Java 将PDF 转为Word、图片、SVG、XPS、Html、PDF/A
本文将介绍通过Java编程来实现PDF文档转换的方法.包括: 1. PDF转为Word 2. PDF转为图片 3. PDF转为Html 4. PDF转为SVG 4.1 将PDF每一页转为单个的SVG ...
- C# 将PDF转为Word、Html、XPS、SVG、PCL、PS——基于Spire.Cloud.PDF
Spire.Cloud.PDF提供了接口PdfConvertApi可用于将PDF文档转换为其他格式文档,如Word(docx/doc).Html.XPS.SVG.PCL.PS.Png以及XPS转成PD ...
随机推荐
- 导出BOM表
1.Report->Bill of Materials for Project 将Value拖上左上角的Grouped Columns 2.在Excel表中全选器件,右键设置"设置单元 ...
- 配置IIS的通配符应用程序映射
使用IIS 6架设网站,如果要使用伪静态的功能,可能需要设置“通配符应用程序映射(执行顺序)”. 在Windows Server 2012 r2 的IIS 8中,对应的是添加设置“通配符脚本映射”,参 ...
- SQL SERVER 多数据导入
public bool CreateTB_PROPERTY_MODELLByList(List<TB_PROPERTY_MODEL> entity) { try { //将集合转换成Dat ...
- EC笔记:第4部分:19、设计class犹如设计type
设计一个class,应该考虑以下问题: 新type的对象应该怎样创建和销毁? 构造函数 析构函数 内存分配 内存释放 对象的初始化和对象的赋值应该有什么样的差别? 拷贝构造函数 赋值运算符 新对象如果 ...
- Java 程序员们值得一看的好书推荐
"学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一 ...
- [(ngModel)]的实现原理
讨论[(ngModel)]之前,先讲下属性绑定和事件绑定. 在属性绑定中,值从模型中流动到视图上的目标属性.[],通过把属性名放在方括号中来标记出目标属性.这是从模型到视图的单向数据绑定. 在 ...
- JavaScript中‘this’关键词的优雅解释
本文转载自:众成翻译 译者:MinweiShen 链接:http://www.zcfy.cc/article/901 原文:https://rainsoft.io/gentle-explanation ...
- iOS --SQL的增加、删除、查找、修改
iOS对于数据库的操作:增加.删除.查找.修改 首先需要创建一个数据库:本程序的数据库是在火狐浏览器里的插件里写的微量型数据库 火狐找查找SQLite Manager的步骤: 第一步:在工具栏找到附加 ...
- SegmentControl 那些令人烦恼的事儿
每个人的曾经都很苦逼.我知道我很卑微,但我不曾放慢脚步,在这条路上至死不悔.愿与你同行. UISegmentControl 概述 UISegmentControl 是系统的段选择控件,具有简洁大方的外 ...
- 巧用git bash
利用git base 实现的仿linux上面的命令,进行一些类linux的操作 .如 vim ls grep .. 例 : 利用grep递归查找当前文件夹中包含php5apache字样的文件