拆解脚本

header_start=0
header_len=15xref_start=$(strings -a -t d $1 | grep -e "\bxref\b" | awk '{print $1}')
trailer_start=$(strings -a -t d $1 | grep -e "\btrailer\b" | awk '{print $1}')
#echo $xref_start
#echo $trailer_startxref_len=$(echo "$trailer_start - $xref_start" | bc)
#echo $xref_lenheader_dump=$(echo "$1" | sed -re 's/^(.*)\.pdf/tdis\_\1\_header\.bin/g')
dd if=$1 of=$header_dump bs=1 skip=$header_start count=$header_lenxref_dump=$(echo "$1" | sed -re 's/^(.*)\.pdf/tdis\_\1\_xref\.bin/g')
dd if=$1 of=$xref_dump bs=1 skip=$xref_start count=$xref_lentrailer_dump=$(echo "$1" | sed -re 's/^(.*)\.pdf/tdis\_\1\_trailer\.bin/g')
dd if=$1 of=$trailer_dump bs=1 skip=$trailer_start#cat tdis_"$1"_xref.bin | awk 'NF==3' | awk 'NR!=1{printf("%d 0 obj is at offset: %d\n", NR-1, $1);}'
cat $xref_dump | awk 'NF==3' | awk 'NR!=1{printf("%08d %08d\n", $1, NR-1);}' | sort > tdis_"$xref_dump"
#echo "$xref_start 0" >> tdis_"$xref_dump"
printf "%08d %08d\n" $xref_start 0 >> tdis_"$xref_dump"cat tdis_$xref_dump | awk 'BEGIN{loffset=0;lobjnum=0;}{printf("%3d %3d %3d\n", loffset, $1-loffset, lobjnum);loffset=$1;lobjnum=$2;}' | awk 'NR!=1' > tdis_metrics_"$xref_dump"if [ ! -d objects ]
thenmkdir objects
fi
cat tdis_metrics_"$xref_dump" | while read offset len objn
do
#echo $offset, $len, $objn
obj_name=$(printf "%s_%03d" $1 $objn | sed -re 's/^(.*)\.pdf/tdis\_\1\_obj/g' | awk '{printf("objects/%s.bin", $0);}')
#echo $obj_name
dd if=$1 of=$obj_name bs=1 skip=$offset count=$len
done

  

组合脚本

target=$1
dd if=$(ls -1 | grep "header.bin") of=$target bs=1 count=15obj_offset=15
obj_nums=0
for file in $(ls -1 objects)
do#echo $fileobj_len=$(wc objects/$file | awk '{print $3}')dd if=objects/$file of=$target bs=1 count=$obj_len seek=$obj_offsetprintf "%010d %05d n\n" $obj_offset 0 >> "tas_generated_"$1"_xref.bin" obj_offset=$[ $obj_offset + $obj_len ]obj_nums=$[ $obj_nums + 1 ]
done
echo "xref" >> $target
printf "0 %d\n" $obj_nums >> $target
echo "0000000000 65535 f" >> $target
cat "tas_generated_"$1"_xref.bin" >> $targetawk 'NR<=2' $(ls -1 | grep "trailer.bin") >> $target
echo "startxref" >> $target
echo $obj_offset >> $target
echo "%%EOF" >> $target

这样,我们就可以对解析出来的单个pdf对象进行单独操作了。

手动找出包含graphic operators stream的对象,使用下面脚本解压stream

target=$(ls -1 objects | grep "_obj_"$1".bin")
grep -Ubo --binary-file=text stream objects/$target | sed -e 's/:/ /g' | awk 'NR==1{printf("%d ",$1+7);}NR==2{printf("%d ", $1-10);}' > tdeflate_stream.bin
read xstart xend < tdeflate_stream.bin
dd if=objects/$target of=flated.bin bs=1 skip=$xstart count=$[ $xend - $xstart ]
cat flated.bin | zlib-flate -uncompress > deflated.bin

重新编辑deflated.bin文件,再使用下面脚本压缩

printf "%d 0 obj\n" $1 > tflate_"$1".bin
printf "<</Length %d/Filter/FlateDecode>>stream\n" >> tflate_"$1".bin
cat deflated.bin | zlib-flate -compress >> tflate_"$1".bin
echo "" >> tflate_"$1".bin
echo "endstream" >> tflate_"$1".bin
echo "endobj" >> tflate_"$1".bintarget=$(ls -1 objects | grep "_obj_"$1".bin")
rm objects/$target
mv tflate_"$1".bin objects/$target

转载于:https://www.cnblogs.com/long123king/p/3931812.html

用于拆解和组合PDF中各个对象的shell脚本相关推荐

  1. ICCV2021|一种用于解决点云场景中同类对象分割的网络

    首次提出:一种用于解决点云场景中同类对象分割的端到端网络 融合协同对比学习和相互注意采样机制进行无监督点云对象的同类分割 Unsupervised Point Cloud Object Co-segm ...

  2. mysql shell 所有表_删除mysql数据库中所有表的shell脚本

    分享一个可以删除mysql中所有表的shell脚本,代码如下: 复制代码 代码示例: #!/bin/bash # 删除mysql中所有表 # 示例: # Usage: ./script user pa ...

  3. linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

  4. idea写java_IDEA中编写并运行shell脚本的实现

    IEDA中的bashsupport插件支持在IDEA中编写shell脚本文件,有友好的代码格式,支持自动补全,检查错误,并且配置完之后,还可以在IEDA中直接运行shell脚本.下面将一步一步演示插件 ...

  5. python用于导入模块或模块中的对象_在 Python 中导入模块中的对象有哪几种方式? (5.0分)_学小易找答案...

    [判断题]尽管可以使用 import 语句一次导入任意多个标准库或扩展库,但是仍建议每次只导入一个标准库或扩展库. (2.0分) [填空题]表达式 int(str(34)) == 34 的值为 ___ ...

  6. 在 Shell 脚本中调用另一个 Shell 脚本的三种方式

    先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. exec: exec path/to/foo.sh s ...

  7. shel脚本中怎么引用文件_Linux shell脚本中如何读取跟shell脚本同一目录下的配置文件...

    标签: 配置文件如下 ##########BACKUP MYSQL CONFIG####### #database name db_name=test db_user=root db_pass=123 ...

  8. Linux shell脚本中如何读取跟shell脚本同一目录下的配置文件

    2019独角兽企业重金招聘Python工程师标准>>> 配置文件如下 ##########BACKUP MYSQL CONFIG####### #database name db_n ...

  9. linux中如何分割字符串数组中,关于bash:linux shell脚本:拆分字符串,将它们放入一个数组中,然后循环遍历它们...

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: Split string based on delimiter in Bash? 在bash脚本中,如何使用像;这样的分 ...

最新文章

  1. 在arm linux mini2440上移植ntp服务,RTEMS 4.9.5 在 QEMU MINI2440 上的移植发布啦……
  2. 深度学习——自动编码器,对称网络结构
  3. ArcGIS Server9.2学习开发(4)——使用Toc控件
  4. AIProCon在线大会笔记之清华大学唐杰教授:人工智能的下一个十年
  5. 实时数仓入门训练营:实时数仓助力互联网实时决策和精准营销
  6. MySQL 高级- case结构
  7. JAM - get self detail information
  8. 我最喜爱的九位历史人物 - 曹操(Space搬家)
  9. rocketmq源码调试
  10. SAP PS:项目进度计划管理
  11. 移动端日历插件_“滴答清单”移动端产品分析报告
  12. java程序设计大赛acm_参加ACM程序设计大赛,对C的掌握程度要多深??
  13. 领域驱动设计系列关键概念
  14. 芝麻信用接口 java_java 对接芝麻信用 -用芝麻私钥解密错误
  15. 伊利洛伊大学厄巴纳-香槟分校计算机专业,伊利诺伊大学厄巴纳香槟分校信息管理专业怎么样?...
  16. 01-名词冠词(思维导图记录)
  17. 两步建立自己的kindle书库
  18. 离子交换树脂的使用方法及其原理
  19. 和菜鸟一起学linux总线驱动之初识USB设备描述符
  20. 版本测试准入准出的一些标准

热门文章

  1. 微信小程序(4)——CSS3渐变
  2. 循序渐进学SAP系列(一):--SAP该如何入门
  3. 小红书榜单,五大行业图文笔记类
  4. Keil uVision4使用总结
  5. java中手机号码的正则校验
  6. 修嗒嗒“全民家装狂欢节”诞生,巨额补贴能否造就家装行业的“双十二”?
  7. chrome 有哪些有用的插件
  8. Shave Beaver! CodeForces - 331B2 (线段树)
  9. LaTeX如何输出反斜杠 \
  10. qq邮箱android版官方,QQ邮箱下载_腾讯QQ邮箱客户端下载【安卓版】-太平洋下载中心...