Example #1
0
// 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
}
Example #2
0
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:]
}