找回密码
 快速注册
搜索
查看: 43|回复: 1

PDF去除兼容区码元

[复制链接]

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2023-6-28 07:06 |阅读模式
以这个PDF为例 $type study_physics_inUSTC.pdf (233.11 KB, 下载次数: 1)
PDF看上去没有重复的字,但PDF复制出的文字有看上去重复的字(码元不同)。
用Python过滤码点范围:
  1. unicode_string = """⼀一个⼈人的实际能⼒力力
  2. 确实很强,他往往能够表现出诸如成绩⾼高啊,科研成果好啊之类的特点。但是我们⼀一定要明
  3. ⽩白,是先有实际能⼒力力强了了,再⾃自然有地成绩⾼高或者成果好。如果只追求成绩⾼高,只追求成果
  4. 好这些纸⾯面数据,对实际能⼒力力提升并不不好处。那么有什什么坏处?坏处就是,满⾜足了了这个标准,
  5. 还有下⼀一个标准,还有下下⼀一个标准,⼈人⽣生永远在为了了⼀一个有⼀一个的标准奋⽃斗挣扎。我听过
  6. ⾮非常多的⼈人跟我抱怨,觉得上⼤大学、读博、⼯工作压⼒力力太⼤大。就以学术为例例:上学的时候要抢
  7. 分数抢排名要不不然不不能深造;深造了了以后还要抢⽂文章混数量量要不不然不不能毕业;毕业以后还要
  8. 想办法⽔水各种⾼高端杂志的⾼高⽔水平⽂文章要不不然找不不到教职;找到教职还要绞尽脑汁混项⽬目编题
  9. ⽬目,要不不然没有经费;有了了经费还要想办法搞结果要不不然不不能结题升职。。。整个⼈人⽣生为什什
  10. 么有这么多标准要去满⾜足?为什什么⼀一个⼀一个的问题要来难为我?为什什么我满⾜足了了这么多标准
  11. 却总没个尽头!然后抱怨的⼈人往往这个时候就显出了了⾮非常疲惫且消极的情绪。我⼀一般回答只
  12. 有⼀一句句:你满⾜足了了所有的标准,唯独忘了了最重要的那个标准——学术能⼒力力不不⾏行行。那些看上去"""
  13. def filter_unicode_range(string):
  14.     filtered_string = ""
  15.     for char in string:
  16.         if char == '\u3002' or '\u4E00' <= char <= '\u9FFF' or '\uFF00' <= char <= '\uFFEF':
  17.             filtered_string += char
  18.     return filtered_string
  19. filtered_string = filter_unicode_range(unicode_string)
  20. print(filtered_string)
复制代码

输出的正常文字:
一个人的实际能力确实很强,他往往能够表现出诸如成绩高啊,科研成果好啊之类的特点。但是我们一定要明白,是先有实际能力强了,再自然有地成绩高或者成果好。如果只追求成绩高,只追求成果好这些纸面数据,对实际能力提升
并不好处。那么有什么坏处?坏处就是,满足了这个标准,还有下一个标准,还有下下一个标准,人生永远在为了一个有一个的标准奋斗挣扎。我听过非常多的人跟我抱怨,觉得上大学读博工作压力太大。就以学术为例:上学的时候要 抢分数抢排名要不然不能深造;深造了以后还要抢文章混数量要不然不能毕业;毕业以后还要想办法水各种高端杂志的高水平文章要不然找不到教职;找到教职还要绞尽脑汁混项目编题目,要不然没有经费;有了经费还要想办法搞结果 要不然不能结题升职。。。整个人生为什么有这么多标准要去满足?为什么一个一个的问题要来难为我?为什么我满足了这么多标准却总没个尽头!然后抱怨的人往往这个时候就显出了非常疲惫且消极的情绪。我一般回答只有一句:你 满足了所有的标准,唯独忘了最重要的那个标准学术能力不行。那些看上去

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2023-6-28 09:41
将替换的文字写入新的PDF
  1. import fitz
  2. import string
  3. doc = fitz.open("study_physics_inUSTC.pdf")
  4. newdoc = fitz.open("")
  5. def filter_unicode_range(str):
  6.     filtered_str = ""
  7.     for char in str:
  8.         if char.isdigit() or char in string.punctuation or char == '。' or char == '、' or char == '—' or '\u4E00' <= char <= '\u9FFF' or '\uFF00' <= char <= '\uFFEF':
  9.             filtered_str += char
  10.     return filtered_str
  11. font=fitz.Font('china-s')
  12. for page in doc:
  13.     newpage=newdoc.new_page()
  14.     tw_black = fitz.TextWriter(newpage.rect, color=(0,0,0))
  15.     tw_red = fitz.TextWriter(newpage.rect, color=(1.0, 0.14901960784313725, 0.0))
  16.     blocks=page.get_text("dict")["blocks"]
  17.     for block in blocks:
  18.         for line in block["lines"]:
  19.             for span in line["spans"]:
  20.                 text = span["text"]
  21.                 tw = tw_black if span["color"]==0 else tw_red
  22.                 tw.append(
  23.                     span["origin"],
  24.                     filter_unicode_range(text),
  25.                     font=font,
  26.                     fontsize=span["size"]
  27.                 )
  28.     tw_black.write_text(newpage)
  29.     tw_red.write_text(newpage)
  30. newdoc.subset_fonts()
  31. newdoc.save("output.pdf",clean=True)
复制代码

得到文件尺寸为4MB
Ilovepdf选择Extreme Compression得到文件尺寸为176KB
$type output_compressed.pdf (175.99 KB, 下载次数: 0)

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 15:29

Powered by Discuz!

× 快速回复 返回顶部 返回列表