下面列出了怎么用android.graphics.pdf.PdfDocument的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Do In Background.
*
* @param params Params
* @return TRUE if PDF successfully generated else FALSE.
*/
@Override
protected File doInBackground(Void... params) {
try {
// Create PDF Document.
PdfDocument pdfDocument = new PdfDocument();
// Write content to PDFDocument.
writePDFDocument(pdfDocument);
// Save document to file.
return savePDFDocumentToStorage(pdfDocument);
} catch (Exception exception) {
exception.printStackTrace();
return null;
}
}
/**
* Writes given PDFDocument using content views.
*
* @param pdfDocument PDFDocument to be written.
*/
private void writePDFDocument(final PdfDocument pdfDocument) {
for (int i = 0; i < mContentViews.size(); i++) {
//Get Content View.
View contentView = mContentViews.get(i);
// crate a page description
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.
Builder((int) PDF_PAGE_WIDTH, (int) PDF_PAGE_HEIGHT, i + 1).create();
// start a page
PdfDocument.Page page = pdfDocument.startPage(pageInfo);
// draw view on the page
Canvas pageCanvas = page.getCanvas();
pageCanvas.scale(1f, 1f);
int pageWidth = pageCanvas.getWidth();
int pageHeight = pageCanvas.getHeight();
int measureWidth = View.MeasureSpec.makeMeasureSpec(pageWidth, View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(pageHeight, View.MeasureSpec.EXACTLY);
contentView.measure(measureWidth, measuredHeight);
contentView.layout(0, 0, pageWidth, pageHeight);
contentView.draw(pageCanvas);
// finish the page
pdfDocument.finishPage(page);
}
}
@Override
public void onWrite(
final PageRange[] pageRanges,
final ParcelFileDescriptor destination,
final CancellationSignal cancellationSignal,
final WriteResultCallback callback
) {
PdfDocument.Page page = mPdfDocument.startPage(0);
if (cancellationSignal.isCanceled()) {
callback.onWriteCancelled();
mPdfDocument.close();
mPdfDocument = null;
return;
}
drawPage(page);
mPdfDocument.finishPage(page);
try {
mPdfDocument.writeTo(new FileOutputStream(
destination.getFileDescriptor()));
} catch (IOException e) {
callback.onWriteFailed(e.toString());
return;
} finally {
mPdfDocument.close();
mPdfDocument = null;
}
callback.onWriteFinished(pageRanges);
}
@Override
public void onWrite(
final PageRange[] pageRanges,
final ParcelFileDescriptor destination,
final CancellationSignal cancellationSignal,
final WriteResultCallback callback
) {
PdfDocument.Page page = mPdfDocument.startPage(0);
if (cancellationSignal.isCanceled()) {
callback.onWriteCancelled();
mPdfDocument.close();
mPdfDocument = null;
return;
}
drawPage(page);
mPdfDocument.finishPage(page);
try {
mPdfDocument.writeTo(new FileOutputStream(
destination.getFileDescriptor()));
} catch (IOException e) {
callback.onWriteFailed(e.toString());
return;
} finally {
mPdfDocument.close();
mPdfDocument = null;
}
callback.onWriteFinished(pageRanges);
}
@Override
protected Boolean doInBackground(Void... params) {
PdfDocument document = new PdfDocument();
ParcelFileDescriptor pfd = null;
try {
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(640, 640 * 9 / 16, 1).create();
for (Slide slide : store.getState().slides()) {
PdfDocument.Page page = document.startPage(pageInfo);
page.getCanvas().drawColor(Style.COLOR_SCHEMES[store.getState().colorScheme()][1]);
slide.render(mContext,
page.getCanvas(),
page.getCanvas().getWidth(), page.getCanvas().getHeight(),
Style.SLIDE_FONT,
Style.COLOR_SCHEMES[App.getState().colorScheme()][0],
Style.COLOR_SCHEMES[App.getState().colorScheme()][1],
true);
document.finishPage(page);
}
pfd = mContext.getContentResolver().openFileDescriptor(uri, "w");
if (pfd != null) {
FileOutputStream fos = new FileOutputStream(pfd.getFileDescriptor());
document.writeTo(fos);
return true;
} else {
return false;
}
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
document.close();
if (pfd != null) {
try { pfd.close(); } catch (IOException ignored) {}
}
}
}
private void drawPage(PdfDocument.Page page) {
SQRLStorage storage = SQRLStorage.getInstance(activity);
Canvas canvas = page.getCanvas();
int marginLeftRight = 35;
int marginTop = 65;
int lastBlockY = marginTop;
TextPaint headlineTextPaint = new TextPaint();
headlineTextPaint.setTextSize(16);
headlineTextPaint.setFakeBoldText(true);
TextPaint bodyTextPaint = new TextPaint();
bodyTextPaint.setTextSize(12);
TextPaint identityTextTextPaint = new TextPaint(bodyTextPaint);
identityTextTextPaint.setTypeface(Typeface.MONOSPACE);
identityTextTextPaint.setFakeBoldText(true);
String identityTitle = "\"" + identityName + "\" SQRL Identity";
lastBlockY += DocumentPrintUtils.drawTextBlock(
canvas,
identityTitle,
Layout.Alignment.ALIGN_CENTER,
headlineTextPaint,
marginTop,
marginLeftRight);
lastBlockY += DocumentPrintUtils.drawTextBlock(
canvas,
activity.getString(R.string.print_identity_desc1),
Layout.Alignment.ALIGN_NORMAL,
bodyTextPaint,
lastBlockY + 20,
marginLeftRight) + 20;
byte[] saveData;
if(this.withoutPassword) {
saveData = storage.createSaveDataWithoutPassword();
} else {
saveData = storage.createSaveData();
}
int canvasMiddle = canvas.getWidth() / 2;
QrCode qrCode = QrCode.encodeBinary(saveData, QrCode.Ecc.MEDIUM);
Bitmap bitmap = qrCode.toImage(3, 0);
int bitmapWidth = bitmap.getScaledWidth(canvas);
canvas.drawBitmap(bitmap, canvasMiddle - (bitmapWidth / 2), lastBlockY + 20, new Paint());
lastBlockY += bitmap.getScaledHeight(canvas) + 20;
lastBlockY += DocumentPrintUtils.drawTextBlock(
canvas,
activity.getString(R.string.print_identity_desc2),
Layout.Alignment.ALIGN_NORMAL,
bodyTextPaint,
lastBlockY + 20,
marginLeftRight) + 30;
int i = 0;
try {
Utils.refreshStorageFromDb(activity);
for (String identityTextBlock : storage.getVerifyingRecoveryBlock().split("\n")) {
lastBlockY += DocumentPrintUtils.drawTextBlock(
canvas,
identityTextBlock,
Layout.Alignment.ALIGN_CENTER,
identityTextTextPaint,
lastBlockY + 3,
marginLeftRight) + 3;
i++;
}
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
DocumentPrintUtils.drawTextBlock(
canvas,
activity.getString(R.string.print_identity_desc3),
Layout.Alignment.ALIGN_NORMAL,
bodyTextPaint,
lastBlockY + 20,
marginLeftRight);
DocumentPrintUtils.drawPrintPageFooter(activity, canvas);
}
private void drawPage(PdfDocument.Page page) {
SQRLStorage storage = SQRLStorage.getInstance(activity);
Canvas canvas = page.getCanvas();
int marginTop = 65;
int marginLeft = 35;
int lastBlockY = marginTop;
TextPaint headlineText = new TextPaint();
headlineText.setAntiAlias(true);
headlineText.setTextSize(24);
headlineText.setFakeBoldText(true);
TextPaint redBoldText = new TextPaint();
redBoldText.setAntiAlias(true);
redBoldText.setTextSize(24);
redBoldText.setFakeBoldText(true);
redBoldText.setColor(Color.RED);
TextPaint stdText = new TextPaint();
stdText.setAntiAlias(true);
stdText.setTextSize(14);
String headline = activity.getResources().getString(R.string.rescue_code_page_headline);
String warning = "!! " + activity.getResources().getString(R.string.rescue_code_page_warning).toUpperCase() + " !!";
String description = activity.getResources().getString(R.string.rescue_code_page_description);
lastBlockY += DocumentPrintUtils.drawTextBlock(
canvas,
headline,
Layout.Alignment.ALIGN_CENTER,
headlineText,
lastBlockY,
marginLeft);
lastBlockY += DocumentPrintUtils.drawTextBlock(
canvas,
warning,
Layout.Alignment.ALIGN_CENTER,
redBoldText,
lastBlockY + 40,
marginLeft) + 40;
lastBlockY += DocumentPrintUtils.drawTextBlock(
canvas,
description,
Layout.Alignment.ALIGN_NORMAL,
stdText,
lastBlockY + 20,
marginLeft) + 20;
List<String> rescueCode = storage.getTempShowableRescueCode();
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String s : rescueCode) {
if (!first) sb.append("-");
sb.append(s);
first = false;
}
String rescueCodeOutput = sb.toString();
lastBlockY += DocumentPrintUtils.drawTextBlock(
canvas,
rescueCodeOutput,
Layout.Alignment.ALIGN_CENTER,
redBoldText,
lastBlockY + 60,
marginLeft) + 60;
String idName = activity.getResources().getString(R.string.txt_identity_name_hint) +
": __________________________________";
DocumentPrintUtils.drawTextBlock(
canvas,
idName,
Layout.Alignment.ALIGN_CENTER,
stdText,
lastBlockY + 60,
marginLeft);
DocumentPrintUtils.drawPrintPageFooter(activity, canvas);
}
/**
* Prints the current view to a PDF file, in the given directory and with the given
* filename. If the file exists, it will be deleted.
*
* @param printId an (optional) identifier for the process
* @param directory a directory where the file will be saved
* @param filename the output file name
*/
@Override
public void print(final String printId, @NonNull final File directory, @NonNull String filename) {
Context context = mDocument.getContext();
if (!checkPermission(context, directory)) return;
if (!checkPreview(printId, directory, filename)) return;
if (!filename.toLowerCase().endsWith(".pdf")) filename += ".pdf";
final File file = new File(directory, filename);
if (!checkFile(printId, file)) return;
if (mDocument.getPageCount() == 0) return;
DocumentPage firstPage = mDocument.getPageAt(0);
PrintSize size = mDocument.getPrintSize();
// Create doc
PrintAttributes attrs = new PrintAttributes.Builder()
.setColorMode(PrintAttributes.COLOR_MODE_COLOR)
.setMediaSize(size.toMediaSize(firstPage))
.setMinMargins(PrintAttributes.Margins.NO_MARGINS)
.build();
final PrintedPdfDocument doc = new PrintedPdfDocument(context, attrs);
// Print page
// Page canvas is passed in PostScript points. In order not to break View drawing,
// we must scale that up back to pixels.
dispatchOnPrePrint(mDocument);
for (int i = 0; i < mDocument.getPageCount(); i++) {
PdfDocument.Page page = doc.startPage(i);
Canvas canvas = page.getCanvas();
float pixelsToPoints = PrintSize.PIXELS_TO_INCHES(context) * PrintSize.INCHES_TO_POINTS;
canvas.scale(pixelsToPoints, pixelsToPoints, 0, 0);
DocumentPage view = mDocument.getPageAt(i);
Drawable background = null;
if (!mPrintBackground) {
background = view.getBackground();
view.setBackground(null);
}
view.draw(canvas);
if (!mPrintBackground) {
view.setBackground(background);
}
doc.finishPage(page);
}
dispatchOnPostPrint(mDocument);
// I am not sure if the above would work with any view. Some views might be checking for
// canvas.getWidth() or canvas.tryGetHeight(), which now are not consistent. If errors show up,
// we might have to draw on a separate canvas and then scale the bitmap.
// This has other drawbacks: the original pdf canvas, for example, takes text as text and
// makes it selectable in the final PDF.
// Print in a separate thread.
// Since we're API 19 we can use try with resources.
final Handler ui = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
try (OutputStream stream = new BufferedOutputStream(new FileOutputStream(file))) {
doc.writeTo(stream);
ui.post(new Runnable() {
@Override
public void run() {
mCallback.onPrint(printId, file);
}
});
} catch (final IOException e) {
ui.post(new Runnable() {
@Override
public void run() {
mCallback.onPrintFailed(printId, new RuntimeException("Invalid file: " + file, e));
}
});
}
}
}, TAG + "Worker").start();
}
public static void exportPDF(Context ctx, Times times, @NonNull LocalDate from, @NonNull LocalDate to) throws IOException {
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo;
int pw = 595;
int ph = 842;
pageInfo = new PdfDocument.PageInfo.Builder(pw, ph, 1).create();
PdfDocument.Page page = document.startPage(pageInfo);
Drawable launcher = Drawable.createFromStream(ctx.getAssets().open("pdf/launcher.png"), null);
Drawable qr = Drawable.createFromStream(ctx.getAssets().open("pdf/qrcode.png"), null);
Drawable badge =
Drawable.createFromStream(ctx.getAssets().open("pdf/badge_" + LocaleUtils.getLanguage("en", "de", "tr", "fr", "ar") + ".png"),
null);
launcher.setBounds(30, 30, 30 + 65, 30 + 65);
qr.setBounds(pw - 30 - 65, 30 + 65 + 5, pw - 30, 30 + 65 + 5 + 65);
int w = 100;
int h = w * badge.getIntrinsicHeight() / badge.getIntrinsicWidth();
badge.setBounds(pw - 30 - w, 30 + (60 / 2 - h / 2), pw - 30, 30 + (60 / 2 - h / 2) + h);
Canvas canvas = page.getCanvas();
Paint paint = new Paint();
paint.setARGB(255, 0, 0, 0);
paint.setTextSize(10);
paint.setTextAlign(Paint.Align.CENTER);
canvas.drawText("com.metinkale.prayer", pw - 30 - w / 2f, 30 + (60 / 2f - h / 2f) + h + 10, paint);
launcher.draw(canvas);
qr.draw(canvas);
badge.draw(canvas);
paint.setARGB(255, 61, 184, 230);
canvas.drawRect(30, 30 + 60, pw - 30, 30 + 60 + 5, paint);
if (times.getSource().drawableId != 0) {
Drawable source = ctx.getResources().getDrawable(times.getSource().drawableId);
h = 65;
w = h * source.getIntrinsicWidth() / source.getIntrinsicHeight();
source.setBounds(30, 30 + 65 + 5, 30 + w, 30 + 65 + 5 + h);
source.draw(canvas);
}
paint.setARGB(255, 0, 0, 0);
paint.setTextSize(40);
paint.setTextAlign(Paint.Align.LEFT);
canvas.drawText(ctx.getText(R.string.appName).toString(), 30 + 65 + 5, 30 + 50, paint);
paint.setTextAlign(Paint.Align.CENTER);
paint.setFakeBoldText(true);
canvas.drawText(times.getName(), pw / 2.0f, 30 + 65 + 50, paint);
paint.setTextSize(12);
int y = 30 + 65 + 5 + 65 + 30;
int p = 30;
int cw = (pw - p - p) / 7;
canvas.drawText(ctx.getString(R.string.date), 30 + (0.5f * cw), y, paint);
canvas.drawText(FAJR.getString(), 30 + (1.5f * cw), y, paint);
canvas.drawText(Vakit.SUN.getString(), 30 + (2.5f * cw), y, paint);
canvas.drawText(Vakit.DHUHR.getString(), 30 + (3.5f * cw), y, paint);
canvas.drawText(Vakit.ASR.getString(), 30 + (4.5f * cw), y, paint);
canvas.drawText(Vakit.MAGHRIB.getString(), 30 + (5.5f * cw), y, paint);
canvas.drawText(Vakit.ISHAA.getString(), 30 + (6.5f * cw), y, paint);
paint.setFakeBoldText(false);
do {
y += 20;
canvas.drawText((from.toString("dd.MM.yyyy")), 30 + (0.5f * cw), y, paint);
canvas.drawText(times.getTime(from, FAJR.ordinal()).toLocalTime().toString(), 30 + (1.5f * cw), y, paint);
canvas.drawText(times.getTime(from, SUN.ordinal()).toLocalTime().toString(), 30 + (2.5f * cw), y, paint);
canvas.drawText(times.getTime(from, DHUHR.ordinal()).toLocalTime().toString(), 30 + (3.5f * cw), y, paint);
canvas.drawText(times.getTime(from, ASR.ordinal()).toLocalTime().toString(), 30 + (4.5f * cw), y, paint);
canvas.drawText(times.getTime(from, MAGHRIB.ordinal()).toLocalTime().toString(), 30 + (5.5f * cw), y, paint);
canvas.drawText(times.getTime(from, ISHAA.ordinal()).toLocalTime().toString(), 30 + (6.5f * cw), y, paint);
} while (!(from = from.plusDays(1)).isAfter(to));
document.finishPage(page);
File outputDir = ctx.getCacheDir();
if (!outputDir.exists())
outputDir.mkdirs();
File outputFile = new File(outputDir, times.getName().replace(" ", "_") + ".pdf");
if (outputFile.exists())
outputFile.delete();
FileOutputStream outputStream = new FileOutputStream(outputFile);
document.writeTo(outputStream);
document.close();
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("application/pdf");
Uri uri = FileProvider.getUriForFile(ctx, ctx.getString(R.string.FILE_PROVIDER_AUTHORITIES), outputFile);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
ctx.startActivity(Intent.createChooser(shareIntent, ctx.getResources().getText(R.string.export)));
}
public static void exportPDF(Context ctx, Times times, @NonNull LocalDate from, @NonNull LocalDate to) throws IOException {
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo;
int pw = 595;
int ph = 842;
pageInfo = new PdfDocument.PageInfo.Builder(pw, ph, 1).create();
PdfDocument.Page page = document.startPage(pageInfo);
Drawable launcher = Drawable.createFromStream(ctx.getAssets().open("pdf/launcher.png"), null);
Drawable qr = Drawable.createFromStream(ctx.getAssets().open("pdf/qrcode.png"), null);
Drawable badge =
Drawable.createFromStream(ctx.getAssets().open("pdf/badge_" + LocaleUtils.getLanguage("en", "de", "tr", "fr", "ar") + ".png"),
null);
launcher.setBounds(30, 30, 30 + 65, 30 + 65);
qr.setBounds(pw - 30 - 65, 30 + 65 + 5, pw - 30, 30 + 65 + 5 + 65);
int w = 100;
int h = w * badge.getIntrinsicHeight() / badge.getIntrinsicWidth();
badge.setBounds(pw - 30 - w, 30 + (60 / 2 - h / 2), pw - 30, 30 + (60 / 2 - h / 2) + h);
Canvas canvas = page.getCanvas();
Paint paint = new Paint();
paint.setARGB(255, 0, 0, 0);
paint.setTextSize(10);
paint.setTextAlign(Paint.Align.CENTER);
canvas.drawText("com.metinkale.prayer", pw - 30 - w / 2f, 30 + (60 / 2f - h / 2f) + h + 10, paint);
launcher.draw(canvas);
qr.draw(canvas);
badge.draw(canvas);
paint.setARGB(255, 61, 184, 230);
canvas.drawRect(30, 30 + 60, pw - 30, 30 + 60 + 5, paint);
if (times.getSource().drawableId != 0) {
Drawable source = ctx.getResources().getDrawable(times.getSource().drawableId);
h = 65;
w = h * source.getIntrinsicWidth() / source.getIntrinsicHeight();
source.setBounds(30, 30 + 65 + 5, 30 + w, 30 + 65 + 5 + h);
source.draw(canvas);
}
paint.setARGB(255, 0, 0, 0);
paint.setTextSize(40);
paint.setTextAlign(Paint.Align.LEFT);
canvas.drawText(ctx.getText(R.string.appName).toString(), 30 + 65 + 5, 30 + 50, paint);
paint.setTextAlign(Paint.Align.CENTER);
paint.setFakeBoldText(true);
canvas.drawText(times.getName(), pw / 2.0f, 30 + 65 + 50, paint);
paint.setTextSize(12);
int y = 30 + 65 + 5 + 65 + 30;
int p = 30;
int cw = (pw - p - p) / 7;
canvas.drawText(ctx.getString(R.string.date), 30 + (0.5f * cw), y, paint);
canvas.drawText(FAJR.getString(), 30 + (1.5f * cw), y, paint);
canvas.drawText(Vakit.SUN.getString(), 30 + (2.5f * cw), y, paint);
canvas.drawText(Vakit.DHUHR.getString(), 30 + (3.5f * cw), y, paint);
canvas.drawText(Vakit.ASR.getString(), 30 + (4.5f * cw), y, paint);
canvas.drawText(Vakit.MAGHRIB.getString(), 30 + (5.5f * cw), y, paint);
canvas.drawText(Vakit.ISHAA.getString(), 30 + (6.5f * cw), y, paint);
paint.setFakeBoldText(false);
do {
y += 20;
canvas.drawText((from.toString("dd.MM.yyyy")), 30 + (0.5f * cw), y, paint);
canvas.drawText(times.getTime(from, FAJR.ordinal()).toLocalTime().toString(), 30 + (1.5f * cw), y, paint);
canvas.drawText(times.getTime(from, SUN.ordinal()).toLocalTime().toString(), 30 + (2.5f * cw), y, paint);
canvas.drawText(times.getTime(from, DHUHR.ordinal()).toLocalTime().toString(), 30 + (3.5f * cw), y, paint);
canvas.drawText(times.getTime(from, ASR.ordinal()).toLocalTime().toString(), 30 + (4.5f * cw), y, paint);
canvas.drawText(times.getTime(from, MAGHRIB.ordinal()).toLocalTime().toString(), 30 + (5.5f * cw), y, paint);
canvas.drawText(times.getTime(from, ISHAA.ordinal()).toLocalTime().toString(), 30 + (6.5f * cw), y, paint);
} while (!(from = from.plusDays(1)).isAfter(to));
document.finishPage(page);
File outputDir = ctx.getCacheDir();
if (!outputDir.exists())
outputDir.mkdirs();
File outputFile = new File(outputDir, times.getName().replace(" ", "_") + ".pdf");
if (outputFile.exists())
outputFile.delete();
FileOutputStream outputStream = new FileOutputStream(outputFile);
document.writeTo(outputStream);
document.close();
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("application/pdf");
Uri uri = FileProvider.getUriForFile(ctx, ctx.getString(R.string.FILE_PROVIDER_AUTHORITIES), outputFile);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
ctx.startActivity(Intent.createChooser(shareIntent, ctx.getResources().getText(R.string.export)));
}