用於拆解和組合PDF中各個物件的shell指令碼

2022-07-24 17:36:17 字數 3221 閱讀 1242

拆解指令碼

header_start=0

header_len=15

xref_start=$(strings -a -t d $1 | grep -e "\bxref\b" | awk '')

trailer_start=$(strings -a -t d $1 | grep -e "\btrailer\b" | awk '')

#echo $xref_start

#echo $trailer_start

xref_len=$(echo "$trailer_start - $xref_start" | bc)

#echo $xref_len

header_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_len

xref_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_len

trailer_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'

cat $xref_dump | awk 'nf==3' | awk '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' | awk 'nr!=1' > tdis_metrics_"$xref_dump"

if [ ! -d objects ]

then

mkdir objects

ficat 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 '')

#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=15

obj_offset=15

obj_nums=0

for file in $(ls -1 objects)

do #echo $file

obj_len=$(wc objects/$file | awk '')

dd if=objects/$file of=$target bs=1 count=$obj_len seek=$obj_offset

printf "%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" >> $target

awk '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==1nr==2' > 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 "<>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".bin

target=$(ls -1 objects | grep "_obj_"$1".bin")

rm objects/$target

mv tflate_"$1".bin objects/$target

PHP物件導向中的聚合和組合

php物件導向中的聚合和組合 物件之間進行互動主要有三種 繼承,聚合,組合,繼承大家都很熟悉,這裡就不具體介紹了,本文主要介紹聚合和組合的一些內容。聚合 可以理解成第二個物件通過第乙個物件的某個方法傳遞給第乙個物件,然後第二個物件就可以呼叫第乙個物件的方法,第二個物件可以根據自己的目的使用第二個物件...

el和jsp內建物件的作用於

page的作用範圍是當前頁面 對應el表示式的pagescope request的作用範圍是頁面與頁面之間的傳遞就是請求請求結束則結束 對應el表示式的requestscope session的作用範圍是直到關閉瀏覽器 對應el表示式的sessionscope 9個內建物件.例如 servletco...

物件導向程式設計中的繼承和組合的簡單比較

繼承 inheritance 是類 d 的物件可以使用僅對類 c的物件有效的方法或者屬性的特性,它使得這些方法和屬性就好像是由類 d定義的。這時,c 是 d 的父類,d是 c 的子類。在繼承結構中,父類的內部細節對於子類是可見的。所以我們通常也可以說通過繼承的 復用是一種 白盒式 復用 組合 com...