Browse Source

fix: code overlap

Byaidu 1 year ago
parent
commit
e9386aa667
1 changed files with 8 additions and 2 deletions
  1. 8 2
      pdf2zh/converter.py

+ 8 - 2
pdf2zh/converter.py

@@ -231,7 +231,11 @@ class TranslateConverter(PDFConverterEx):
                 if (                                                        # 判定当前公式是否结束
                     not cur_v                                               # 1. 当前字符不属于公式
                     or cls != xt_cls                                        # 2. 当前字符与前一个字符不属于同一段落
-                    or (abs(child.x0 - xt.x0) > vmax and cls != 0)          # 3. 段落内换行,可能是一长串斜体的段落,也可能是段内分式换行,这里设个阈值进行区分
+                    # or (abs(child.x0 - xt.x0) > vmax and cls != 0)        # 3. 段落内换行,可能是一长串斜体的段落,也可能是段内分式换行,这里设个阈值进行区分
+                    # 禁止纯公式(代码)段落换行,直到文字开始再重开文字段落,保证只存在两种情况
+                    # A. 纯公式(代码)段落(锚定绝对位置)sstk[-1]=="" -> sstk[-1]=="$v*$"
+                    # B. 文字开头段落(排版相对位置)sstk[-1]!=""
+                    or (sstk[-1] != "" and abs(child.x0 - xt.x0) > vmax)    # 因为 cls==xt_cls==0 一定有 sstk[-1]=="",所以这里不需要再判定 cls!=0
                 ):
                     if vstk:
                         if (                                                # 根据公式右侧的文字修正公式的纵向偏移
@@ -240,6 +244,8 @@ class TranslateConverter(PDFConverterEx):
                             and child.x0 > max([vch.x0 for vch in vstk])    # 3. 当前字符在公式右侧
                         ):
                             vfix = vstk[0].y0 - child.y0
+                        if sstk[-1] == "":
+                            xt_cls = -1 # 禁止纯公式段落(sstk[-1]=="$v*$")的后续连接,但是要考虑新字符和后续字符的连接,所以这里修改的是上个字符的类别
                         sstk[-1] += f"$v{len(var)}$"
                         var.append(vstk)
                         varl.append(vlstk)
@@ -263,7 +269,7 @@ class TranslateConverter(PDFConverterEx):
                         child.size > pstk[-1].size / 0.79                   # 1. 当前字符显著比段落字体大
                         or len(sstk[-1].strip()) == 1                       # 2. 当前字符为段落第二个文字(考虑首字母放大的情况)
                     ):
-                        pstk[-1].y -= child.size - pstk[-1].size             # hack 这个段落纵向位置的修正有问题,不过先凑合用吧
+                        pstk[-1].y -= child.size - pstk[-1].size            # 修正段落初始纵坐标,假设两个不同大小字符的上边界对齐
                         pstk[-1].size = child.size
                     sstk[-1] += child.get_text()
                 else:                                                       # 公式入栈