Explorar el Código

fix: use new xref

Byaidu hace 1 año
padre
commit
94d5559b11
Se han modificado 3 ficheros con 12 adiciones y 8 borrados
  1. 1 1
      pdf2zh/__init__.py
  2. 7 1
      pdf2zh/high_level.py
  3. 4 6
      pdf2zh/pdfinterp.py

+ 1 - 1
pdf2zh/__init__.py

@@ -1,2 +1,2 @@
-__version__ = "1.7.0"
+__version__ = "1.7.1"
 __author__ = "Byaidu"

+ 7 - 1
pdf2zh/high_level.py

@@ -21,6 +21,7 @@ from pdf2zh.pdfinterp import PDFPageInterpreter, PDFResourceManager
 from pdf2zh.pdfpage import PDFPage
 from pdf2zh.utils import AnyIO, FileOrName, open_filename
 import numpy as np
+from pymupdf import Document
 
 
 def extract_text_to_fp(
@@ -43,7 +44,7 @@ def extract_text_to_fp(
     vfont: str = "",
     vchar: str = "",
     thread: int = 0,
-    doc_en = None,
+    doc_en: Document = None,
     model = None,
     lang_in: str = "",
     lang_out: str = "",
@@ -184,6 +185,11 @@ def extract_text_to_fp(
         layout[page.pageno]=box
         # print(page.number,page_layout)
         page.rotate = (page.rotate + rotation) % 360
+        # 新建一个 xref 存放新指令流
+        page.page_xref = doc_en.get_new_xref() # hack
+        doc_en.update_object(page.page_xref, "<<>>")
+        doc_en.update_stream(page.page_xref,b'')
+        doc_en[page.pageno].set_contents(page.page_xref)
         interpreter.process_page(page)
 
     device.close()

+ 4 - 6
pdf2zh/pdfinterp.py

@@ -1006,12 +1006,10 @@ class PDFPageInterpreter:
         self.device.fontid=self.fontid
         self.device.fontmap=self.fontmap
         ops_new=self.device.end_page(page)
-        if page.contents:
-            page_objids=[i.objid for i in page.contents]
-            # 上面渲染的时候会根据 cropbox 减掉页面偏移得到真实坐标,这里输出的时候需要用 cm 把页面偏移加回来
-            self.obj_patch[page_objids[0]]=f'q {ops_base}Q 1 0 0 1 {x0} {y0} cm {ops_new}' # ops_base 里可能有图,需要让 ops_new 里的文字覆盖在上面,使用 q/Q 重置位置矩阵
-            for objid in range(1,len(page_objids)):
-                self.obj_patch[page_objids[objid]]=''
+        # 上面渲染的时候会根据 cropbox 减掉页面偏移得到真实坐标,这里输出的时候需要用 cm 把页面偏移加回来
+        self.obj_patch[page.page_xref]=f'q {ops_base}Q 1 0 0 1 {x0} {y0} cm {ops_new}' # ops_base 里可能有图,需要让 ops_new 里的文字覆盖在上面,使用 q/Q 重置位置矩阵
+        for obj in page.contents:
+            self.obj_patch[obj.objid]=''
 
     def render_contents(
         self,