Android Print PDF Programmatically
13,888
Solution 1
We can simply achieve this by creating a custom PrintDocumentAdapter
PdfDocumentAdapter.java
public class PdfDocumentAdapter extends PrintDocumentAdapter {
Context context = null;
String pathName = "";
public PdfDocumentAdapter(Context ctxt, String pathName) {
context = ctxt;
this.pathName = pathName;
}
@Override
public void onLayout(PrintAttributes printAttributes, PrintAttributes printAttributes1, CancellationSignal cancellationSignal, LayoutResultCallback layoutResultCallback, Bundle bundle) {
if (cancellationSignal.isCanceled()) {
layoutResultCallback.onLayoutCancelled();
}
else {
PrintDocumentInfo.Builder builder=
new PrintDocumentInfo.Builder(" file name");
builder.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount(PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
.build();
layoutResultCallback.onLayoutFinished(builder.build(),
!printAttributes1.equals(printAttributes));
}
}
@Override
public void onWrite(PageRange[] pageRanges, ParcelFileDescriptor parcelFileDescriptor, CancellationSignal cancellationSignal, WriteResultCallback writeResultCallback) {
InputStream in=null;
OutputStream out=null;
try {
File file = new File(pathName);
in = new FileInputStream(file);
out=new FileOutputStream(parcelFileDescriptor.getFileDescriptor());
byte[] buf=new byte[16384];
int size;
while ((size=in.read(buf)) >= 0
&& !cancellationSignal.isCanceled()) {
out.write(buf, 0, size);
}
if (cancellationSignal.isCanceled()) {
writeResultCallback.onWriteCancelled();
}
else {
writeResultCallback.onWriteFinished(new PageRange[] { PageRange.ALL_PAGES });
}
}
catch (Exception e) {
writeResultCallback.onWriteFailed(e.getMessage());
Logger.logError( e);
}
finally {
try {
in.close();
out.close();
}
catch (IOException e) {
Logger.logError( e);
}
}
}}
Now call print by using PrintManager
PrintManager printManager=(PrintManager) SurefoxBrowserScreen.getActivityContext().getSystemService(Context.PRINT_SERVICE);
try
{
PrintDocumentAdapter printAdapter = new PdfDocumentAdapter(Settings.sharedPref.context,filePath );
}
printManager.print("Document", printAdapter,new PrintAttributes.Builder().build());
}
catch (Exception e)
{
Logger.logError(e);
}
Solution 2
I've rewritten Karthik's answer in Kotlin for anyone that needs it.
class PDFDocumentAdapter(private val file: File) : PrintDocumentAdapter() {
override fun onLayout(oldAttributes: PrintAttributes?, newAttributes: PrintAttributes?, cancellationSignal: CancellationSignal, callback: LayoutResultCallback, extras: Bundle?) {
if (cancellationSignal.isCanceled) {
callback.onLayoutCancelled()
return
}
val info = PrintDocumentInfo.Builder(" file name")
.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount(PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
.build()
callback.onLayoutFinished(info, oldAttributes != newAttributes)
}
override fun onWrite(pages: Array<out PageRange>, destination: ParcelFileDescriptor, cancellationSignal: CancellationSignal, callback: WriteResultCallback) {
var inputStream: InputStream? = null
var outputStream: OutputStream? = null
try {
inputStream = FileInputStream(file)
outputStream = FileOutputStream(destination.fileDescriptor)
inputStream.copyTo(outputStream)
if (cancellationSignal.isCanceled) {
callback.onWriteCancelled()
} else {
callback.onWriteFinished(arrayOf(PageRange.ALL_PAGES))
}
} catch (ex: Exception) {
callback.onWriteFailed(ex.message)
Log.e("PDFDocumentAdapter", "Could not write: ${ex.localizedMessage}")
} finally {
inputStream?.close()
outputStream?.close()
}
}
}
And to use PDFDocumentAdapter
:
private fun print(file: File) {
val manager = getSystemService(Context.PRINT_SERVICE) as PrintManager
val adapter = PDFDocumentAdapter(file)
val attributes = PrintAttributes.Builder().build()
manager.print("Document", adapter, attributes)
}
![Hardik](https://i.stack.imgur.com/7obRs.jpg?s=256&g=1)
Author by
Hardik
Updated on July 26, 2022Comments
-
Hardik almost 2 years
I have to develop printing functionality in Android 4.4 I want to develop following functionality: - Use Android 4.4 Print Framwork - Print pdf from SD Card(No Need to Re-Generate) - Configuration like : number of copies, page selection
I know it is possible in Android 4.4. But I want to print pdf from SD Card programmatically.
-
SinaMN75 over 4 yearsit will open android's dialog for choosing printers and other settings, is there anyway to prevent that, make it print directly without any popups?
-
Ayush Sth about 3 years@SinaMN75 Did you found anything? Please help!! Thanks
-
SinaMN75 about 3 years@AyushSth unfortunately no, project was cancelled...
-
Ayush Sth about 3 yearssad to know about it. Thanks for the response :) @SinaMN75