找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 579|回复: 17

[【原创】] 青苹果数据中心家庭藏书集锦pdf书签修复工具

[复制链接]
发表于 2024-5-30 16:42:30 | 显示全部楼层 |阅读模式
本帖最后由 wingdd 于 2024-5-30 16:51 编辑

青苹果数据中心出版的
家庭藏书集锦 家庭生活与艺术
家庭藏书集锦 法律经济军事
家庭藏书集锦 哲学
二十五史全集CD1
二十五史全集CD2
家庭藏书集锦 历史
家庭藏书集锦 马恩列全集
家庭藏书集锦 百科全书

上面的光盘的pdf在adobe reader 福晰阅读器下书签显示乱码,需要修正书签



UnicornViewer可以正常浏览,但是PdgCntEditor编辑书签有时会出现乱码.



回归问题的本质,早期青苹果数据中心出版的这些电子图书pdf内部书签文本编码不规范
这些pdf的书签使用不规范的Unicode编码字符串,gbk编码字符和8进制转义字符,甚至在这些文本中还有针对于换行符回车符的转义字符
既然问题清楚了,只需要修改对应的书签文本,使之符合pdf的标准,就能让这些pdf在阅读器下正常工作.

执行命令



修复效果



测试了1000多个pdf未发现异常.

代码
  1. use feature 'say';
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use open IN => ':raw', OUT => ':raw';
  6. use Encode ( 'decode', 'encode' );
  7. my ( $filename_in, $filename_out ) = @ARGV;
  8. if ( ( not defined $filename_in ) || ( not defined $filename_out ) ) {
  9.     die "perl 修复早期青苹果pdf书签.pl <input.pdf> <out.pdf>\n";
  10. }
  11. open my $fh1, "<", $filename_in or die $!;
  12. my $pdf_bin = do { local $/; <$fh1>; };
  13. close $fh1;

  14. sub deal_with_obj {
  15.     my $obj = $_[0];
  16.     if ( ( $obj =~ m/\/Title \(([^\n]+)\)/s ) && ( $obj =~ m/\/First |\/Parent / ) ) {
  17.         $obj =~ m/\/Title \(([^\n]+)\)/s;
  18.         my $title = $1;
  19.         $title =~ s/\r|\n//g;
  20.         if ( $title =~ m/\A\x{ff}\x{fe}/ ) {
  21.             #say 'fffe';
  22.             $title =~ s/\A\x{ff}\x{fe}//;
  23.             $title =~ s/\\n/\n/g;
  24.             $title =~ s/\\r/\r/g;
  25.             $title =~ s/\\t/\t/g;
  26.             $title =~ s/\\(.)/$1/g;
  27.             my $out_str_escaped = "<" . "feff" . unpack( 'H*', $title ) . ">";
  28.             $obj =~ s/\/Title \(([^\n]+)\)/"\/Title ".$out_str_escaped/es;
  29.         }
  30.         elsif ( $title =~ m/\A\x{fe}\x{ff}/ ) {
  31.             #say 'feff';
  32.             $title =~ s/\A\x{fe}\x{ff}//;
  33.             $title =~ s/\\n/\n/g;
  34.             $title =~ s/\\r/\r/g;
  35.             $title =~ s/\\t/\t/g;
  36.             $title =~ s/\\(.)/$1/g;
  37.             my $out_str_escaped = "<" . "feff" . unpack( 'H*', $title ) . ">";
  38.             $obj =~ s/\/Title \(([^\n]+)\)/"\/Title ".$out_str_escaped/es;
  39.         }
  40.         elsif ( $title =~ m/\\\d{3}/ ) {
  41.             #say '\\000';
  42.             my $out_str = "";
  43.             $title =~ s/\\n/\\014/g;
  44.             $title =~ s/\\r/\\015/g;
  45.             $title =~ s/\\t/\\011/g;
  46.             while ( $title =~ m/(\\\d{3}|[ -'\*-\/:-\[\]-~0-9])/g ) {
  47.                 my $chars = $1;
  48.                 if ( $chars =~ m/\\\d{3}/ ) {
  49.                     my $chars_new = $chars;
  50.                     $chars_new =~ s/\\//;
  51.                     my $str = pack( 'H*', sprintf( "%02x", oct( '0' . $chars_new ) ) );
  52.                     $out_str = $out_str . $str;
  53.                 }
  54.                 else {
  55.                     $out_str = $out_str . $chars;
  56.                 }
  57.             }
  58.             if ( $out_str =~ m/\A\x{ff}\x{fe}/ ) {
  59.                 $out_str =~ s/\x{ff}\x{fe}//;
  60.             }
  61.             else {
  62.                 $out_str = encode( 'UTF-16BE', decode( 'gbk', $out_str ) );
  63.             }
  64.             my $out_str_escaped = "<" . "feff" . unpack( 'H*', $out_str ) . ">";
  65.             $obj =~ s/\/Title \(([^\n]+)\)/"\/Title ".$out_str_escaped/es;
  66.         }
  67.         else {
  68.             #say 'gbk';
  69.             $title =~ s/\\n/\n/g;
  70.             $title =~ s/\\r/\r/g;
  71.             $title =~ s/\\t/\t/g;
  72.             $title =~ s/\\(.)/$1/g;
  73.             my $out_str_encode  = encode( 'UTF-16BE', decode( 'gbk', $title ) );
  74.             my $out_str_escaped = "<" . "feff" . unpack( 'H*', $out_str_encode ) . ">";
  75.             $obj =~ s/\/Title \(([^\n]+)\)/"\/Title ".$out_str_escaped/es;
  76.         }
  77.     }
  78.     return $obj;
  79. }
  80. $pdf_bin =~ s/(\d+ \d+ obj(\r|\n|\r\n).+?(\r|\n|\r\n)endobj(\r|\n|\r\n))/deal_with_obj($1)/esg;
  81. open my $fh2, ">", $filename_out or die $!;
  82. print $fh2 $pdf_bin;
  83. close $fh2;

复制代码
感觉有用的朋友可以下载附件支持一下.


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

3

查看全部评分

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2024-5-30 23:55:47 来自手机 | 显示全部楼层
感谢分享!青苹果的书好像见过。
回复

使用道具 举报

发表于 2024-5-31 02:50:57 | 显示全部楼层
meibf 发表于 2024-5-30 23:55
感谢分享!青苹果的书好像见过。

很老的书了,大约20年前在D版盘上见过,不是清晰版。
回复

使用道具 举报

发表于 2024-5-31 06:47:23 | 显示全部楼层
研究精神!解决问题能力!
回复

使用道具 举报

发表于 2024-5-31 07:30:57 来自手机 | 显示全部楼层
编程能力厉害?
回复

使用道具 举报

发表于 2024-5-31 10:09:48 来自手机 | 显示全部楼层
agent124 发表于 2024-5-31 02:50
很老的书了,大约20年前在D版盘上见过,不是清晰版。

青苹果的pdf应该是文字版的。
回复

使用道具 举报

发表于 2024-5-31 10:45:33 | 显示全部楼层
有乱码的地方不仅是书签。而且这套书还有其他问题,包括字体缺失、内容重复等,PDFToy的好几次升级都是针对这套书籍的修复需求。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

点评

大神,可以在论坛发售这个软件吗?  发表于 2024-5-31 15:41
回复

使用道具 举报

发表于 2024-5-31 13:52:50 | 显示全部楼层
看过青苹果的epub/azw3,这机构出的书都很垃圾,一个个的还非要盯着它修复,没有其他选择了吗?
回复

使用道具 举报

发表于 2024-5-31 14:13:53 | 显示全部楼层
以前为了看这套书还下了个方正的阅读器。但是太难用,而且没有移动版。

后来想办法,用pdf补丁丁修复字体,但还是有个别字会缺失,太麻烦了,还不如不看这套书。
回复

使用道具 举报

发表于 2024-5-31 16:12:40 | 显示全部楼层
xcnf 发表于 2024-5-31 14:13
以前为了看这套书还下了个方正的阅读器。但是太难用,而且没有移动版。

后来想办法,用pdf补丁丁修复字体 ...

如果不想修复PDF中的字体,直接从win98中复制两种字体过来即可
回复

使用道具 举报

发表于 2024-5-31 18:49:06 | 显示全部楼层
下载一个看看
回复

使用道具 举报

发表于 2024-5-31 19:59:35 | 显示全部楼层
仔细研究过,总共缺4个字体,要从win98里面复制过来:
黑体、宋体、仿宋_GB2312、楷体_GB2312

我用pdf补丁丁是这样替换字体的,替换完毕后还是正常的:

加载字体:汉仪中黑S Regular(替换 黑体)
加载字体:HYSuperSCJK(替换 宋体)
加载字体:方正仿宋_GBK(替换 仿宋_GB2312)
加载字体:方正楷体_GBK(替换 楷体_GB2312)
回复

使用道具 举报

发表于 2024-5-31 20:37:09 | 显示全部楼层
我也遇到过电子书正文也是乱码。
回复

使用道具 举报

发表于 2024-6-1 11:56:09 | 显示全部楼层
编程能力厉害?
PDFToy哪里有下啊
回复

使用道具 举报

发表于 2024-6-1 13:13:19 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 2024-6-1 18:51:56 | 显示全部楼层
这小白是需要学习基础才能懂
回复

使用道具 举报

发表于 2024-6-2 07:59:31 | 显示全部楼层
woyaodwn 发表于 2024-6-1 11:56
编程能力厉害?
PDFToy哪里有下啊

https://www.cnblogs.com/stronghorse/p/14572080.html
看最后一段
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-9-8 10:19 , Processed in 0.135746 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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