Skip to content

Commit 669da1a

Browse files
committed
add print functionality
1 parent c1b0561 commit 669da1a

5 files changed

Lines changed: 108 additions & 0 deletions

File tree

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package org.grapheneos.pdfviewer;
2+
3+
import android.content.Context;
4+
import android.net.Uri;
5+
import android.os.Bundle;
6+
import android.os.CancellationSignal;
7+
import android.os.ParcelFileDescriptor;
8+
import android.print.PageRange;
9+
import android.print.PrintAttributes;
10+
import android.print.PrintDocumentAdapter;
11+
import android.print.PrintDocumentInfo;
12+
13+
import java.io.FileOutputStream;
14+
import java.io.IOException;
15+
import java.io.InputStream;
16+
import java.io.OutputStream;
17+
18+
public class PdfDocumentAdapter extends PrintDocumentAdapter {
19+
20+
private Context mContext;
21+
private String mPrintJobName;
22+
private Uri mUri;
23+
24+
public PdfDocumentAdapter(Context ctx, String jobName, Uri uri) {
25+
this.mContext = ctx;
26+
this.mPrintJobName = jobName;
27+
this.mUri = uri;
28+
}
29+
30+
@Override
31+
public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback layoutResultCallback, Bundle bundle) {
32+
if (cancellationSignal.isCanceled()) {
33+
layoutResultCallback.onLayoutCancelled();
34+
} else {
35+
PrintDocumentInfo.Builder pdinfoBuilder = new PrintDocumentInfo.Builder(mPrintJobName);
36+
pdinfoBuilder.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT);
37+
pdinfoBuilder.setPageCount(PrintDocumentInfo.PAGE_COUNT_UNKNOWN);
38+
PrintDocumentInfo pdInfo = pdinfoBuilder.build();
39+
layoutResultCallback.onLayoutFinished(pdInfo, !newAttributes.equals(oldAttributes));
40+
}
41+
}
42+
43+
@Override
44+
public void onWrite(PageRange[] pageRanges, ParcelFileDescriptor parcelFileDescriptor, CancellationSignal cancellationSignal, WriteResultCallback writeResultCallback) {
45+
InputStream inputStream = null;
46+
OutputStream outputStream = null;
47+
48+
try {
49+
inputStream = mContext.getContentResolver().openInputStream(mUri);;
50+
outputStream = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());
51+
byte[] buffer = new byte[mContext.getResources().getInteger(R.integer.print_adapter_buffer_size)];
52+
53+
int readSize = inputStream.read(buffer);
54+
while (readSize >= 0 && !cancellationSignal.isCanceled()) {
55+
outputStream.write(buffer, 0, readSize);
56+
readSize = inputStream.read(buffer);
57+
}
58+
59+
if (cancellationSignal.isCanceled()) {
60+
writeResultCallback.onWriteCancelled();
61+
} else {
62+
writeResultCallback.onWriteFinished(new PageRange[] { PageRange.ALL_PAGES });
63+
}
64+
} catch (IOException ex) {
65+
writeResultCallback.onWriteFailed(ex.getMessage());
66+
} finally {
67+
try {
68+
if (outputStream != null)
69+
outputStream.close();
70+
if (inputStream != null)
71+
inputStream.close();
72+
} catch (IOException ignored) {
73+
74+
}
75+
}
76+
}
77+
}

app/src/main/java/org/grapheneos/pdfviewer/PdfViewer.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import android.graphics.Color;
88
import android.net.Uri;
99
import android.os.Bundle;
10+
import android.print.PrintAttributes;
11+
import android.print.PrintDocumentAdapter;
12+
import android.print.PrintManager;
1013
import android.util.Log;
1114
import android.view.Gravity;
1215
import android.view.Menu;
@@ -22,6 +25,7 @@
2225
import android.webkit.WebViewClient;
2326
import android.widget.TextView;
2427
import android.widget.Toast;
28+
import android.content.Context;
2529

2630
import androidx.appcompat.app.AppCompatActivity;
2731
import androidx.loader.app.LoaderManager;
@@ -345,6 +349,14 @@ private void renderPage(final int zoom) {
345349
mWebView.evaluateJavascript("onRenderPage(" + zoom + ")", null);
346350
}
347351

352+
private void printDocument() {
353+
PrintManager printManager = (PrintManager)getSystemService(Context.PRINT_SERVICE);
354+
String jobName = getString(R.string.print_job_base_name);
355+
PrintDocumentAdapter printDocumentAdapter = new PdfDocumentAdapter(this, jobName, mUri);
356+
PrintAttributes printAttributes = new PrintAttributes.Builder().build();
357+
printManager.print(jobName, printDocumentAdapter, printAttributes);
358+
}
359+
348360
private void documentOrientationChanged(final int orientationDegreesOffset) {
349361
mDocumentOrientationDegrees = (mDocumentOrientationDegrees + orientationDegreesOffset) % 360;
350362
if (mDocumentOrientationDegrees < 0) {
@@ -465,6 +477,7 @@ public boolean onPrepareOptionsMenu(Menu menu) {
465477
final int ids[] = { R.id.action_zoom_in, R.id.action_zoom_out, R.id.action_jump_to_page,
466478
R.id.action_next, R.id.action_previous, R.id.action_first, R.id.action_last,
467479
R.id.action_rotate_clockwise, R.id.action_rotate_counterclockwise,
480+
R.id.action_print,
468481
R.id.action_view_document_properties };
469482
if (mDocumentState < STATE_LOADED) {
470483
for (final int id : ids) {
@@ -541,6 +554,10 @@ public boolean onOptionsItemSelected(MenuItem item) {
541554
.show(getSupportFragmentManager(), JumpToPageFragment.TAG);
542555
return true;
543556

557+
case R.id.action_print:
558+
printDocument();
559+
return true;
560+
544561
default:
545562
return super.onOptionsItemSelected(item);
546563
}

app/src/main/res/menu/pdf_viewer.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@
6767
android:title="@string/action_rotate_counterclockwise"
6868
app:showAsAction="ifRoom" />
6969

70+
<item
71+
android:id="@+id/action_print"
72+
android:title="@string/action_print"
73+
app:showAsAction="never" />
74+
7075
<item
7176
android:id="@+id/action_view_document_properties"
7277
android:title="@string/action_view_document_properties"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<integer name="print_adapter_buffer_size">16384</integer>
4+
</resources>

app/src/main/res/values/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
<string name="action_rotate_counterclockwise">Rotate counterclockwise</string>
1414
<string name="action_jump_to_page">Jump to page</string>
1515
<string name="action_view_document_properties">Properties</string>
16+
<string name="action_print">Print</string>
17+
18+
<string name="print_job_base_name">PDF Document</string>
19+
<string name="toast_print_completed">Print job completed successfully</string>
20+
<string name="toast_print_failed">Print job failed</string>
1621

1722
<string name="document_properties_invalid_date">Invalid date</string>
1823
<string name="document_properties_retrieval_failed">Failed to obtain document metadata</string>

0 commit comments

Comments
 (0)