(Source code hosted here)

.pdf to .csv converter or .pdf to database convertor for EDAX EDS files

These python codes will allow conversion from .pdf to .csv format so data can be uploaded directly to a database such as PostgreSQL or Maria.


Struggling with energy dispersive X-ray analysis (EDXA or EDAX) results that are outputted from the scanning electron microscope (SEM) as PDF files? These helpful scripts work to easily convert the PDF outputs to CSV formats or upload the data directly to a database.

Energy dispersive X-ray analysis (EDXA or EDAX), also known as energy-dispersive X-ray spectroscopy (EDS, EDX, EDXS or XEDS) or energy dispersive X-ray microanalysis (EDXMA) is a common analytical technique used for the elemental analysis or chemical characterization of a sample. However some SEM-EDS setups only output data files as uneditable .pdf files.

To avoid hours of transcribing data by hand, these python scripts have been written to do all the work for you!

.csv files are easily edittable, and compatible with most text editors and graphing softwares, including Excel, Origin, and Veusz.


The codes are written to be compatible with files produced from a Tescan Vega XMU scanning electron microscope (SEM) coupled to a 40 mm2 EDAX ApolloTM energy dispersive x-ray detector (EDS) running EDAX GenesisTM software. The code is easily edittable to be adapted to other SEM-EDS machine/software outputs.

Future Work:

  • Generalized file naming structure import to metadata


This code allows converts EDAX data saved as pdf to csv format (or uploads it to a database) with few lines of code.

To use, you need to specify directory that contains multiple or single .pdf files.

Setting up an Environment


pip install -r requirements.txt


For a new environment

conda env update -n my_sem_edax_env --file ENV.yaml

In an existing environment (e.g., setup with PyCharm)

conda env update --file environment.yml

Updating Dependencies

To publish updated environment configurations, make a conda environment YML file and a pip requirements file.

conda env export --no-builds > environment.yml

pipreqs --mode compat --use-local --force . > requirements.txt

To fetch data from Postgres, use the following query:


 SELECT sem_chemistry.sample_id,
    sem_chemistry.sem_chem_id AS chem_id,
    sem_chemistry.sem_im_id AS im_id,
    sem_chemistry.element AS sem_element,
    sem_chemistry.wt_percent AS wt_pct,
    tube.depth_top AS tube_depth_top,
    sem_instrument_metadata.method AS sem_method,
    sem_instrument_metadata.quantification_method AS quant_method,
    sem_instrument_metadata.quantification_standard AS quant_standard,
    sem_instrument_metadata.date AS sem_date
   FROM sem_chemistry
     LEFT JOIN sem_instrument_metadata ON sem_chemistry.sem_im_id = sem_instrument_metadata.sem_im_id
     LEFT JOIN sample ON sem_chemistry.sample_id = sample.sample_id
     LEFT JOIN tube ON sample.tube_id = tube.tube_id;


Python Version

Python 3.11

Python Libraries

  • PyMuPDF ==1.19.5
  • pillow ==8.4.0
  • python.dateutil ==2.8.2
  • pandas ==1.4.1
  • hyperspy ==1.6.5
  • hyperspy-base ==1.6.5
  • psycogp2 ==2.8.6
  • tqdm ==4.62.3
  • python-dotenv ==0.20.0
  • tabulate ==0.8.9


If you experience issues with the code, support can be sought by emailing [email protected].

Authors and acknowledgment

Written by Hanna L Brooks and Camden G Bock. Last update: 2023.


Code is licensed with a MIT License. See license section for more information.