Skip to content

Instantly share code, notes, and snippets.

@brettwold
Last active September 22, 2024 06:14
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;
}
}
@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?

@KplRitesh
Copy link

KplRitesh commented Sep 22, 2024

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.

can you elaborate on that, do i have to use setWebviewClient and onPageFinished??, while i have tried that, the webview never reaches the onPageFinished and pdf is never loaded in webview, how am i supposed to send the pdf for printing?

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