Sample Java, Kotlin code for using Apryse Android SDK to extract images from PDF files, along with their positioning information and DPI. Instead of converting PDF images to a Bitmap, you can also extract uncompressed/compressed image data directly using element.GetImageData() (described in the PDF Data Extraction code sample).
Learn more about our full PDF Data Extraction SDK Capabilities.
To start your free trial, get started with Android SDK.
1//---------------------------------------------------------------------------------------
2// Copyright (c) 2001-2019 by PDFTron Systems Inc. All Rights Reserved.
3// Consult legal.txt regarding legal and license information.
4//---------------------------------------------------------------------------------------
5
6package com.pdftron.android.pdfnetsdksamples.samples;
7
8import com.pdftron.android.pdfnetsdksamples.OutputListener;
9import com.pdftron.android.pdfnetsdksamples.PDFNetSample;
10import com.pdftron.android.pdfnetsdksamples.R;
11import com.pdftron.android.pdfnetsdksamples.util.Utils;
12import com.pdftron.common.Matrix2D;
13import com.pdftron.common.PDFNetException;
14import com.pdftron.pdf.Element;
15import com.pdftron.pdf.ElementReader;
16import com.pdftron.pdf.Image;
17import com.pdftron.pdf.PDFDoc;
18import com.pdftron.pdf.PageIterator;
19import com.pdftron.sdf.DictIterator;
20import com.pdftron.sdf.Obj;
21import com.pdftron.sdf.SDFDoc;
22
23import java.util.ArrayList;
24
25///-----------------------------------------------------------------------------------
26/// This sample illustrates one approach to PDF image extraction
27/// using PDFNet.
28///
29/// Note: Besides direct image export, you can also convert PDF images
30/// to Java image, or extract uncompressed/compressed image data directly
31/// using element.GetImageData() (e.g. as illustrated in ElementReaderAdv
32/// sample project).
33///-----------------------------------------------------------------------------------
34
35public class ImageExtractTest extends PDFNetSample {
36
37	private static OutputListener mOutputListener;
38
39	private static ArrayList<String> mFileList = new ArrayList<>();
40
41    public ImageExtractTest() {
42        setTitle(R.string.sample_imageextract_title);
43        setDescription(R.string.sample_imageextract_description);
44
45        // The standard library does not support exporting to
46        // PNG/TIFF formats, thus trying to export the PDF to
47        // PNG or TIFF will fail. Please, comment out this call
48        // if using the full library.
49        // DisableRun();
50    }
51
52	@Override
53	public void run(OutputListener outputListener) {
54		super.run(outputListener);
55		mOutputListener = outputListener;
56		mFileList.clear();
57		printHeader(outputListener);
58        // Initialize PDFNet
59
60        // Example 1:
61        // Extract images by traversing the display list for
62        // every page. With this approach it is possible to obtain
63        // image positioning information and DPI.
64        try (PDFDoc doc = new PDFDoc((Utils.getAssetTempFile(INPUT_PATH + "newsletter.pdf").getAbsolutePath()))) {
65            doc.initSecurityHandler();
66            ElementReader reader = new ElementReader();
67            //  Read every page
68            for (PageIterator itr = doc.getPageIterator(); itr.hasNext(); ) {
69                reader.begin(itr.next());
70                ImageExtract(reader);
71                reader.end();
72            }
73            mOutputListener.println("Done.");
74        } catch (Exception e) {
75            mOutputListener.printError(e.getStackTrace());
76        }
77
78        mOutputListener.println("----------------------------------------------------------------");
79
80        // Example 2:
81        // Extract images by scanning the low-level document.
82        try (PDFDoc doc = new PDFDoc((Utils.getAssetTempFile(INPUT_PATH + "newsletter.pdf").getAbsolutePath()))) {
83            doc.initSecurityHandler();
84            image_counter = 0;
85            SDFDoc cos_doc = doc.getSDFDoc();
86            long num_objs = cos_doc.xRefSize();
87            for (int i = 1; i < num_objs; ++i) {
88                Obj obj = cos_doc.getObj(i);
89                if (obj != null && !obj.isFree() && obj.isStream()) {
90                    // Process only images
91                    DictIterator itr = obj.find("Type");
92                    if (!itr.hasNext() || !itr.value().getName().equals("XObject"))
93                        continue;
94
95                    itr = obj.find("Subtype");
96                    if (!itr.hasNext() || !itr.value().getName().equals("Image"))
97                        continue;
98
99                    Image image = new Image(obj);
100
101                    mOutputListener.println("--> Image: " + (++image_counter));
102                    mOutputListener.println("    Width: " + image.getImageWidth());
103                    mOutputListener.println("    Height: " + image.getImageHeight());
104                    mOutputListener.println("    BPC: " + image.getBitsPerComponent());
105
106                    String fname = "image_extract2_" + image_counter;
107                    String path = Utils.createExternalFile(fname, mFileList).getAbsolutePath();
108                    image.export(path);
109
110                    //String path= Utils.createExternalFile(fname + ".tif", mFileList).getAbsolutePath();
111                    //image.exportAsTiff(path);
112
113                    //String path = Utils.createExternalFile(fname + ".png", mFileList).getAbsolutePath();
114                    //image.exportAsPng(path);
115                }
116            }
117            
118            mOutputListener.println("Done.");
119        } catch (Exception e) {
120            mOutputListener.printError(e.getStackTrace());
121        }
122
123		for (String file : mFileList) {
124			addToFileList(file);
125		}
126		printFooter(outputListener);
127	}
128
129    // Relative paths to folders containing test files.
130
131    static int image_counter = 0;
132
133    static void ImageExtract(ElementReader reader) throws PDFNetException {
134        Element element;
135        while ((element = reader.next()) != null) {
136            switch (element.getType()) {
137                case Element.e_image:
138                case Element.e_inline_image: {
139                    mOutputListener.println("--> Image: " + (++image_counter));
140                    mOutputListener.println("    Width: " + element.getImageWidth());
141                    mOutputListener.println("    Height: " + element.getImageHeight());
142                    mOutputListener.println("    BPC: " + element.getBitsPerComponent());
143
144                    Matrix2D ctm = element.getCTM();
145                    double x2 = 1, y2 = 1;
146                    com.pdftron.pdf.Point p = ctm.multPoint(x2, y2);
147                    mOutputListener.println(String.format("    Coords: x1=%.2f, y1=%.2f, x2=%.2f, y2=%.2f", ctm.getH(), ctm.getV(), p.x, p.y));
148
149                    if (element.getType() == Element.e_image) {
150                        Image image = new Image(element.getXObject());
151
152                        String fname = "image_extract1_" + image_counter;
153
154                        String path = Utils.createExternalFile(fname, mFileList).getAbsolutePath();
155                        image.export(path);
156
157                        //String path2 = Utils.createExternalFile(fname + ".tif", mFileList).getAbsolutePath();
158                        //image.exportAsTiff(path2);
159
160                        //String path3 = Utils.createExternalFile(fname + ".png", mFileList).getAbsolutePath();
161                        //image.exportAsPng(path3);
162                    }
163                }
164                break;
165                case Element.e_form:        // Process form XObjects
166                    reader.formBegin();
167                    ImageExtract(reader);
168                    reader.end();
169                    break;
170            }
171        }
172    }
173
174}
1//---------------------------------------------------------------------------------------
2// Copyright (c) 2001-2019 by PDFTron Systems Inc. All Rights Reserved.
3// Consult legal.txt regarding legal and license information.
4//---------------------------------------------------------------------------------------
5
6package com.pdftron.android.pdfnetsdksamples.samples
7
8import com.pdftron.android.pdfnetsdksamples.OutputListener
9import com.pdftron.android.pdfnetsdksamples.PDFNetSample
10import com.pdftron.android.pdfnetsdksamples.R
11import com.pdftron.android.pdfnetsdksamples.util.Utils
12import com.pdftron.common.PDFNetException
13import com.pdftron.pdf.Element
14import com.pdftron.pdf.ElementReader
15import com.pdftron.pdf.Image
16import com.pdftron.pdf.PDFDoc
17import java.util.*
18
19///-----------------------------------------------------------------------------------
20/// This sample illustrates one approach to PDF image extraction
21/// using PDFNet.
22///
23/// Note: Besides direct image export, you can also convert PDF images
24/// to Java image, or extract uncompressed/compressed image data directly
25/// using element.GetImageData() (e.g. as illustrated in ElementReaderAdv
26/// sample project).
27///-----------------------------------------------------------------------------------
28
29class ImageExtractTest : PDFNetSample() {
30    init {
31        setTitle(R.string.sample_imageextract_title)
32        setDescription(R.string.sample_imageextract_description)
33
34        // The standard library does not support exporting to
35        // PNG/TIFF formats, thus trying to export the PDF to
36        // PNG or TIFF will fail. Please, comment out this call
37        // if using the full library.
38        // DisableRun();
39    }
40
41    override fun run(outputListener: OutputListener?) {
42        super.run(outputListener)
43        mOutputListener = outputListener
44        mFileList.clear()
45        printHeader(outputListener!!)
46        // Initialize PDFNet
47
48        // Example 1:
49        // Extract images by traversing the display list for
50        // every page. With this approach it is possible to obtain
51        // image positioning information and DPI.
52        // Initialize PDFNet
53
54        // Example 1:
55        // Extract images by traversing the display list for
56        // every page. With this approach it is possible to obtain
57        // image positioning information and DPI.
58        try {
59            PDFDoc(Utils.getAssetTempFile(INPUT_PATH + "newsletter.pdf")!!.absolutePath).use { doc ->
60                doc.initSecurityHandler()
61                val reader = ElementReader()
62                //  Read every page
63                val itr = doc.pageIterator
64                while (itr.hasNext()) {
65                    reader.begin(itr.next())
66                    ImageExtract(reader)
67                    reader.end()
68                }
69                mOutputListener!!.println("Done.")
70            }
71        } catch (e: Exception) {
72            mOutputListener!!.printError(e.stackTrace)
73        }
74
75        mOutputListener!!.println("----------------------------------------------------------------")
76
77        // Example 2:
78        // Extract images by scanning the low-level document.
79
80        // Example 2:
81        // Extract images by scanning the low-level document.
82        try {
83            PDFDoc(Utils.getAssetTempFile(INPUT_PATH + "newsletter.pdf")!!.absolutePath).use { doc ->
84                doc.initSecurityHandler()
85                image_counter = 0
86                val cos_doc = doc.sdfDoc
87                val num_objs = cos_doc.xRefSize()
88                for (i in 1 until num_objs) {
89                    val obj = cos_doc.getObj(i)
90                    if (obj != null && !obj.isFree && obj.isStream) {
91                        // Process only images
92                        var itr = obj.find("Type")
93                        if (!itr.hasNext() || itr.value().name != "XObject") continue
94                        itr = obj.find("Subtype")
95                        if (!itr.hasNext() || itr.value().name != "Image") continue
96                        val image = Image(obj)
97                        mOutputListener!!.println("--> Image: " + ++image_counter)
98                        mOutputListener!!.println("    Width: " + image.imageWidth)
99                        mOutputListener!!.println("    Height: " + image.imageHeight)
100                        mOutputListener!!.println("    BPC: " + image.bitsPerComponent)
101                        val fname = "image_extract2_$image_counter"
102                        val path = Utils.createExternalFile(fname, mFileList).absolutePath
103                        image.export(path)
104
105                        //String path= Utils.createExternalFile(fname + ".tif", mFileList).getAbsolutePath();
106                        //image.exportAsTiff(path);
107
108                        //String path = Utils.createExternalFile(fname + ".png", mFileList).getAbsolutePath();
109                        //image.exportAsPng(path);
110                    }
111                }
112                mOutputListener!!.println("Done.")
113            }
114        } catch (e: Exception) {
115            mOutputListener!!.printError(e.stackTrace)
116        }
117
118        for (file in mFileList) {
119            addToFileList(file!!)
120        }
121        printFooter(outputListener!!)
122    }
123
124    companion object {
125
126        private var mOutputListener: OutputListener? = null
127
128        private val mFileList = ArrayList<String>()
129
130        // Relative paths to folders containing test files.
131
132        internal var image_counter = 0
133
134        @Throws(PDFNetException::class)
135        fun ImageExtract(reader: ElementReader) {
136            var element: Element
137            while (reader.next().also { element = it } != null) {
138                when (element.type) {
139                    Element.e_image, Element.e_inline_image -> {
140                        mOutputListener!!.println("--> Image: " + ++image_counter)
141                        mOutputListener!!.println("    Width: " + element.imageWidth)
142                        mOutputListener!!.println("    Height: " + element.imageHeight)
143                        mOutputListener!!.println("    BPC: " + element.bitsPerComponent)
144                        val ctm = element.ctm
145                        val x2 = 1.0
146                        val y2 = 1.0
147                        val p = ctm.multPoint(x2, y2)
148                        mOutputListener!!.println(String.format("    Coords: x1=%.2f, y1=%.2f, x2=%.2f, y2=%.2f", ctm.h, ctm.v, p.x, p.y))
149                        if (element.type == Element.e_image) {
150                            val image = Image(element.xObject)
151                            val fname = "image_extract1_$image_counter"
152                            val path = Utils.createExternalFile(fname, mFileList).absolutePath
153                            image.export(path)
154
155                            //String path2 = Utils.createExternalFile(fname + ".tif", mFileList).getAbsolutePath();
156                            //image.exportAsTiff(path2);
157
158                            //String path3 = Utils.createExternalFile(fname + ".png", mFileList).getAbsolutePath();
159                            //image.exportAsPng(path3);
160                        }
161                    }
162                    Element.e_form -> {
163                        reader.formBegin()
164                        ImageExtract(reader)
165                        reader.end()
166                    }
167                }
168            }
169        }
170    }
171
172}
Did you find this helpful?
Trial setup questions?
Ask experts on DiscordNeed other help?
Contact SupportPricing or product questions?
Contact Sales