wingdd 发表于 2024-5-30 16:42:30

青苹果数据中心家庭藏书集锦pdf书签修复工具

本帖最后由 wingdd 于 2024-5-30 16:51 编辑

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

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



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



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

执行命令



修复效果



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

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

sub deal_with_obj {
    my $obj = $_;
    if ( ( $obj =~ m/\/Title \(([^\n]+)\)/s ) && ( $obj =~ m/\/First |\/Parent / ) ) {
      $obj =~ m/\/Title \(([^\n]+)\)/s;
      my $title = $1;
      $title =~ s/\r|\n//g;
      if ( $title =~ m/\A\x{ff}\x{fe}/ ) {
            #say 'fffe';
            $title =~ s/\A\x{ff}\x{fe}//;
            $title =~ s/\\n/\n/g;
            $title =~ s/\\r/\r/g;
            $title =~ s/\\t/\t/g;
            $title =~ s/\\(.)/$1/g;
            my $out_str_escaped = "<" . "feff" . unpack( 'H*', $title ) . ">";
            $obj =~ s/\/Title \(([^\n]+)\)/"\/Title ".$out_str_escaped/es;
      }
      elsif ( $title =~ m/\A\x{fe}\x{ff}/ ) {
            #say 'feff';
            $title =~ s/\A\x{fe}\x{ff}//;
            $title =~ s/\\n/\n/g;
            $title =~ s/\\r/\r/g;
            $title =~ s/\\t/\t/g;
            $title =~ s/\\(.)/$1/g;
            my $out_str_escaped = "<" . "feff" . unpack( 'H*', $title ) . ">";
            $obj =~ s/\/Title \(([^\n]+)\)/"\/Title ".$out_str_escaped/es;
      }
      elsif ( $title =~ m/\\\d{3}/ ) {
            #say '\\000';
            my $out_str = "";
            $title =~ s/\\n/\\014/g;
            $title =~ s/\\r/\\015/g;
            $title =~ s/\\t/\\011/g;
            while ( $title =~ m/(\\\d{3}|[ -'\*-\/:-\[\]-~0-9])/g ) {
                my $chars = $1;
                if ( $chars =~ m/\\\d{3}/ ) {
                  my $chars_new = $chars;
                  $chars_new =~ s/\\//;
                  my $str = pack( 'H*', sprintf( "%02x", oct( '0' . $chars_new ) ) );
                  $out_str = $out_str . $str;
                }
                else {
                  $out_str = $out_str . $chars;
                }
            }
            if ( $out_str =~ m/\A\x{ff}\x{fe}/ ) {
                $out_str =~ s/\x{ff}\x{fe}//;
            }
            else {
                $out_str = encode( 'UTF-16BE', decode( 'gbk', $out_str ) );
            }
            my $out_str_escaped = "<" . "feff" . unpack( 'H*', $out_str ) . ">";
            $obj =~ s/\/Title \(([^\n]+)\)/"\/Title ".$out_str_escaped/es;
      }
      else {
            #say 'gbk';
            $title =~ s/\\n/\n/g;
            $title =~ s/\\r/\r/g;
            $title =~ s/\\t/\t/g;
            $title =~ s/\\(.)/$1/g;
            my $out_str_encode= encode( 'UTF-16BE', decode( 'gbk', $title ) );
            my $out_str_escaped = "<" . "feff" . unpack( 'H*', $out_str_encode ) . ">";
            $obj =~ s/\/Title \(([^\n]+)\)/"\/Title ".$out_str_escaped/es;
      }
    }
    return $obj;
}
$pdf_bin =~ s/(\d+ \d+ obj(\r|\n|\r\n).+?(\r|\n|\r\n)endobj(\r|\n|\r\n))/deal_with_obj($1)/esg;
open my $fh2, ">", $filename_out or die $!;
print $fh2 $pdf_bin;
close $fh2;

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


meibf 发表于 2024-5-30 23:55:47

感谢分享!青苹果的书好像见过。

agent124 发表于 2024-5-31 02:50:57

meibf 发表于 2024-5-30 23:55
感谢分享!青苹果的书好像见过。

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

lforl 发表于 2024-5-31 06:47:23

研究精神!解决问题能力!

xdbbxdbb 发表于 2024-5-31 07:30:57

编程能力厉害?

meibf 发表于 2024-5-31 10:09:48

agent124 发表于 2024-5-31 02:50
很老的书了,大约20年前在D版盘上见过,不是清晰版。

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

strnghrs 发表于 2024-5-31 10:45:33

有乱码的地方不仅是书签。而且这套书还有其他问题,包括字体缺失、内容重复等,PDFToy的好几次升级都是针对这套书籍的修复需求。



jotis 发表于 2024-5-31 13:52:50

看过青苹果的epub/azw3,这机构出的书都很垃圾,一个个的还非要盯着它修复,没有其他选择了吗?

xcnf 发表于 2024-5-31 14:13:53

以前为了看这套书还下了个方正的阅读器。但是太难用,而且没有移动版。

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

strnghrs 发表于 2024-5-31 16:12:40

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

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

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

zhizun2 发表于 2024-5-31 18:49:06

下载一个看看

weist123 发表于 2024-5-31 19:59:35

仔细研究过,总共缺4个字体,要从win98里面复制过来:
黑体、宋体、仿宋_GB2312、楷体_GB2312

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

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

robertzhong 发表于 2024-5-31 20:37:09

我也遇到过电子书正文也是乱码。

woyaodwn 发表于 2024-6-1 11:56:09

编程能力厉害?
PDFToy哪里有下啊

金角大王 发表于 2024-6-1 13:13:19

感谢分享

hunt3er 发表于 2024-6-1 18:51:56

这小白是需要学习基础才能懂

strnghrs 发表于 2024-6-2 07:59:31

woyaodwn 发表于 2024-6-1 11:56
编程能力厉害?
PDFToy哪里有下啊
https://www.cnblogs.com/stronghorse/p/14572080.html
看最后一段
页: [1]
查看完整版本: 青苹果数据中心家庭藏书集锦pdf书签修复工具