Skip to content

Instantly share code, notes, and snippets.

@brettwold
Last active January 2, 2024 03:41
Show Gist options
  • Save brettwold/838c092329c486b6112c8ebe94c8007e to your computer and use it in GitHub Desktop.
Save brettwold/838c092329c486b6112c8ebe94c8007e to your computer and use it in GitHub Desktop.
How to save a PDF from any Android WebView
package android.print;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import java.io.File;
public class PdfPrint {
private static final String TAG = PdfPrint.class.getSimpleName();
private final PrintAttributes printAttributes;
public PdfPrint(PrintAttributes printAttributes) {
this.printAttributes = printAttributes;
}
public void print(PrintDocumentAdapter printAdapter, final File path, final String fileName) {
printAdapter.onLayout(null, printAttributes, null, new PrintDocumentAdapter.LayoutResultCallback() {
@Override
public void onLayoutFinished(PrintDocumentInfo info, boolean changed) {
printAdapter.onWrite(new PageRange[]{PageRange.ALL_PAGES}, getOutputFile(path, fileName), new CancellationSignal(), new PrintDocumentAdapter.WriteResultCallback() {
@Override
public void onWriteFinished(PageRange[] pages) {
super.onWriteFinished(pages);
}
});
}
}, null);
}
private ParcelFileDescriptor getOutputFile(File path, String fileName) {
if (!path.exists()) {
path.mkdirs();
}
File file = new File(path, fileName);
try {
file.createNewFile();
return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE);
} catch (Exception e) {
Log.e(TAG, "Failed to open ParcelFileDescriptor", e);
}
return null;
}
}
@kungfurabbit
Copy link

@KsgFellow, same problem

@senthilgk93
Copy link

Api level 21 webview to print not working.Issue Display empty page Print why

@habibieamrullah
Copy link

Create a package in your src folder as android.print and place the class inside that package. Don't copy the class to your existing packages.

This worked!

@aluckens
Copy link

thank you!

@marlonngalvao
Copy link

The empty file problem is because of the webview rendering time.
The pdfPrint method finishes writing to the file even before the webView finishes rendering.
I decided to render the webview underneath, before clicking the button to call pdfPrint.
So that will allow time for the webview to render.

@earlGrantHomage
Copy link

The empty file problem is because of the webview rendering time. The pdfPrint method finishes writing to the file even before the webView finishes rendering. I decided to render the webview underneath, before clicking the button to call pdfPrint. So that will allow time for the webview to render.

@marlonngalvao do you have sample gist for this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment