Bladeren bron

Merge pull request #182 from Byaidu/overlap

Fix code overlap
Byaidu 1 jaar geleden
bovenliggende
commit
bf4b35f757
2 gewijzigde bestanden met toevoegingen van 11 en 7 verwijderingen
  1. 8 2
      pdf2zh/converter.py
  2. 3 5
      pdf2zh/high_level.py

+ 8 - 2
pdf2zh/converter.py

@@ -231,7 +231,11 @@ class TranslateConverter(PDFConverterEx):
                 if (                                                        # 判定当前公式是否结束
                 if (                                                        # 判定当前公式是否结束
                     not cur_v                                               # 1. 当前字符不属于公式
                     not cur_v                                               # 1. 当前字符不属于公式
                     or cls != xt_cls                                        # 2. 当前字符与前一个字符不属于同一段落
                     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 vstk:
                         if (                                                # 根据公式右侧的文字修正公式的纵向偏移
                         if (                                                # 根据公式右侧的文字修正公式的纵向偏移
@@ -240,6 +244,8 @@ class TranslateConverter(PDFConverterEx):
                             and child.x0 > max([vch.x0 for vch in vstk])    # 3. 当前字符在公式右侧
                             and child.x0 > max([vch.x0 for vch in vstk])    # 3. 当前字符在公式右侧
                         ):
                         ):
                             vfix = vstk[0].y0 - child.y0
                             vfix = vstk[0].y0 - child.y0
+                        if sstk[-1] == "":
+                            xt_cls = -1 # 禁止纯公式段落(sstk[-1]=="$v*$")的后续连接,但是要考虑新字符和后续字符的连接,所以这里修改的是上个字符的类别
                         sstk[-1] += f"$v{len(var)}$"
                         sstk[-1] += f"$v{len(var)}$"
                         var.append(vstk)
                         var.append(vstk)
                         varl.append(vlstk)
                         varl.append(vlstk)
@@ -263,7 +269,7 @@ class TranslateConverter(PDFConverterEx):
                         child.size > pstk[-1].size / 0.79                   # 1. 当前字符显著比段落字体大
                         child.size > pstk[-1].size / 0.79                   # 1. 当前字符显著比段落字体大
                         or len(sstk[-1].strip()) == 1                       # 2. 当前字符为段落第二个文字(考虑首字母放大的情况)
                         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
                         pstk[-1].size = child.size
                     sstk[-1] += child.get_text()
                     sstk[-1] += child.get_text()
                 else:                                                       # 公式入栈
                 else:                                                       # 公式入栈

+ 3 - 5
pdf2zh/high_level.py

@@ -48,13 +48,11 @@ def extract_text_to_fp(
 
 
     parser = PDFParser(inf)
     parser = PDFParser(inf)
     doc = PDFDocument(parser, password=password)
     doc = PDFDocument(parser, password=password)
-    with tqdm.tqdm(
-        enumerate(PDFPage.create_pages(doc)),
-        total=total_pages,
-    ) as progress:
-        for pageno, page in progress:
+    with tqdm.tqdm(total=total_pages) as progress:
+        for pageno, page in enumerate(PDFPage.create_pages(doc)):
             if pages and (pageno not in pages):
             if pages and (pageno not in pages):
                 continue
                 continue
+            progress.update()
             if callback:
             if callback:
                 callback(progress)
                 callback(progress)
             page.pageno = pageno
             page.pageno = pageno