// pd.DecodedStream() returns decoded contents of a stream. func (pd *PdfReaderT) DecodedStream(reference []byte) (DictionaryT, []byte) { dic, data := pd.Stream(reference) if f, ok := dic["/Filter"]; ok { filter := pd.ForcedArray(f) var decos [][]byte if d, ok := dic["/DecodeParams"]; ok { decos = pd.ForcedArray(d) } else { decos = make([][]byte, len(filter)) } for ff := range filter { deco := pd.Dic(decos[ff]) switch string(filter[ff]) { case "/FlateDecode": data = fancy.ReadAndClose(zlib.NewReader(fancy.SliceReader(data))) case "/LZWDecode": early := true if deco != nil { if s, ok := deco["/EarlyChange"]; ok { early = pd.Num(s) == 1 } } data = lzw.Decode(data, early) case "/ASCII85Decode": ds := data for len(ds) > 1 && ds[len(ds)-1] < 33 { ds = ds[0 : len(ds)-1] } if len(ds) >= 2 && ds[len(ds)-1] == '>' && ds[len(ds)-2] == '~' { ds = ds[0 : len(ds)-2] } data = fancy.ReadAll(ascii85.NewDecoder(fancy.SliceReader(ds))) case "/ASCIIHexDecode": data = hex.Decode(string(data)) default: data = []byte{} } } } return dic, data }
func eexec(rdr fancy.Reader) []byte { fpos, _ := rdr.Seek(0, 1) b := fancy.ReadAll(rdr) cnt := 0 pos := 0 k := 0 for ; cnt < 256 && k < len(b); k++ { switch b[k] { case 32, 10, 13, 9: case '0': cnt++ default: cnt = 0 pos = k + 1 } } b = b[0:pos] rdr.Seek(fpos+int64(k), 0) if hex.IsHex(b[0]) { b = hex.Decode(string(b)) } return T1Decrypt(EEXEC_KEY, b)[4:] }