用VBA将word文档处理成支持弹出式注释的epub文档可用的html内容

有一种epub文件,其中的注释以弹窗形式显示,如下图:

点击注释引用后,对应的注释内容会弹出在页面中显示,再次点击弹窗外的任意位置该弹窗即关闭,关闭后点击任意注释引用,对应的注释内容会弹窗显示。

实现弹出式注释可以用CSS伪类、JavaScript、img标签的alt属性等各种方法,例如此文将带注释的Word文档改造成点击注释引用即可弹窗显示注释的HTML文档-CSDN博客即给出了一种JavaScript实现的方式。但是这些方式往往在PC上效果不错,但在手机、平板等设备上就没法弹出了。实际上,根据epub3规范,一个epub文档中的html文件如果符合以下范式即自动支持如上图的弹出式注释:

1、html标签中引入epub命名空间,如下:

html 复制代码
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">

2、注释引用标签(一般用a标签)加入epub:type="noteref"属性,且注释引用的链接目标为对应的注释内容;

3、注释内容标签(可用div、aside等)加入epub:type="footnote"属性。

这种实现方法不依赖任何CSS或JavaScript,不但在PC上效果不错,在许多支持epub3标准的手机电子书阅读APP上(例如静读天下、汉王墨水屏自带读书APP等)也能弹出显示注释,免除页面跳转的麻烦,因此是首选方法。

现在我们将用VBA自动更正错误的注释引用序号-CSDN博客处理好注释引用与注释编号的文档改造成符合上述规范的html文件所需内容。为便于处理,我们首先在每个诗标题前插入一个连续型分节符,代码如下:

vbscript 复制代码
Sub 在符合条件的段落前插入分节符()
    Dim pos As Long, styleName$
    styleName = "标题 3"
    
    With Selection
        .HomeKey wdStory '光标回到文档开头,此时Selection.Start为0
        Do
            pos = .Start '先记录光标位置
            .GoTo wdGoToHeading, wdGoToNext, 1 '向后移动到下一个标题,以标题为对象遍历文档
            If .Start = pos Then Exit Do ' 光标位置不变则已遍历完所有标题,退出循环
            
            If .Paragraphs(1).Style = styleName Then
                .InsertBreak Type:=wdSectionBreakContinuous ' 连续型分节符
            End If
            
        Loop
    End With
 
End Sub

然后用下面的代码将处理好的word文档内容修改成html文件所需内容:

vbscript 复制代码
Sub txt2epubhtml()
    ' 方便多数手机epub阅读器阅读,PC阅读效果也好,无需css配合
    Dim aSec As Section, chapter%, regStr$, i%, j%, href$, paraTxt$
    Dim searchRange As Range, refRange As Range
    Dim regEx As RegExp, match, matches As Object
    
    regStr = "[\u2460-\u2473]"
    Set regEx = CreateObject("VBScript.RegExp")
    With regEx
        .Global = True
        .ignoreCase = True
        .Pattern = regStr '
    End With


    For Each aSec In ActiveDocument.Sections
        chapter = chapter + 1
        i = 0
        Set searchRange = aSec.Range
        Set matches = regEx.Execute(searchRange.Text) ' 在搜索范围内执行匹配操作
        For j = 0 To matches.Count / 2 - 1
            Set refRange = searchRange
            With refRange.Find
                .Text = matches(j).Value
                .Wrap = 1 ' wdFindContinue
                .Execute ' 找到注释引用

                If refRange.Find.found Then
                    i = i + 1
                    href = "c" & Format(chapter, "000") & "_" & Trim(Str(i))
                    refRange.Text = "<a id=""ref_" & href & """ epub:type=""noteref"" href=""#" & href & """><sup>" & _
                        refRange.Text & "</sup></a>"
                    refRange.SetRange refRange.End, searchRange.End
                    ' 向下找到与已找到的注释引用对应的注释编号
                    .Forward = True
                    .Execute
                    ' 改为向上查找,找到下一条注释引用
                    .Forward = False
                    refRange.Select
                    If refRange.Find.found Then
                        paraTxt = refRange.Paragraphs(1).Range.Text
                        refRange.Paragraphs(1).Range.Text = "<aside epub:type=""footnote"" id=""" & _
                            href & """><a href=""#ref_" & href & """>" & Left(paraTxt, 1) & "</a>" _
                            & Mid(paraTxt, 2, Len(paraTxt) - 2) & "</aside>" & vbCrLf
                    Else
                        MsgBox "找不到对应的注释内容,请检查文档"
                        Exit Sub
                    End If
                End If
            End With
        Next j
    Next aSec
    
    Dim ps As Object
    Set ps = ActiveDocument.Paragraphs
    For i = 1 To ps.Count
        paraTxt = ps(i).Range.Text
        ' 防止样式为标题3的分节符影响输出,并防止包裹<aside>标签
        If ps(i).Style = "标题 3" And Len(paraTxt) > 1 And Left(paraTxt, 6) <> "<aside" Then
            ps(i).Range.Text = "<h3>" & Left(paraTxt, Len(paraTxt) - 1) & "</h3>" & vbCrLf
        ElseIf ps(i).Style = "标题 4" And Len(paraTxt) > 1 Then
            ps(i).Range.Text = "<h4>" & Left(paraTxt, Len(paraTxt) - 1) & "</h4>" & vbCrLf
        ' 防止空白段落影响输出,并防止包裹<aside>标签
        ElseIf ps(i).Style = "正文" And Len(paraTxt) > 1 And Left(paraTxt, 6) <> "<aside" Then
            ps(i).Range.Text = "<p class=""normaltext"">" & Left(paraTxt, Len(paraTxt) - 1) & "</p>" & vbCrLf
        End If
    Next i
End Sub

经过上面的处理,Word文档中的文本变成了如下内容:

html 复制代码
<h3>落日前墟望贈范廣州雲</h3>
<p class="normaltext">緣溝緑草蔓,扶楥雜華舒<a id="ref_c001_1" epub:type="noteref" href="#c001_1"><sup>①</sup></a>。輕煙淡柳色,重霞映日餘<a id="ref_c001_2" epub:type="noteref" href="#c001_2"><sup>②</sup></a>。遥遥長路遠<a id="ref_c001_3" epub:type="noteref" href="#c001_3"><sup>③</sup></a>,寂寂行人疏<a id="ref_c001_4" epub:type="noteref" href="#c001_4"><sup>④</sup></a>。我心懷碩德,思欲命輕車<a id="ref_c001_5" epub:type="noteref" href="#c001_5"><sup>⑤</sup></a>。高門盛游侣,誰肯進畋漁<a id="ref_c001_6" epub:type="noteref" href="#c001_6"><sup>⑥</sup></a>?</p>
<h4>【題解】</h4>
<p class="normaltext">本篇見《詩紀》八三。《藝文類聚》三一僅載有該詩的前六句,且題作《落日贈范岫》。范廣州雲,即范雲。詳前《酬范記室雲》説明。據《南齊書·東昏侯紀》載,范雲於永元元年(四九九)六月,由始興内史任遷廣州刺史。而據《梁書》本傳,范在廣州刺史任上"坐徵還下獄,會赦免"。另據《南齊書·東昏侯紀》載,永元元年十月,以始興内史顏翻爲廣州刺史。由此可知,范雲在廣州前後不及半年。並由此推知,此詩應作於永元元年(四九九)中。</p>
<p class="normaltext">王夫之云:"寄婉於促,如笙聲之音。雖非琴瑟,正自琅然動人。(《古詩評選》)</p>
<h4>【校注】</h4>
<aside epub:type="footnote" id="c001_1"><a href="#ref_c001_1">①</a>"緣溝"二句:緣,沿。蔓。滋長。扶,沿。楥,籬笆。雜華,雜花,各種各樣的花。《文選》四三丘希範(遲)《與陳伯之書》:"暮春三月,江南草長,雜花生樹,群鶯亂飛。"舒,開放。二句言春日草緣溝生長,花傍籬笆盛開。</aside>
<aside epub:type="footnote" id="c001_2"><a href="#ref_c001_2">②</a>"輕煙"二句:輕煙,指暮靄。重霞,謂色彩濃重的晚霞。映,《類聚》作"掩"。日餘,謂落日餘暉。二句言翠碧的楊柳在暮靄中隱去,落日餘暉使晚霞更加絢麗。</aside>
<aside epub:type="footnote" id="c001_3"><a href="#ref_c001_3">③</a>遠:《類聚》作晚。</aside>
<aside epub:type="footnote" id="c001_4"><a href="#ref_c001_4">④</a>疏:稀少。</aside>
<aside epub:type="footnote" id="c001_5"><a href="#ref_c001_5">⑤</a>我心"二句:碩德,大德。碩,大。輕車,輕便之車。二句言我常感懷您知遇之德,打算前往廣,州探望。</aside>
<aside epub:type="footnote" id="c001_6"><a href="#ref_c001_6">⑥</a>"高門"二句:高門,高貴之門,對范雲住處的敬稱。盛,多。游侣,交游的友人。進,引薦。畋,通"佃"耕種。漁,捕魚。《尚書·多方》:"今爾尚爾宅,畋爾田。"孔穎達疏:"治田謂之畋,猶捕魚謂之漁。"畋漁,從事種田捕魚的人,是詩人自謙之詞。漁,張紘本作"魚"。二句承上言:但考慮到彼處高朋甚多,谁肯引進我這村野農夫呢?</aside>
 
<h3>范廣州宅聯句</h3>
<p class="normaltext">洛陽城東西,卻作經年别<a id="ref_c002_1" epub:type="noteref" href="#c002_1"><sup>①</sup></a>。昔去雪如花,今來花似雪。<a id="ref_c002_2" epub:type="noteref" href="#c002_2"><sup>②</sup></a>雲濛濛夕煙起,奄奄殘暉滅<a id="ref_c002_3" epub:type="noteref" href="#c002_3"><sup>③</sup></a>。遜非君愛滿堂,寧我安車轍<a id="ref_c002_4" epub:type="noteref" href="#c002_4"><sup>④</sup></a>。</p>
<h4>【題解】</h4>
<p class="normaltext">本篇見《詩紀》八四。《藝文類聚》二九截録前四句,即范雲詩,題作《别詩》,江本題作《范廣州聯句》。唐詩人李商隱的詩曾兩用其事,《詩話補遺》云:"何遜與范雲聯句詩云:·李商隱《送王校書分司詩》云:"多少分曹掌祕書,洛陽花雪夢隨君。定知何遜緣聯句,每到城東憶范雲。"又《漫成一絶》云:"不妨何范盡名家,未解當年重物華。遠把龍山千里雪,將來擬並洛陽花。"二詩皆用此事。"這說明此詩叙别頗有特色。此詩應爲范雲由廣州刺史任坐事徵還、赦免之後所作,時約在永元二年(五○○)任國子博士之前。</p>
<h4>【校注】</h4>
<aside epub:type="footnote" id="c002_1"><a href="#ref_c002_1">①</a>"洛陽"二句:洛陽,即今河南洛陽市。因其爲西晉都城,南朝人常借指京都建康。經年,常年。二句言咱們二人雖然住在京城的東西兩面,相距並不算遠,但卻常年不得見面。</aside>
<aside epub:type="footnote" id="c002_2"><a href="#ref_c002_2">②</a>"昔去"二句:雪如花,謂冬季;花似雪,言春日。《詩·小雅·采薇》有云:"昔我往矣,楊柳依依。今我來思,雨雪霏霏。"此處化用其意,言去年你離去時是大雪紛飛的冬天,今年再來卻是春花爛漫的季節了。</aside>
<aside epub:type="footnote" id="c002_3"><a href="#ref_c002_3">③</a>"濛濛"二句:濛濛,雲氣迷茫貌。同"蒙蒙"。《楚辭·九思·憫上》:"雲蒙蒙兮電倏爍,孤雌驚兮鳴呴呴。"註:"蒙,一作'濛'。"夕煙,暮靄。奄奄,日落昏闇貌。李密《陳情表》:"日薄西山,氣息奄奄。"殘暉,落日餘暉。二句寫來時暮靄乍起,太陽落山。</aside>
<aside epub:type="footnote" id="c002_4"><a href="#ref_c002_4">④</a>"非君"二句:用漢陳遵事,《漢書·陳遵傳》説:"遵耆(嗜酒,每大飲,賓客滿堂,輒關門,取客車轄投井中,雖有急,終不得去。"滿,原文誤作,蒲",據張紘本、薛本改。二句言如不是您如此好客,我怎能在您門外停下車子呢。</aside>
 
<h3>望廨前水竹答崔録事</h3>
<p class="normaltext">蕭蕭叢竹映,淡淡平湖靜<a id="ref_c003_1" epub:type="noteref" href="#c003_1"><sup>①</sup></a>。葉倒漣漪文,水漾檀樂影<a id="ref_c003_2" epub:type="noteref" href="#c003_2"><sup>②</sup></a>。相思不會面,相望空延頸<a id="ref_c003_3" epub:type="noteref" href="#c003_3"><sup>③</sup></a>。遠天去浮雲,長墟斜落景<a id="ref_c003_4" epub:type="noteref" href="#c003_4"><sup>④</sup></a>。幽疴與歲積,賞心隨事屏<a id="ref_c003_5" epub:type="noteref" href="#c003_5"><sup>⑤</sup></a>。鄉念一邅回<a id="ref_c003_6" epub:type="noteref" href="#c003_6"><sup>⑥</sup></a>,白髮生俄頃。</p>
<h4>【題解】</h4>
<p class="normaltext">本篇見《詩紀》八三,題下注:"《拾遺》作顧則心詩。張紘本、薛本等各本均載録此詩,説明不同意《選詩拾遺》的意見。廨,公廨,即官署。水竹,謂水邊之竹。崔録事,指崔慰祖。崔慰祖(四六五---四九九)字悦宗,清河武城(今山東武城縣)人。據《南齊書》本傳,崔慰祖齊時曾任始安王(蕭遥光)撫軍墨曹行參軍,轉刑獄,兼記室。《南齊書·百官志·四鎮將軍》:"凡公督府置佐:長史、司馬各一人.諸曹有録事、記室。録事,録事參軍的簡稱。晉置官。掌總録衆官府文簿,舉彈善惡。此爲對崔慰祖的敬稱。崔死於永元元年(四九九),則此詩不得晚於此時可知;崔任始安王記室是蕭遥光任撫軍將軍之時,即建武二年(四九五),則知此詩應作於建武二年至永元元年之間(四九五---四九九)。</p>
<h4>【校注】</h4>
<aside epub:type="footnote" id="c003_1"><a href="#ref_c003_1">①</a>"蕭蕭"二句:蕭蕭,竹影扶疏之狀。淡淡,水平滿貌。二句謂在平靜的湖面上倒映着扶疏秀美的竹影。</aside>
<aside epub:type="footnote" id="c003_2"><a href="#ref_c003_2">②</a>"葉倒"二句:漣漪文,水面被撞擊泛起的連瑣般的波紋。漪,托聲字,猶兮。文,同"紋"。《詩·魏風·伐檀》:"河水清且漣漪。"檀欒,秀美貌,多形容竹。《藝文類聚》六五枚乘《梁王兔園賦》:"修竹檀欒,夾池水旋。"檀樂影,即秀美的竹影。二句承上言風一吹,竹葉蘸着水面泛起漣漪波紋,美好的竹影便消失了。</aside>
<aside epub:type="footnote" id="c003_3"><a href="#ref_c003_3">③</a>延頸:伸長脖頸,翹盼綦切之狀。</aside>
<aside epub:type="footnote" id="c003_4"><a href="#ref_c003_4">④</a>"遠天"二句:去,離去,謂漸漸落下。長墟,謂村落。景,日光。二句寫傍晚"延頸"佇望的情景:殘霞將盡,落日餘暉,思友不至,更增惆悵。</aside>
<aside epub:type="footnote" id="c003_5"><a href="#ref_c003_5">⑤</a>"幽疴"二句:幽疴,猶沉疴。疴,病。王本作"疴"。與歲積,謂一年年加重。賞心,心意歡樂。《文選》三〇謝靈運《田南樹園激流植援》:"賞心不可忘,妙善冀能同。"屏,去。二句謂病體日漸沉重,難得有賞心樂事。</aside>
<aside epub:type="footnote" id="c003_6"><a href="#ref_c003_6">⑥</a>邅回:徘徊。《楚辭·九歎·怨思》:"寧浮沅而馳騁兮,下江湘以邅回。"鄉念邅回,謂思鄉的愁苦反復煎熬着自己。</aside>

只需要将上述内容拷贝到如下的HTML模板的body标签内部,及成为了符合epub3标准的弹出显示注释的HTML文档:

html 复制代码
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">

<head>
	<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />	

	
</head>

<body>
<!--注释引用和注释内容标签带有规定的epub:type属性且链接目标正确的HTML文本复制到此处-->
</body>

</html>

因为扫描文档在Word中校核并编辑出结构比较方便,因此以上通过VBA来处理Word中的文本,实际上,如果弄清了epub3标准的弹窗显示注释的要求,对不符合标准的Epub/HTML文件,也可以利用python的soup库进行修改,使其符合标准,那又是另一个主题了。

相关推荐
学软件的小铃铛2 小时前
解决word里插入公式后打不开的问题
word
源梦想11 小时前
如何统一修改word中所有英文字母的字体格式
word
诸葛小猿1 天前
Pdf转Word案例(java)
java·pdf·word·格式转换
爱喝一杯白开水1 天前
使用 Apache POI 生成包含文本和图片的 Word 文档
word·apache·poi·导出
搜移IT科技1 天前
word怎么删除空白页?word最后一页删不掉怎么办
word
源梦想1 天前
Word如何制作三线表格
word
tangjunjun-owen2 天前
第三章:langchain加载word文档构建RAG检索教程(基于FAISS库为例)
langchain·llm·word·faiss·rag
bu_shuo2 天前
Edge浏览器PDF字体显示错误
pdf·word·渲染错误
dbkx_292 天前
Word域操作记录(从1开始的毕业论文格式排版)
word
Dovis(誓平步青云)3 天前
智能推理DeepSeek-R1+Word深度整合业级智能办公构建
人工智能·深度学习·机器学习·语言模型·数据挖掘·word