找回密码
 快速注册
搜索
查看: 73|回复: 13

pdf字體去重——4種常規字體、dzicon

[复制链接]

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-2-9 05:55 |阅读模式
本帖最后由 hbghlyj 于 2024-2-9 12:25 编辑 先生成一頁PDF,使它具有(未經過subsetting的)完整的Tahoma、Tahoma-Bold、SimSun字體
  1. import fitz
  2. doc = fitz.open()
  3. page = doc.new_page()
  4. page.insert_text((50, 50), "Hello, World!", fontname="Tahoma",fontfile = r"C:\Windows\Fonts\Tahoma.ttf")
  5. page.insert_text((50, 50), "Hello, World!", fontname="Tahoma-Bold",fontfile = r"C:\Windows\Fonts\tahomabd.ttf")
  6. page.insert_text((50, 50), "Hello, World!", fontname="SimSun",fontfile = r"C:\Windows\Fonts\simsun.ttc")
  7. doc.save("singlepage.pdf")
复制代码

运行pdflatex將singlepage.pdf作為第一頁,合併到2022-2023.pdf的第3-5頁
  1. \documentclass{article}
  2. \usepackage{pdfpages,pgffor}
  3. \begin{document}
  4. \includepdf{singlepage.pdf}
  5. \foreach \n in {3,...,5}{\includepdf[pages=\n,fitpaper]{2022-2023.pdf}}
  6. \end{document}
复制代码

用grep查找pdf內容
  1. strings 1.pdf | grep "DescendantFonts" -B 4 --color='auto'
复制代码

Screenshot 2024-02-08 214837.png
可以看到,前3個屬於(第一頁)singlepage.pdf,我們將把後面各頁的DescendantFonts引用都替换為singlepage.pdf的DescendantFonts引用

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 05:57
$type replace.py (927 Bytes, 下载次数: 0)
上面是4頁的1.pdf,运行replace.py,它把1.pdf的第2-4頁的DescendantFonts引用都替换為了第1頁的DescendantFonts引用,得到1_modified.pdf(20MB)
再运行gs(dFirstPage=2 將第一頁去除了)
  1. gswin64c.exe -sDEVICE=pdfwrite -dFirstPage=2 -dNOPAUSE -dQUIET -dBATCH -dPrinted=false -sOutputFile=1_modified_compressed.pdf 1_modified.pdf
复制代码

得到3頁的1_modified_compressed.pdf(741KB)
$type 1_modified_compressed.pdf (741.21 KB, 下载次数: 0)

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 06:04
在1_modified_compressed.pdf中查找SimSun,只有1個FontDescriptor,所以只包含了一次
Screenshot 2024-02-08 220257.png
  1. strings.exe 1_modified_compressed.pdf | grep.exe "SimSun" -A 4 --color='auto'
复制代码

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 06:07
作為對比,還是用pdflatex把2022-2023的第3-5頁合併為2.pdf,然後直接运行gs,得到2_compressed.pdf(813KB)然後grep SimSun:
Screenshot 2024-02-08 220541.png
出現了很多次FontDescriptor

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 06:12
@kuing 請驗收一下工程,可以看看1_modified_compressed.pdf有没有缺字的情況

另外,pdfpages這一步把鏈接弄丢了,解決方法是(後續處理)用pax:tex.stackexchange.com/questions/14620/how-to-preserve-hyperlinks-in-included-pdf

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 06:16
運行pdffonts 1_modified_compressed.pdf可以看到,我們處理過的Tahoma、Tahoma-Bold、SimSun都只出現了一次
接下來可以把MicrosoftYaHei-Bold、dzicon也去重。
剩下的[none],猜測是MathJax的字體
Screenshot 2024-02-08 221520.png
作為對比,運行pdffonts 2_compressed.pdf可以看到,直接运行GS的話,Tahoma、Tahoma-Bold、SimSun都出現多次
Screenshot 2024-02-08 221737.png

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 06:42
hbghlyj 发表于 2024-2-8 22:16
接下來可以把MicrosoftYaHei-Bold、dzicon也去重.
下載dzicon.woff2字體:kuing.cjhb.site/static/image/common/dzicon.woff2
pymupdf不支持woff2,须用woff2 to ttf converter 轉换為 $type dzicon.ttf (19.22 KB, 下载次数: 0)
按照1#的方法,重新生成singlepage.pdf:
  1. import fitz
  2. doc = fitz.open()
  3. page = doc.new_page()
  4. page.insert_text((50, 50), "Hello, World!", fontname="Tahoma",fontfile = r"C:\Windows\Fonts\Tahoma.ttf")
  5. page.insert_text((50, 50), "Hello, World!", fontname="Tahoma-Bold",fontfile = r"C:\Windows\Fonts\tahomabd.ttf")
  6. page.insert_text((50, 50), "Hello, World!", fontname="SimSun",fontfile = r"C:\Windows\Fonts\simsun.ttc")
  7. page.insert_text((50, 50), "Hello, World!", fontname="MicrosoftYaHei-Bold",fontfile = r"C:\Windows\Fonts\msyhbd.ttc")
  8. page.insert_text((50, 50), "Hello, World!", fontname="dzicon",fontfile = r"dzicon.ttf")
  9. doc.save("singlepage.pdf")
复制代码
運行pdflatex得到1.pdf
按照2#的方法,稍微調整replace.py,只在第3行增加2項:
  1. for [font,repl] in [[b"Tahoma-Bold",b"Tahoma#20Bold"],[b"Tahoma",b"Tahoma#20Regular"],[b"SimSun",b"SimSun#20Regular"],[b"MicrosoftYaHei-Bold",b"Microsoft#20YaHei#20Bold"],[b"dzicon",b"dzicon#20Regular"]]:
复制代码

運行python replace.py
運行GS(命令和2#相同)得到 $type 1_modified_compressed.pdf (711.19 KB, 下载次数: 1)
這次文件大小是711KB(相比2#的741KB又减少了)

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 07:20
Screenshot 2024-02-08 232241.png
這次是把有名字的5種字體都去重了。剩下的[none]是MathJax字體,
找到了OTF:cdn.jsdelivr.net/npm/mathjax@2.7.9/fonts/HTML-CSS/TeX/otf/MathJax_Math-Italic.otf
這個OTF在網頁可以使用:
  1. @font-face /* 3 */ {
  2.   font-family: MJXTEX-I;
  3.   src: url("https://cdn.jsdelivr.net/npm/mathjax@3/es5/output/chtml/fonts/woff-v2/MathJax_Math-Italic.woff") format("woff");
  4. }
复制代码
替换為
  1. @font-face /* 3 */ {
  2.   font-family: MJXTEX-I;
  3.   src: url("https://cdn.jsdelivr.net/npm/mathjax@2.7.9/fonts/HTML-CSS/TeX/otf/MathJax_Math-Italic.otf");
  4. }
复制代码
能正常顯示:
Screenshot 2024-02-09 021433.png
stackoverflow.com/questions/2085059/how-to-convert-type-3-font-to-type-1-font-in-pdf 說Type 3字體不可替换,最好的辦法是重新生成pdf。推測woff打印出來是Type3,所以先在CSS中像上圖那樣把woff替換為otf,不影響顯示,然後再打印,就可以去重MathJax字體。目前能做的只有這些,7#的結果最好了。

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 10:05
@kuing 7#的1_modified_compressed.pdf有没有缺字的情況

730

主题

1万

回帖

9万

积分

积分
93613
QQ

显示全部楼层

kuing 发表于 2024-2-9 14:38
太复杂了,工具那么多,我搞不懂……
我只是想问:
以你现在了解的情况,是否这次撸题集字体大且弄不小的原因是因为 mathjax?
2020-2021 的时候用的应该是 mathjax2.7,这次用的 mathjax3,区别就在这儿吗?

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 15:59
kuing 发表于 2024-2-9 06:38
是否这次撸题集字体大且弄不小的原 ...


哦不是這樣,是每頁都有4種常規字體(Tahoma-Bold, Tahoma, SimSun, Microsoft-Yahei-Bold)和dzicon和各種MathJax字體。
現在已經可以把4種常規字體和dzicon去重(見7#)。MathJax字體如果在CSS中用OTF也可以去重。

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 16:27
關於MathJax字體:其實Type3字體包含的是PDF碼
例如$\iff$字符屬於MathJax_Main-Regular
Screenshot 2024-02-09 082548.png
然後把它的stream內容複製到\pdfliteral裡,就可以看到$\iff$
  1. \documentclass{article}
  2. \newcommand{\pdfinlimg}[5]{
  3. \makebox[#1cm][l]{\immediate\pdfliteral{
  4.   q
  5.   #5
  6.   Q
  7. }\vbox to #2cm{}
  8. }
  9. }
  10. \begin{document}
  11. \pdfinlimg{1}{1}{48}{48}{%
  12. 0.1 0 0 0.1 0 0 cm
  13. 1858 0 56 -525 1802 24 d1
  14. 1438 -514 m
  15. 1438 -512 1440 -506 1443 -500 c
  16. 1465 -457 1498 -410 1529 -377 c
  17. 1539 -367 l
  18. 318 -367 l
  19. 328 -377 l
  20. 359 -410 392 -457 414 -500 c
  21. 417 -507 419 -511 419 -515 c
  22. 419 -521 414 -524 401 -525 c
  23. 395 -525 l
  24. 383 -525 384 -524 377 -512 c
  25. 317 -393 211 -299 72 -263 c
  26. 58 -259 56 -257 56 -250 c
  27. 56 -243 58 -241 72 -237 c
  28. 99 -230 132 -218 160 -204 c
  29. 252 -159 330 -81 377 12 c
  30. 383 24 384 24 399 24 c
  31. 413 24 419 22 419 16 c
  32. 419 12 417 7 414 0 c
  33. 392 -43 359 -90 328 -123 c
  34. 318 -133 l
  35. 1539 -133 l
  36. 1529 -123 l
  37. 1498 -90 1465 -43 1443 0 c
  38. 1440 7 1438 12 1438 16 c
  39. 1438 22 1444 24 1458 24 c
  40. 1473 24 1474 24 1480 12 c
  41. 1540 -106 1646 -201 1785 -237 c
  42. 1799 -241 1802 -243 1802 -250 c
  43. 1802 -257 1799 -259 1785 -263 c
  44. 1769 -267 1741 -277 1725 -284 c
  45. 1619 -328 1531 -410 1480 -512 c
  46. 1473 -524 1474 -525 1454 -525 c
  47. 1445 -525 1438 -521 1438 -514 c
  48. h
  49. 274 -173 m
  50. 264 -181 l
  51. 234 -204 191 -230 157 -245 c
  52. 151 -247 147 -250 y
  53. 185 -269 230 -293 264 -319 c
  54. 274 -327 l
  55. 602 -327 l
  56. 927 -328 l
  57. 928 -328 929 -327 930 -327 c
  58. 1583 -327 l
  59. 1593 -319 l
  60. 1623 -296 1666 -270 1700 -255 c
  61. 1706 -253 1710 -250 y
  62. 1672 -231 1627 -207 1593 -181 c
  63. 1583 -173 l
  64. 274 -173 l
  65. h
  66. f
  67. }
  68. \end{document}
复制代码

730

主题

1万

回帖

9万

积分

积分
93613
QQ

显示全部楼层

kuing 发表于 2024-2-9 17:27
hbghlyj 发表于 2024-2-9 15:59
哦不是這樣,是每頁都有5種常規字體和dzicon和各種MathJax字體。
現在已經可以把5種常規字體和dzicon去重 ...


我再说清楚一点,当年 2020-2021 时刚合并完也像现在这么大。
而当年经 Adobe 的 PDF 优化器优化字体后就能变小(减少 1/3 以上,具体细节我不清楚),
为何现在就没有这效果?这一点是否是因为 mathjax 版本变化引起?
要不你去看看 2020-2021 版的 PDF 的 mathjax 字体和现在的有什么不同?
如果方便的话,你有空上上Q,我们Q上聊

3149

主题

8386

回帖

6万

积分

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

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-2-9 20:10
kuing 发表于 2024-2-9 09:27
这一点是否是因为 mathjax 版本变化引起?


可能是!我在這帖用v2的otf字體替换了MathJax v3的woff字體,就可以去重了

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

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

Powered by Discuz!

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