PDFium

Native bindings for pdfium project

Installing

Usage

  1. open a PDF file descriptor:

    {:ok, document} = PDFium.load_document("file.pdf")
    # => {:ok, #Reference<0.2181297728.2193227786.166499>}
  2. get the number of pages in the file:

    {:ok, pages} = PDFium.get_page_count(document)
    # => {:ok, 1}
  3. render a page to file:

    {:ok, ref} = PDFium.load_document("/Users/eugene/Downloads/7ade6db09604a8b41104763c6f16a987.pdf")
    {:ok, binary, w, h} = PDFium.get_page_bitmap(ref, 0, 300) # 300 for DPI
    {:ok, image} = Vix.Vips.Image.new_from_binary(binary, w, h, 4, :VIPS_FORMAT_UCHAR)
    {:ok, _image} = Image.write(image, "/tmp/sample.png")

Releasing

  1. bump version in VERSION file. Run:

    echo -n (awk 'BEGIN{FS=OFS="."} {$NF+=1}1' VERSION) > VERSION
  2. commit and push the change:

    git add VERSION
    git commit --message "Bump library version"
    git push origin main
  3. create a PR from main to stable. Run:

    gh pr create --base stable --fill
  4. wait until the PR checks are green, then merge the PR

Running CI steps locally

  1. Prepare:

    mkdir output
  2. Build:

    dagger call \
      precompile --src-dir . --platform-name linux/arm64 --abi musl \
      export --path output/ --allowParentDirPath
  3. Test:

    dagger call test \
      --precompiled output/pdfium-nif-2.17-aarch64-linux-musl-0.1.23.tar.gz \
      --abi musl --platform-name linux/arm64

Releasing manually

  1. open PR with a new libpdfium tag:

     env GITHUB_TOKEN=(gh auth token) dagger call prepare-release-pull-request \
       --base stable \
       --libpdfium-tag chromium/7506 \
       --actor 41898282+github-actions[bot] \
       --github-token GITHUB_TOKEN
  2. wait until the PR is green, then merge it and release a package on hex:

     HEX_API_KEY=483a... GITHUB_TOKEN=(gh auth token) dagger call create-release \
       --pr 99 \
       --actor gmile \
       --github-token GITHUB_TOKEN \
       --hex-api-key HEX_API_KEY

Updating OTP version (for macOS)

wget https://github.com/erlef/otp_builds/releases/download/OTP-28.1/OTP-28.1-macos-amd64.tar.gz /tmp
wget https://github.com/erlef/otp_builds/releases/download/OTP-28.1/OTP-28.1-macos-arm64.tar.gz /tmp

shasum -a 256 /tmp/OTP-28.1-macos-amd64.tar.gz
shasum -a 256 /tmp/OTP-28.1-macos-arm64.tar.gz

# Then edit custom/build.json by inserting the hashes

Known issues

License

See [LICENSE].