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.
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);
}
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)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With