Why are some images are extracted upside down?

Q: We extracted images with pdftron, but some images are extracted
upside down. You can see this issue in attached java project. How to
fix this problem?

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import pdftron.Common.PDFNetException;
import pdftron.Filters.FilterWriter;
import pdftron.Filters.MemoryFilter;
import pdftron.PDF.Element;
import pdftron.PDF.ElementReader;
import pdftron.PDF.Image;
import pdftron.PDF.PDFDoc;
import pdftron.PDF.PDFNet;
import pdftron.PDF.Page;
import pdftron.PDF.PageIterator;

public class TestImagesToSupport {

  private static final int minImageSize = 150, maxImageSize = 6000;
  private static final double maxImagePercent = 0.9;
  private static int counter = 0;
  private static String outPath = "testImages/";

  public static void main(String[] args) {
    PDFNet.initialize();
    try {
      PDFDoc pdfDoc = new PDFDoc("content (1).pdf");
      pdfDoc.initSecurityHandler();
      extractImages(pdfDoc);
    } catch (IOException e) {
      e.printStackTrace();
    } catch (PDFNetException e) {
      e.printStackTrace();
    }

  }

  public static void extractImages(PDFDoc doc) throws PDFNetException,
IOException {
    ElementReader reader = null;
    PageIterator itr = null;
    Page currentPage = null;
    try {
      reader = new ElementReader();
      for (itr = doc.getPageIterator(); itr.hasNext():wink: {
        currentPage = (Page) itr.next();
        reader.begin(currentPage);
        extractProcess(reader, currentPage);
        reader.end();
      }
    } finally {
      if (reader != null)
        reader.destroy();
      if (itr != null)
        itr.Destroy();
    }
  }

  private static void extractProcess(ElementReader reader, Page page)
throws PDFNetException, IOException {
    Element element;
    while ((element = reader.next()) != null) {
      switch (element.getType()) {
      case Element.e_image:
        System.out.println("E_IMAGE");
        MemoryFilter mf = null;
        FilterWriter fw = null;
        try {
          Image image = new Image(element.getXObject());

          int minDimension = Math.min(image.getImageWidth(),
image.getImageHeight());
          int maxDimension = Math.max(image.getImageWidth(),
image.getImageHeight());

          if (((element.getBBox().getX2() - element.getBBox().getX1()) <
(page.getPageWidth())
              * maxImagePercent)
              && ((element.getBBox().getY2() - element.getBBox().getY1()) <
(page.getPageHeight())
                  * maxImagePercent)) {
            if (minDimension >= minImageSize && maxDimension <=
maxImageSize) {

              mf = new MemoryFilter(8192, false);
              fw = new FilterWriter(mf);
              int format = image.export(fw);
              fw.flushAll();

              byte[] imageBytes = mf.getBuffer();

              String formatName = null;
              switch (format) {
              case 0:
                formatName = "png";
                break;
              case 1:
                formatName = "tiff";
                break;
              case 2:
                formatName = "jpeg";
                break;
              default:
                throw new IllegalStateException("Unrecognized PDFNet file
format : " + format);
              }

              BufferedImage bimage = null;
              try {
                bimage = ImageIO.read(new ByteArrayInputStream(imageBytes));
                ImageIO.write(bimage, formatName, new File(outPath + (counter+
+) + "." + formatName));
              } catch (IOException e) {
                e.printStackTrace();
              }
            } else {
              System.out.println("Skipping " + image.getImageWidth() + "x" +
image.getImageHeight()
                  + "px image");
            }
          } else {
            System.out.println("Full-size image. Skipping " +
element.getImageWidth() + "x"
                + element.getImageHeight() + "px image" + ", X1:" +
element.getBBox().getX1() + ", Y1:"
                + element.getBBox().getY1() + ", X2:" +
element.getBBox().getX2() + ", Y2:"
                + element.getBBox().getY2() + ", pageWidth = " +
page.getPageWidth()
                + ", pageHeight = " + page.getPageHeight());
          }
        } finally {
          if (mf != null)
            mf.destroy();
          if (fw != null)
            fw.destroy();
        }
        break;

      case Element.e_inline_image:
        System.out.println("INLINE");
        break;

      case Element.e_form:
        reader.formBegin();
        extractProcess(reader, page);
        reader.end();
        break;
      }
    }
  }
}
--------------------------------
A: You code extracts source images as they are stored in the PDF. When
used in the page content stream there images may be rotated, scaled,
skewed, etc. So in this case images are mirrored when drawn on a page.
You can obtain the transport used to position, scale, rotate, image
using ElementReader and element.GetCTM() as shown in ElementReaderAdv
sample.