Пример #1
0
func Decode(s []byte, to *CharMapperT) (r []byte) {
	util.Logf("Decode %02x\n", s)

	r = make([]byte, len(s)*6)
	p := 0
	for k := 0; k < len(s); {
		l := to.Ranges.Code(int(s[k]))
		a := ps.StrInt(s[k : k+l])
		k += l
		p += utf8.EncodeRune(r[p:len(r)], rune(to.Uni.Code(a)))
	}
	return r[0:p]
}
Пример #2
0
func (pd *PdfDrawerT) Interpret(rdr fancy.Reader) {
	for {
		t, _ := ps.Token(rdr)
		if len(t) == 0 {
			break
		}
		if f, ok := pd.Ops[string(t)]; ok {
			util.Logf("%v %#v %s", string(t), *pd.ConfigD, pd.Stack.Dump())
			f(pd)
		} else {
			pd.Stack.Push(t)
		}
	}
}
Пример #3
0
// xrefReadStream() reads the xref stream(s) of a PDF file. This is not recursive
// in favour of not to have to keep track of already used starting points
// for xrefs.
func xrefReadStream(f fancy.Reader, p int) (xr map[int]int, r [][2]int, trailer DictionaryT) {
	s := _Bytes

	xr = map[int]int{}
	r = [][2]int{}

	for ok := true; ok; {
		f.Seek(int64(p), 0)
		ps.Token(f) // skip "xref"

		//for {
		m := tuple(f, 2)
		if string(m[1]) != "obj" {
			util.Logf("unexpected %q\n", m)
			return nil, nil, nil
		}

		s, _ = ps.Token(f)
		dic := Dictionary(s)

		if trailer == nil {
			trailer = dic
		}

		s, ok = dic["/Prev"]
		p = num(s)

		s, _ = ps.Token(f)
		if string(s) != "stream" {
			util.Log("not a stream", s)
			return nil, nil, nil
		}
		ps.SkipLE(f)

		for k, v := range dic {
			util.Logf("%s %s", k, v)
		}

		size := num(dic["/Size"])
		index := []int{0, size}

		if _, ok := dic["/Index"]; ok {
			a := Array(dic["/Index"])
			index[0] = num(a[0])
			index[1] = num(a[1])

			// can len(index) be != 2 ?
		}

		l := num(dic["/Length"])
		xref := f.Slice(l)

		w := Array(dic["/W"])
		if len(w) != 3 {
			util.Log("unexpected /W", w)
		}

		fl1 := num(w[0])
		fl2 := num(w[1])
		fl3 := num(w[2])

		width := fl1 + fl2 + fl3

		xref = decodeStream(dic, xref)

		s, _ = ps.Token(f) // endstream
		s, _ = ps.Token(f) // endobj

		pos := index[0]

		for i := 0; i < len(xref); i += width {
			ent := xref[i : i+width]
			f1 := bnum(ent[0:fl1])
			f2 := bnum(ent[fl1 : fl1+fl2])
			f3 := bnum(ent[fl1+fl2:])

			switch f1 {
			case 0:
				// free object
				util.Log("free", f2, f3)
				// delete(r, f2)

			case 1:
				// regular object
				util.Log("ref", pos, f3, f2)
				xr[pos] = f2

			case 2:
				// compressed object
				util.Log("cref", pos, f2, f3)
				r = append(r, [2]int{f2, f3})
			}

			pos += 1
		}
		//}
	}

	return xr, r, trailer
}
Пример #4
0
func (t *TiffBuilder) WriteIFD(data []byte, next bool) {
	util.Logf("offset: %08x\n", t.offset)

	n := len(t.ifd)
	t.offset += 6 + (12 * uint32(n))

	t.Write(uint16(n))

	padding := false

	for _, e := range t.ifd {
		if e.Tag == TAG_STRIP_OFFSETS || e.Type == IFD_RATIONAL {
			e.ValueOffset = t.offset

			if e.Tag == TAG_STRIP_OFFSETS {
				util.Log("offset:", t.offset)

				t.offset += uint32(len(data)) + 4
				padding = (t.offset & 1) == 1
				if padding {
					t.offset += 1
				}
			} else {
				util.Log("offset:", t.offset)
				t.offset += 8 // 4 + 4
			}
		}

		util.Logf("tag:%v type:%v count:%v value:%v\n", e.Tag, e.Type, e.Count, e.ValueOffset)

		t.Write(e.Tag)
		t.Write(e.Type)
		t.Write(e.Count)

		if e.Count != 1 {
			t.Write(e.ValueOffset)
		} else if e.Type == IFD_LONG {
			t.Write(e.ValueOffset)
		} else if e.Type == IFD_RATIONAL {
			t.Write(e.ValueOffset)
		} else if e.Type == IFD_SHORT {
			t.Write(uint16(e.ValueOffset))
			t.Write(uint16(0))
		} else {
			log.Fatal("unsupported type")
		}
	}

	if next {
		util.Log("next:", t.offset)
		t.Write(uint32(t.offset))
	} else {
		util.Log("next:0")
		t.Write(uint32(0))
	}

	util.Log("datalen:", len(data))
	t.WriteBytes(data)

	if padding {
		t.WriteBytes([]byte{0})
		util.Log("padding:", t.offset)
	}

	for _, e := range t.ifd {
		if e.Type != IFD_RATIONAL {
			continue
		}

		t.Write(e.Num)
		t.Write(e.Den)
	}

	t.ifd = []IFDEntry{}
}