Setting Up CUPS Printing on Ubuntu 18.04 and Android PDF Print Integration
Installing CUPS on Ubuntu 18.04
Begin by updating the system and installing CUPS along with essential dependencies:
sudo apt update
sudo apt install cups foomatic-filters ghostscript
Restart the CUPS service to apply changes:
sudo systemctl restart cups
Enable and start the service if not already running:
sudo systemctl enable --now cups
Access the CUPS web interface at http://localhost:631 for GUI-based configuration.
If encountering D-Bus errors:
sudo systemctl start dbus
Printer Setup via CLI
Add a network printer using IPP:
lpadmin -p Epson_L3251 -E -v ipp://11.22.33.44/ipp/print -m everywhere
lpadmin -p HP_M104W -E -v ipp://11.22.33.44/ipp/print -m everywhere
Set a default printer:
lpoptions -d Epson_L3251
Print a PDF file:
lp -o media=A4 document.pdf
Check printer status:
lpstat -p
Remove a printer:
lpadmin -x Epson_L3251
Locate PPD files:
lpinfo -m | grep -i epson
find /etc/cups/ppd -name "*Epson*"
Android PDF Printing via Vendor Plugins
Instead of embedding print logic, leverage manufacturer-provided print services:
- HP:
com.hp.android.printservice - Epson:
Epson iPrint - Canon:
Canon PRINT Business - Samsung:
Samsung Mobile Print
Use Android’s share intent to delegate printing:
private fun printPdf(pdfPath: String) {
val file = File(pdfPath)
if (!file.exists()) {
Toast.makeText(this, "File not found", Toast.LENGTH_SHORT).show()
return
}
val uri = Uri.fromFile(file)
val intent = Intent(Intent.ACTION_SEND).apply {
type = "application/pdf"
putExtra(Intent.EXTRA_STREAM, uri)
}
startActivity(Intent.createChooser(intent, "Print PDF"))
}
Cross-Compiling CUPS for Android (Advanced)
While possible, compiling CUPS for Android is complex and generally discouraged unless absolutely necessary.
Prerequisites
- Install Android NDK (e.g., r21e).
- Create a standalone toolchain:
$NDK/build/tools/make_standalone_toolchain.py \
--arch arm --api 24 --install-dir /opt/toolchain
Set environment variables:
export PATH=/opt/toolchain/bin:$PATH
export CC=armv7a-linux-androideabi24-clang
export CXX=armv7a-linux-androideabi24-clang++
Patching and Building CUPS
CUPS requires modifications for Android compatibility:
- Disable D-Bus, PAM, and TLS.
- Replace missing
nl_langinfoimplementation (from AOSP sed source). - Stub out password/group database functions (
getpwuid,endpwent, etc.). - Comment out
pthread_cancelusage in threading code.
Example configure command:
./configure \
--host=arm-linux-androideabi \
--disable-dbus \
--disable-pam \
--without-tls \
--prefix=/system/usr/root \
--with-cups-user=system \
--with-cups-group=system
Apply necessary patches before building:
make
make install DESTDIR=/output
Deployment on Android
After compilation:
- Push binaries to
/system/usr/root/{bin,sbin}. - Copy libraries to
/system/lib. - Place config files in
/system/usr/root/etc/cups/. - Set permissions:
chmod 755 /system/usr/root -R
chmod 777 /system/usr/root/var -R
Configure cupsd.conf to allow network access:
<Location />
Order allow,deny
Allow all
</Location>
Launch CUPS daemon:
export LD_LIBRARY_PATH=/system/usr/root/lib
export PATH=/system/usr/root/bin:/system/usr/root/sbin:$PATH
cupsd -f &
Verify operation by accessing http://localhost:631 via a mobile browser.
Common Issues
- "Unsupported document-format": Requires
cups-filtersfor PDF rendering. - Backend crashes: Ensure
libcups.so.2is inLD_LIBRARY_PATH. - PPD creation failure: Confirm printer supports IPP Everywhere via:
ipptool -tv ipp://PRINTER_IP/ipp/print get-printer-attributes.test
Note: Full PDF printing on Android typically requires additional components like cups-filters, qpdf, and image libraries (Poppler, LCMS2, etc.), which must also be cross-compiled and deployed.