Exemple #1
0
func extract(pd *pdfread.PdfReaderT, page int, t *TiffBuilder, next bool) {
	pg := pd.Pages()[page-1]
	mbox := util.StringArray(pd.Arr(pd.Att("/MediaBox", pg)))
	fmt.Println("Page", page)
	fmt.Println("  MediaBox", mbox)

	resources := pd.Dic(pd.Att("/Resources", pg))
	if xo := pd.Dic(resources["/XObject"]); xo != nil {
		for name, ref := range xo {
			dic, data := pd.Stream(ref)
			printdic(dic, name, "  ")

			if string(dic["/Subtype"]) != "/Image" {
				continue
			}

			switch string(dic["/Filter"]) {
			case "/CCITTFaxDecode": // TIFF
				if string(dic["/ColorSpace"]) != "/DeviceGray" {
					log.Fatal("cannot convert /CCITTFaxDecode ", string(pd.Obj(dic["/ColorSpace"])))
				}

				dparms := pd.Dic(dic["/DecodeParms"])
				width := pd.Num(dparms["/Columns"])
				height := pd.Num(dparms["/Rows"])
				k := pd.Num(dparms["/K"])
				bpc := pd.Num(dic["/BitsPerComponent"])

				if k >= 0 {
					// can't do this right now
					log.Fatal("can't do encoding with K=", k)
				}

				t.AddLong(TAG_IMAGE_WIDTH, uint32(width))
				t.AddLong(TAG_IMAGE_LENGTH, uint32(height))
				t.AddShort(TAG_BITS_PER_SAMPLE, uint16(bpc))
				t.AddShort(TAG_COMPRESSION, 4)                // CCITT Group 4
				t.AddShort(TAG_PHOTOMETRIC_INTERPRETATION, 0) // white is zero
				t.AddLong(TAG_STRIP_OFFSETS, 0)
				//t.AddShort(TAG_ORIENTATION, 1)
				//t.AddShort(TAG_SAMPLES_PER_PIXEL, 1)
				t.AddLong(TAG_ROWS_PER_STRIP, uint32(height))
				t.AddLong(TAG_STRIP_BYTE_COUNTS, uint32(len(data)))
				//t.AddRational(TAG_X_RESOLUTION, 300, 1) // 300 dpi (300/1)
				//t.AddRational(TAG_Y_RESOLUTION, 300, 1) // 300 dpi (300/1)
				//t.AddShort(TAG_RESOLUTION_UNIT, 2)      // pixels/inch

				t.WriteIFD(data, next)

			case "/DCTDecode": // JPEG
				/*
					width := pd.Num(dic["/Width"])
					height := pd.Num(dic["/Height"])
					bpc := pd.Num(dic["/BitsPerComponent"])
				*/

				f, err := os.Create("test.jpg")
				if err != nil {
					log.Fatal(err)
				}

				f.Write(data)
				f.Close()

			case "/FlateDecode": // compressed bitmap
				data = fancy.ReadAndClose(zlib.NewReader(fancy.SliceReader(data)))
				width := pd.Num(dic["/Width"])
				height := pd.Num(dic["/Height"])
				bpc := pd.Num(dic["/BitsPerComponent"])

				if bpc != 8 {
					log.Fatal("cannot convert /FlateDecode bpc:", bpc)
				}

				if string(dic["/ColorSpace"]) != "/DeviceRGB" {
					log.Fatal("cannot convert /FlateDecode ", string(pd.Obj(dic["/ColorSpace"])))
				}

				ima := image.NewRGBA(image.Rect(0, 0, width, height))

				for y := 0; y < height; y++ {
					for x := 0; x < width; x++ {
						ima.Set(x, y, color.RGBA{R: data[0], G: data[1], B: data[2], A: 255})
						data = data[3:]
					}
				}

				f, err := os.Create("test.png")
				if err != nil {
					log.Fatal(err)
				}

				png.Encode(f, ima)
				f.Close()

			default:
				log.Fatal("cannot decode ", string(dic["/Filter"]))
			}
		}
	}
}