একটি ফাইলে প্রিন্ট আউটপুট লেখার সময়, অ্যান্ড্রয়েড প্রিন্ট ফ্রেমওয়ার্ক আপনার অ্যাপলিকেশনের PrintDocumentAdapter ক্লাসের onWrite()মেথড কল করে। মেথডের প্যারামিটার কোন পেজ লেখা উচিত এবং আউটপুট ফাইল ব্যবহৃত হবে তা নির্দিষ্ট করে। আপনার এই মেথডের বাস্তবায়ন অবশ্যই তারপর কনটেন্টের রিকোয়েস্ট করা প্রতিটা পেজ মাল্টি-পেজ PDF ডকুমেন্ট ফাইলে পেশ করতে হবে। যখন এই প্রক্রিয়া সম্পন্ন হবে আপনি কলব্যাক অবজেক্টের onWriteFinished()মেথড কল করেন।
$নোট: অ্যান্ড্রয়েড প্রিন্ট ফ্রেমওয়ার্ক onLayout()এ প্রতিটা কলের জন্য এক বা একাধিক বার onWrite()মেথড কল করতে পারে। এই কারনে, false এ onLayoutFinished()মেথডের বুলিয়ান (boolean) প্যারামিটার সেট করাটা গুরুত্বপূর্ন যখন প্রিন্ট কনটেন্ট লেআউট পরিবর্তন হয় না, প্রিন্ট কনটেন্টের অপ্রয়োজনীয় রি-রাইট পরিহার করার জন্য।
নোট: onLayoutFinished()মেথডের বুলিয়ান প্যারামিটার লেআউট কনটেন্ট আসলেই পরিবর্তিত হয়েছে কিনা তা নির্দেশ করে শেষ রিকোয়েস্ট থেকে অদ্যবধি। এই প্যারামিটার যথাযথভাবে সেট করতে প্রিন্ট ফ্রেমওয়ার্ককে onLayout()মেথড অপ্রয়োজনীয়ভাবে কল করা, পূর্বে লেখা প্রিন্ট ডকুমেন্ট অপরিহার্যভাবে জমিয়ে রাখা এবং পারফরমেন্স উন্নয়ন করা থেকে বিরত রাখতে দিন ।
নিম্নোক্ত নমুনা একটি PDF ফাইল তৈরী করতে PrintedPdfDocument ক্লাস ব্যবহার করে এই প্রক্রিয়ার মৌলিক মেকানিকস দেখায়:
@Override
public void onWrite(final PageRange[] pageRanges,
final ParcelFileDescriptor destination,
final CancellationSignal cancellationSignal,
final WriteResultCallback callback) {
// Iterate over each page of the document,
// check if it's in the output range.
for (int i = 0; i < totalPages; i++) {
// Check to see if this page is in the output range.
if (containsPage(pageRanges, i)) {
// If so, add it to writtenPagesArray. writtenPagesArray.size()
// is used to compute the next output page index.
writtenPagesArray.append(writtenPagesArray.size(), i);
PdfDocument.Page page = mPdfDocument.startPage(i);
// check for cancellation
if (cancellationSignal.isCancelled()) {
callback.onWriteCancelled();
mPdfDocument.close();
mPdfDocument = null;
return;
}
// Draw page content for printing
drawPage(page);
// Rendering is complete, so page can be finalized.
mPdfDocument.finishPage(page);
}
}
// Write PDF document to file
try {
mPdfDocument.writeTo(new FileOutputStream(
destination.getFileDescriptor()));
} catch (IOException e) {
callback.onWriteFailed(e.toString());
return;
} finally {
mPdfDocument.close();
mPdfDocument = null;
}
PageRange[] writtenPages = computeWrittenPages();
// Signal the print framework the document is complete
callback.onWriteFinished(writtenPages);
...
}
এই নমুনা drawPage() মেথডে PDF পেজ কনটেন্টের রেন্ডারিং হস্তান্তর করে, যা পরবর্তী অধ্যায়ে আলোচনা করা হবে।
যেহেতু লেআউটের সাথে, onWrite()মেথড কার্যসম্পাদনের তিনটা ফলাফল থাকতে পারে: কমপ্লিশন (শেষ করা), ক্যানসেলেশন (বাতিল করা) বা ফেইলিওর ( অসফল) এর ঘটনা যেখানে কনটেন্ট লেখা হয় না। PrintDocumentAdapter.WriteResultCallback অবজেক্টের যথাযথ মেথডটি কল করার মাধ্যমে আপনাকে অবশ্যই এই ফলাফলগুলোর কোন একটি নির্দেশ করতে হবে।
নোট: প্রিন্টিং এর জন্য একটি ডকুমেন্ট রেন্ডারিং একটি রিসোর্স-ইনটেনসিভ অপারেশন হতে পারে। আপনার অ্যাপলিকেশনের প্রধান ইউজার ইন্টারফেস থ্রেড ব্লক করাকে পরিহার করার জন্য, আপনার উচিত একটি পৃথক থ্রেডে পেজ রেন্ডারিং বা রাইটিং অপারেশন সম্পান করার বিষয়টা বিবেচনা করা উচিত, উদাহরণস্বরূপ, একটি AsyncTask এর মধ্যে। আসিঙখ্রোনাস (asynchronous) কাজের মতো এক্সিকিউশন থ্রেডের সাথে কাজ করা সম্পর্কিত আরও তথ্য জানতে, Processes and Threads (http://developer.android.com/guide/components/processes-and-threads.html) দেখুন।