Ghostscript fails to convert PDF file RGB to CMYK with no error at AWS Lambda C++ Runtime

Viewed 29

I've being messing around with the Ghostscript C API and built a simple command line tool to convert PDFs from RGB to CMYK. It works a charm on my Ubuntu 20.04. So I went ahead and gave this tool a shot as an AWS Lambda C++. It runs without any output error (even with -dDEBUG), however, the resulting PDF is not valid.

Inspecting it on a text editor, just to comparer its content vs one that I converted on my Ubuntu 20.04 (using the same RGB file as input, of course), it seems incomplete, like, trucated.

Left (Ubuntu 20.04) vs Right (AWS Lambda on Amazon Linux 2

The parameters passed to gs, as per what can be seen on those PDFs headers, are as follows:

gpdfc -dSAFER -dBATCH -dNOPAUSE -dNOCACHE -sDEVICE=pdfwrite -sColorConversionStrategy=CMYK -dProcessColorModel=/DeviceCMYK -sOutputFile=? -q

I did multiple runs and got the exact same result. Again, it works fine on my machine.

As per the lambda itself, I'm shipping it with a vendor libgpdf.so.10 (and all its dependencies -- AWS Lambda C++ Runtime does it by design), which I got from ghostpdl/sobin/ directory, after have build GS 9.5 from Github source code on my Ubuntu 20.04 box.

$ lddtree LambdaConverterPDF

Dependencies of libgpdf as per lddtree

The complete output:

LambdaConverterPDF => ./LambdaConverterPDF (interpreter => /lib64/ld-linux-x86-64.so.2)
    libaws-cpp-sdk-s3.so => /usr/local/lib/libaws-cpp-sdk-s3.so
        ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2
    libaws-cpp-sdk-core.so => /usr/local/lib/libaws-cpp-sdk-core.so
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0
        libcrypto.so.1.1 => /lib/x86_64-linux-gnu/libcrypto.so.1.1
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
    libgpdf.so.10 => /home/leandro/code/lambda-converter-pdf/lib/ghostscript/libgpdf.so.10
        libXt.so.6 => /lib/x86_64-linux-gnu/libXt.so.6
            libSM.so.6 => /lib/x86_64-linux-gnu/libSM.so.6
                libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1
            libICE.so.6 => /lib/x86_64-linux-gnu/libICE.so.6
                libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0
        libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6
            libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1
                libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6
                libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
    libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4
        libnghttp2.so.14 => /lib/x86_64-linux-gnu/libnghttp2.so.14
        libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0
            libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2
        librtmp.so.1 => /lib/x86_64-linux-gnu/librtmp.so.1
            libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30
                libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0
                    libffi.so.7 => /lib/x86_64-linux-gnu/libffi.so.7
                libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6
            libhogweed.so.5 => /lib/x86_64-linux-gnu/libhogweed.so.5
            libnettle.so.7 => /lib/x86_64-linux-gnu/libnettle.so.7
            libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10
        libssh.so.4 => /lib/x86_64-linux-gnu/libssh.so.4
        libpsl.so.5 => /lib/x86_64-linux-gnu/libpsl.so.5
        libssl.so.1.1 => /lib/x86_64-linux-gnu/libssl.so.1.1
        libgssapi_krb5.so.2 => /lib/x86_64-linux-gnu/libgssapi_krb5.so.2
            libkrb5.so.3 => /lib/x86_64-linux-gnu/libkrb5.so.3
                libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1
                libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2
            libk5crypto.so.3 => /lib/x86_64-linux-gnu/libk5crypto.so.3
            libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2
            libkrb5support.so.0 => /lib/x86_64-linux-gnu/libkrb5support.so.0
        libldap_r-2.4.so.2 => /lib/x86_64-linux-gnu/libldap_r-2.4.so.2
            libsasl2.so.2 => /lib/x86_64-linux-gnu/libsasl2.so.2
            libgssapi.so.3 => /lib/x86_64-linux-gnu/libgssapi.so.3
                libheimntlm.so.0 => /lib/x86_64-linux-gnu/libheimntlm.so.0
                    libwind.so.0 => /lib/x86_64-linux-gnu/libwind.so.0
                libkrb5.so.26 => /lib/x86_64-linux-gnu/libkrb5.so.26
                    libheimbase.so.1 => /lib/x86_64-linux-gnu/libheimbase.so.1
                    libhx509.so.5 => /lib/x86_64-linux-gnu/libhx509.so.5
                    libsqlite3.so.0 => /lib/x86_64-linux-gnu/libsqlite3.so.0
                    libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1
                libasn1.so.8 => /lib/x86_64-linux-gnu/libasn1.so.8
                libhcrypto.so.4 => /lib/x86_64-linux-gnu/libhcrypto.so.4
                libroken.so.18 => /lib/x86_64-linux-gnu/libroken.so.18
        liblber-2.4.so.2 => /lib/x86_64-linux-gnu/liblber-2.4.so.2
        libbrotlidec.so.1 => /lib/x86_64-linux-gnu/libbrotlidec.so.1
            libbrotlicommon.so.1 => /lib/x86_64-linux-gnu/libbrotlicommon.so.1
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1

I've run out of ideas. Any help is more than welcome.

Cheers!


UPDATE:

CppCon 2019: Marco Magdy “The Design of the C++ Runtime for AWS Lambda”

As per what Marco says, I could use whatever Linux distro to dev/build my code and then ship it to lambda. That kind of put aside my suspect about binary compatibility or something like that.

0 Answers
Related