কাস্টম নথি মুদ্রণ

কিছু অ্যাপ্লিকেশনের জন্য, যেমন অঙ্কন অ্যাপ্লিকেশন, পৃষ্ঠা লেআউট অ্যাপ্লিকেশন এবং অন্যান্য অ্যাপ্লিকেশন যা গ্রাফিক আউটপুটে ফোকাস করে, সুন্দর মুদ্রিত পৃষ্ঠাগুলি তৈরি করা একটি মূল বৈশিষ্ট্য। এই ক্ষেত্রে, এটি একটি ইমেজ বা একটি HTML ডকুমেন্ট প্রিন্ট করা যথেষ্ট নয়। এই ধরনের অ্যাপ্লিকেশনের জন্য প্রিন্ট আউটপুট ফন্ট, টেক্সট ফ্লো, পৃষ্ঠা বিরতি, শিরোনাম, ফুটার এবং গ্রাফিক উপাদান সহ একটি পৃষ্ঠায় যাওয়া সমস্ত কিছুর সুনির্দিষ্ট নিয়ন্ত্রণ প্রয়োজন।

আপনার অ্যাপ্লিকেশনের জন্য সম্পূর্ণরূপে কাস্টমাইজ করা প্রিন্ট আউটপুট তৈরি করতে পূর্বে আলোচিত পদ্ধতির চেয়ে বেশি প্রোগ্রামিং বিনিয়োগের প্রয়োজন। আপনাকে অবশ্যই এমন উপাদান তৈরি করতে হবে যা প্রিন্ট ফ্রেমওয়ার্কের সাথে যোগাযোগ করে, প্রিন্টার সেটিংসে সামঞ্জস্য করে, পৃষ্ঠার উপাদানগুলি আঁকতে এবং একাধিক পৃষ্ঠায় মুদ্রণ পরিচালনা করে।

এই পাঠটি আপনাকে দেখায় কিভাবে আপনি মুদ্রণ পরিচালকের সাথে সংযোগ স্থাপন করেন, একটি মুদ্রণ অ্যাডাপ্টার তৈরি করেন এবং মুদ্রণের জন্য সামগ্রী তৈরি করেন।

যখন আপনার অ্যাপ্লিকেশন সরাসরি মুদ্রণ প্রক্রিয়া পরিচালনা করে, তখন আপনার ব্যবহারকারীর কাছ থেকে একটি মুদ্রণ অনুরোধ পাওয়ার পর প্রথম ধাপ হল Android প্রিন্ট ফ্রেমওয়ার্কের সাথে সংযোগ করা এবং PrintManager ক্লাসের একটি উদাহরণ প্রাপ্ত করা। এই ক্লাসটি আপনাকে একটি মুদ্রণ কাজ শুরু করতে এবং মুদ্রণ জীবনচক্র শুরু করতে দেয়। নিম্নলিখিত কোড উদাহরণ দেখায় কিভাবে প্রিন্ট ম্যানেজার পাবেন এবং মুদ্রণ প্রক্রিয়া শুরু করবেন।

কোটলিন

private fun doPrint() {
    activity?.also { context ->
        // Get a PrintManager instance
        val printManager = context.getSystemService(Context.PRINT_SERVICE) as PrintManager
        // Set job name, which will be displayed in the print queue
        val jobName = "${context.getString(R.string.app_name)} Document"
        // Start a print job, passing in a PrintDocumentAdapter implementation
        // to handle the generation of a print document
        printManager.print(jobName, MyPrintDocumentAdapter(context), null)
    }
}

জাভা

private void doPrint() {
    // Get a PrintManager instance
    PrintManager printManager = (PrintManager) getActivity()
            .getSystemService(Context.PRINT_SERVICE);

    // Set job name, which will be displayed in the print queue
    String jobName = getActivity().getString(R.string.app_name) + " Document";

    // Start a print job, passing in a PrintDocumentAdapter implementation
    // to handle the generation of a print document
    printManager.print(jobName, new MyPrintDocumentAdapter(getActivity()),
            null); //
}

উপরের উদাহরণ কোডটি প্রদর্শন করে যে কীভাবে একটি প্রিন্ট কাজের নাম দিতে হয় এবং PrintDocumentAdapter ক্লাসের একটি উদাহরণ সেট করে যা মুদ্রণের জীবনচক্রের পদক্ষেপগুলি পরিচালনা করে। প্রিন্ট অ্যাডাপ্টার ক্লাসের বাস্তবায়ন পরবর্তী বিভাগে আলোচনা করা হয়েছে।

দ্রষ্টব্য: print() পদ্ধতির শেষ প্যারামিটারটি একটি PrintAttributes অবজেক্ট নেয়। আপনি পূর্ববর্তী মুদ্রণ চক্রের উপর ভিত্তি করে প্রিন্টিং ফ্রেমওয়ার্ক এবং প্রি-সেট বিকল্পগুলিতে ইঙ্গিত প্রদান করতে এই প্যারামিটারটি ব্যবহার করতে পারেন, যার ফলে ব্যবহারকারীর অভিজ্ঞতা উন্নত হয়। আপনি এই প্যারামিটারটি মুদ্রিত সামগ্রীর জন্য আরও উপযুক্ত বিকল্পগুলি সেট করতেও ব্যবহার করতে পারেন, যেমন সেই অভিযোজনে থাকা একটি ফটো মুদ্রণের সময় ল্যান্ডস্কেপে অভিযোজন সেট করা।

একটি প্রিন্ট অ্যাডাপ্টার অ্যান্ড্রয়েড প্রিন্ট ফ্রেমওয়ার্কের সাথে ইন্টারঅ্যাক্ট করে এবং মুদ্রণ প্রক্রিয়ার ধাপগুলি পরিচালনা করে। এই প্রক্রিয়াটির জন্য ব্যবহারকারীদের মুদ্রণের জন্য একটি নথি তৈরি করার আগে প্রিন্টার এবং মুদ্রণ বিকল্পগুলি নির্বাচন করতে হবে। এই নির্বাচনগুলি চূড়ান্ত আউটপুটকে প্রভাবিত করতে পারে কারণ ব্যবহারকারী বিভিন্ন আউটপুট ক্ষমতা, বিভিন্ন পৃষ্ঠার আকার বা বিভিন্ন পৃষ্ঠার অভিযোজন সহ প্রিন্টার বেছে নেয়। যেহেতু এই নির্বাচনগুলি করা হয়, প্রিন্ট ফ্রেমওয়ার্ক চূড়ান্ত আউটপুটের প্রস্তুতির জন্য আপনার অ্যাডাপ্টারকে একটি মুদ্রণ নথি তৈরি করতে এবং তৈরি করতে বলে। একবার একজন ব্যবহারকারী মুদ্রণ বোতামে ট্যাপ করলে, ফ্রেমওয়ার্ক চূড়ান্ত মুদ্রণ নথিটি নেয় এবং আউটপুটের জন্য এটি একটি মুদ্রণ প্রদানকারীর কাছে প্রেরণ করে। মুদ্রণ প্রক্রিয়া চলাকালীন, ব্যবহারকারীরা মুদ্রণ ক্রিয়া বাতিল করতে বেছে নিতে পারেন, তাই আপনার মুদ্রণ অ্যাডাপ্টারকে অবশ্যই বাতিলের অনুরোধ শুনতে হবে এবং প্রতিক্রিয়া জানাতে হবে।

PrintDocumentAdapter বিমূর্ত শ্রেণীটি মুদ্রণ জীবনচক্র পরিচালনা করার জন্য ডিজাইন করা হয়েছে, যার চারটি প্রধান কলব্যাক পদ্ধতি রয়েছে। প্রিন্ট ফ্রেমওয়ার্কের সাথে সঠিকভাবে ইন্টারঅ্যাক্ট করার জন্য আপনাকে অবশ্যই আপনার প্রিন্ট অ্যাডাপ্টারে এই পদ্ধতিগুলি প্রয়োগ করতে হবে:

  • onStart() - মুদ্রণ প্রক্রিয়ার শুরুতে একবার কল করা হয়। আপনার অ্যাপ্লিকেশানের যদি কোনো এক-সময়ের প্রস্তুতির কাজ থাকে, যেমন প্রিন্ট করার জন্য ডেটার স্ন্যাপশট নেওয়া, সেগুলি এখানে সম্পাদন করুন। আপনার অ্যাডাপ্টারে এই পদ্ধতিটি প্রয়োগ করার প্রয়োজন নেই।
  • onLayout() - প্রতিবার যখন একজন ব্যবহারকারী একটি মুদ্রণ সেটিং পরিবর্তন করে যা আউটপুটকে প্রভাবিত করে, যেমন একটি ভিন্ন পৃষ্ঠার আকার, বা পৃষ্ঠার অভিযোজন, আপনার অ্যাপ্লিকেশনকে প্রিন্ট করা পৃষ্ঠাগুলির বিন্যাস গণনা করার সুযোগ দেয় কল করা হয়। ন্যূনতম, এই পদ্ধতিটি অবশ্যই মুদ্রিত নথিতে কতগুলি পৃষ্ঠা প্রত্যাশিত হবে তা ফেরত দিতে হবে৷
  • onWrite() - মুদ্রিত পৃষ্ঠাগুলিকে প্রিন্ট করার জন্য একটি ফাইলে রেন্ডার করতে বলা হয়। প্রতিটি onLayout() কলের পরে এই পদ্ধতিটি এক বা একাধিকবার কল করা যেতে পারে।
  • onFinish() - মুদ্রণ প্রক্রিয়া শেষে একবার কল করা হয়। আপনার অ্যাপ্লিকেশানের যদি কোনো এক-কালীন টিয়ার-ডাউন কাজ থাকে, সেগুলি এখানে সম্পাদন করুন৷ আপনার অ্যাডাপ্টারে এই পদ্ধতিটি প্রয়োগ করার প্রয়োজন নেই।

নিম্নলিখিত বিভাগগুলি লেআউট এবং লেখার পদ্ধতিগুলি কীভাবে বাস্তবায়ন করতে হয় তা বর্ণনা করে, যা একটি মুদ্রণ অ্যাডাপ্টারের কার্যকারিতার জন্য গুরুত্বপূর্ণ।

দ্রষ্টব্য: এই অ্যাডাপ্টার পদ্ধতিগুলি আপনার অ্যাপ্লিকেশনের মূল থ্রেডে বলা হয়েছে। যদি আপনি আশা করেন যে আপনার বাস্তবায়নে এই পদ্ধতিগুলি কার্যকর করতে একটি উল্লেখযোগ্য পরিমাণ সময় লাগবে, তাহলে একটি পৃথক থ্রেডের মধ্যে চালানোর জন্য সেগুলি বাস্তবায়ন করুন। উদাহরণস্বরূপ, আপনি আলাদা AsyncTask অবজেক্টে লেআউট বা প্রিন্ট ডকুমেন্ট লেখার কাজকে এনক্যাপসুলেট করতে পারেন।

মুদ্রণ নথি তথ্য গণনা

PrintDocumentAdapter ক্লাসের একটি বাস্তবায়নের মধ্যে, আপনার অ্যাপ্লিকেশনটি অবশ্যই যে ধরনের নথি তৈরি করছে তা নির্দিষ্ট করতে সক্ষম হতে হবে এবং মুদ্রিত পৃষ্ঠার আকার সম্পর্কে তথ্য দিয়ে প্রিন্ট কাজের জন্য মোট পৃষ্ঠার সংখ্যা গণনা করতে হবে। অ্যাডাপ্টারে onLayout() পদ্ধতির বাস্তবায়ন এই গণনাগুলি করে এবং একটি PrintDocumentInfo ক্লাসে প্রিন্ট কাজের প্রত্যাশিত আউটপুট সম্পর্কে তথ্য প্রদান করে, যার মধ্যে পৃষ্ঠার সংখ্যা এবং বিষয়বস্তুর প্রকার। নিম্নলিখিত কোড উদাহরণ একটি PrintDocumentAdapter জন্য onLayout() পদ্ধতির একটি মৌলিক বাস্তবায়ন দেখায়:

কোটলিন

override fun onLayout(
        oldAttributes: PrintAttributes?,
        newAttributes: PrintAttributes,
        cancellationSignal: CancellationSignal?,
        callback: LayoutResultCallback,
        extras: Bundle?
) {
    // Create a new PdfDocument with the requested page attributes
    pdfDocument = PrintedPdfDocument(activity, newAttributes)

    // Respond to cancellation request
    if (cancellationSignal?.isCanceled == true) {
        callback.onLayoutCancelled()
        return
    }

    // Compute the expected number of printed pages
    val pages = computePageCount(newAttributes)

    if (pages > 0) {
        // Return print information to print framework
        PrintDocumentInfo.Builder("print_output.pdf")
                .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
                .setPageCount(pages)
                .build()
                .also { info ->
                    // Content layout reflow is complete
                    callback.onLayoutFinished(info, true)
                }
    } else {
        // Otherwise report an error to the print framework
        callback.onLayoutFailed("Page count calculation failed.")
    }
}

জাভা

@Override
public void onLayout(PrintAttributes oldAttributes,
                     PrintAttributes newAttributes,
                     CancellationSignal cancellationSignal,
                     LayoutResultCallback callback,
                     Bundle metadata) {
    // Create a new PdfDocument with the requested page attributes
    pdfDocument = new PrintedPdfDocument(getActivity(), newAttributes);

    // Respond to cancellation request
    if (cancellationSignal.isCanceled() ) {
        callback.onLayoutCancelled();
        return;
    }

    // Compute the expected number of printed pages
    int pages = computePageCount(newAttributes);

    if (pages > 0) {
        // Return print information to print framework
        PrintDocumentInfo info = new PrintDocumentInfo
                .Builder("print_output.pdf")
                .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
                .setPageCount(pages)
                .build();
        // Content layout reflow is complete
        callback.onLayoutFinished(info, true);
    } else {
        // Otherwise report an error to the print framework
        callback.onLayoutFailed("Page count calculation failed.");
    }
}

onLayout() পদ্ধতির সম্পাদনের তিনটি ফলাফল থাকতে পারে: সমাপ্তি, বাতিলকরণ বা ব্যর্থতা যেখানে লেআউটের গণনা সম্পূর্ণ করা যায় না। PrintDocumentAdapter.LayoutResultCallback অবজেক্টের উপযুক্ত পদ্ধতিতে কল করে আপনাকে অবশ্যই এই ফলাফলগুলির একটি নির্দেশ করতে হবে।

দ্রষ্টব্য: onLayoutFinished() পদ্ধতির বুলিয়ান প্যারামিটারটি নির্দেশ করে যে লেআউট সামগ্রীটি শেষ অনুরোধের পর থেকে আসলেই পরিবর্তিত হয়েছে কিনা। এই প্যারামিটারটি সঠিকভাবে সেট করা প্রিন্ট ফ্রেমওয়ার্ককে অপ্রয়োজনীয়ভাবে onWrite() পদ্ধতিতে কল করা এড়াতে দেয়, মূলত পূর্বে লিখিত মুদ্রণ নথি ক্যাশ করে এবং কর্মক্ষমতা উন্নত করে।

onLayout() এর প্রধান কাজ হল প্রিন্টারের বৈশিষ্ট্য অনুযায়ী আউটপুট হিসাবে প্রত্যাশিত পৃষ্ঠার সংখ্যা গণনা করা। আপনি কীভাবে এই সংখ্যাটি গণনা করবেন তা আপনার অ্যাপ্লিকেশনটি মুদ্রণের জন্য পৃষ্ঠাগুলি কীভাবে তৈরি করে তার উপর নির্ভর করে। নিম্নলিখিত কোড উদাহরণটি একটি বাস্তবায়ন দেখায় যেখানে পৃষ্ঠার সংখ্যা মুদ্রণ অভিযোজন দ্বারা নির্ধারিত হয়:

কোটলিন

private fun computePageCount(printAttributes: PrintAttributes): Int {
    var itemsPerPage = 4 // default item count for portrait mode

    val pageSize = printAttributes.mediaSize
    if (!pageSize.isPortrait) {
        // Six items per page in landscape orientation
        itemsPerPage = 6
    }

    // Determine number of print items
    val printItemCount: Int = getPrintItemCount()

    return Math.ceil((printItemCount / itemsPerPage.toDouble())).toInt()
}

জাভা

private int computePageCount(PrintAttributes printAttributes) {
    int itemsPerPage = 4; // default item count for portrait mode

    MediaSize pageSize = printAttributes.getMediaSize();
    if (!pageSize.isPortrait()) {
        // Six items per page in landscape orientation
        itemsPerPage = 6;
    }

    // Determine number of print items
    int printItemCount = getPrintItemCount();

    return (int) Math.ceil(printItemCount / itemsPerPage);
}

একটি প্রিন্ট ডকুমেন্ট ফাইল লিখুন

যখন একটি ফাইলে প্রিন্ট আউটপুট লেখার সময় হয়, তখন Android প্রিন্ট ফ্রেমওয়ার্ক আপনার অ্যাপ্লিকেশনের PrintDocumentAdapter ক্লাসের onWrite() পদ্ধতিকে কল করে। পদ্ধতির পরামিতিগুলি নির্দিষ্ট করে যে কোন পৃষ্ঠাগুলি লিখতে হবে এবং আউটপুট ফাইল ব্যবহার করতে হবে। এই পদ্ধতির আপনার বাস্তবায়নের জন্য অবশ্যই একটি বহু-পৃষ্ঠা পিডিএফ ডকুমেন্ট ফাইলে সামগ্রীর প্রতিটি অনুরোধ করা পৃষ্ঠা রেন্ডার করতে হবে। এই প্রক্রিয়াটি সম্পূর্ণ হলে, আপনি কলব্যাক অবজেক্টের onWriteFinished() পদ্ধতিতে কল করুন।

দ্রষ্টব্য: Android প্রিন্ট ফ্রেমওয়ার্ক onLayout() এ প্রতি কলের জন্য onWrite() পদ্ধতিতে এক বা একাধিকবার কল করতে পারে। এই কারণে, প্রিন্ট ডকুমেন্টের অপ্রয়োজনীয় পুনঃলিখন এড়াতে, প্রিন্ট কন্টেন্ট লেআউট পরিবর্তন না হলে, onLayoutFinished() পদ্ধতির বুলিয়ান প্যারামিটার false সেট করা গুরুত্বপূর্ণ।

দ্রষ্টব্য: onLayoutFinished() পদ্ধতির বুলিয়ান প্যারামিটারটি নির্দেশ করে যে লেআউট সামগ্রীটি শেষ অনুরোধের পর থেকে আসলেই পরিবর্তিত হয়েছে কিনা। এই প্যারামিটারটি সঠিকভাবে সেট করা প্রিন্ট ফ্রেমওয়ার্ককে অপ্রয়োজনীয়ভাবে onLayout() পদ্ধতিতে কল করা এড়াতে অনুমতি দেয়, মূলত পূর্বে লিখিত মুদ্রণ নথি ক্যাশ করে এবং কর্মক্ষমতা উন্নত করে।

নিম্নলিখিত নমুনাটি একটি PDF ফাইল তৈরি করতে PrintedPdfDocument ক্লাস ব্যবহার করে এই প্রক্রিয়াটির মৌলিক মেকানিক্স প্রদর্শন করে:

কোটলিন

override fun onWrite(
        pageRanges: Array<out PageRange>,
        destination: ParcelFileDescriptor,
        cancellationSignal: CancellationSignal?,
        callback: WriteResultCallback
) {
    // Iterate over each page of the document,
    // check if it's in the output range.
    for (i in 0 until totalPages) {
        // 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?.startPage(i)?.also { page ->

                // check for cancellation
                if (cancellationSignal?.isCanceled == true) {
                    callback.onWriteCancelled()
                    pdfDocument?.close()
                    pdfDocument = null
                    return
                }

                // Draw page content for printing
                drawPage(page)

                // Rendering is complete, so page can be finalized.
                pdfDocument?.finishPage(page)
            }
        }
    }

    // Write PDF document to file
    try {
        pdfDocument?.writeTo(FileOutputStream(destination.fileDescriptor))
    } catch (e: IOException) {
        callback.onWriteFailed(e.toString())
        return
    } finally {
        pdfDocument?.close()
        pdfDocument = null
    }
    val writtenPages = computeWrittenPages()
    // Signal the print framework the document is complete
    callback.onWriteFinished(writtenPages)

    ...
}

জাভা

@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 = pdfDocument.startPage(i);

            // check for cancellation
            if (cancellationSignal.isCanceled()) {
                callback.onWriteCancelled();
                pdfDocument.close();
                pdfDocument = null;
                return;
            }

            // Draw page content for printing
            drawPage(page);

            // Rendering is complete, so page can be finalized.
            pdfDocument.finishPage(page);
        }
    }

    // Write PDF document to file
    try {
        pdfDocument.writeTo(new FileOutputStream(
                destination.getFileDescriptor()));
    } catch (IOException e) {
        callback.onWriteFailed(e.toString());
        return;
    } finally {
        pdfDocument.close();
        pdfDocument = null;
    }
    PageRange[] writtenPages = computeWrittenPages();
    // Signal the print framework the document is complete
    callback.onWriteFinished(writtenPages);

    ...
}

এই নমুনাটি PDF পৃষ্ঠার বিষয়বস্তুকে drawPage() পদ্ধতিতে উপস্থাপন করে, যা পরবর্তী বিভাগে আলোচনা করা হয়েছে।

লেআউটের মতো, onWrite() পদ্ধতির সম্পাদনের তিনটি ফলাফল হতে পারে: সমাপ্তি, বাতিলকরণ বা ব্যর্থতা যেখানে বিষয়বস্তু লেখা যাবে না। PrintDocumentAdapter.WriteResultCallback অবজেক্টের উপযুক্ত পদ্ধতিতে কল করে আপনাকে অবশ্যই এই ফলাফলগুলির একটি নির্দেশ করতে হবে।

দ্রষ্টব্য: মুদ্রণের জন্য একটি নথি রেন্ডার করা একটি সম্পদ-নিবিড় অপারেশন হতে পারে। আপনার অ্যাপ্লিকেশনের প্রধান ইউজার ইন্টারফেস থ্রেড ব্লক করা এড়াতে, আপনাকে একটি পৃথক থ্রেডে পৃষ্ঠা রেন্ডারিং এবং লেখার ক্রিয়াকলাপ সম্পাদন করার কথা বিবেচনা করা উচিত, উদাহরণস্বরূপ একটি AsyncTask এ। অ্যাসিঙ্ক্রোনাস টাস্কের মতো এক্সিকিউশন থ্রেডগুলির সাথে কাজ করার বিষয়ে আরও তথ্যের জন্য, প্রসেস এবং থ্রেডগুলি দেখুন।

পিডিএফ পৃষ্ঠা বিষয়বস্তু অঙ্কন

যখন আপনার অ্যাপ্লিকেশান প্রিন্ট করে, আপনার অ্যাপ্লিকেশনটিকে অবশ্যই একটি PDF নথি তৈরি করতে হবে এবং মুদ্রণের জন্য এটিকে Android প্রিন্ট ফ্রেমওয়ার্কে পাস করতে হবে৷ আপনি এই উদ্দেশ্যে যেকোনো PDF প্রজন্মের লাইব্রেরি ব্যবহার করতে পারেন। এই পাঠটি দেখায় কিভাবে আপনার বিষয়বস্তু থেকে PDF পৃষ্ঠা তৈরি করতে PrintedPdfDocument ক্লাস ব্যবহার করতে হয়।

PrintedPdfDocument ক্লাস একটি পিডিএফ পৃষ্ঠায় উপাদান আঁকার জন্য একটি Canvas অবজেক্ট ব্যবহার করে, যেমন একটি কার্যকলাপ বিন্যাসে আঁকার মতো। আপনি Canvas ড্র পদ্ধতি ব্যবহার করে মুদ্রিত পৃষ্ঠায় উপাদান আঁকতে পারেন। নিম্নলিখিত উদাহরণ কোড প্রদর্শন করে কিভাবে এই পদ্ধতিগুলি ব্যবহার করে একটি PDF নথি পৃষ্ঠায় কিছু সাধারণ উপাদান আঁকতে হয়:

কোটলিন

private fun drawPage(page: PdfDocument.Page) {
    page.canvas.apply {

        // units are in points (1/72 of an inch)
        val titleBaseLine = 72f
        val leftMargin = 54f

        val paint = Paint()
        paint.color = Color.BLACK
        paint.textSize = 36f
        drawText("Test Title", leftMargin, titleBaseLine, paint)

        paint.textSize = 11f
        drawText("Test paragraph", leftMargin, titleBaseLine + 25, paint)

        paint.color = Color.BLUE
        drawRect(100f, 100f, 172f, 172f, paint)
    }
}

জাভা

private void drawPage(PdfDocument.Page page) {
    Canvas canvas = page.getCanvas();

    // units are in points (1/72 of an inch)
    int titleBaseLine = 72;
    int leftMargin = 54;

    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTextSize(36);
    canvas.drawText("Test Title", leftMargin, titleBaseLine, paint);

    paint.setTextSize(11);
    canvas.drawText("Test paragraph", leftMargin, titleBaseLine + 25, paint);

    paint.setColor(Color.BLUE);
    canvas.drawRect(100, 100, 172, 172, paint);
}

পিডিএফ পৃষ্ঠায় আঁকার জন্য Canvas ব্যবহার করার সময়, উপাদানগুলি পয়েন্টে নির্দিষ্ট করা হয়, যা এক ইঞ্চির 1/72। নিশ্চিত করুন যে আপনি পৃষ্ঠায় উপাদানগুলির আকার নির্দিষ্ট করার জন্য পরিমাপের এই এককটি ব্যবহার করছেন। অঙ্কিত উপাদানগুলির অবস্থানের জন্য, পৃষ্ঠার উপরের বাম কোণে স্থানাঙ্ক সিস্টেমটি 0,0 এ শুরু হয়।

টিপ: যদিও Canvas অবজেক্ট আপনাকে একটি PDF নথির প্রান্তে মুদ্রণ উপাদানগুলি স্থাপন করতে দেয়, অনেক প্রিন্টার কাগজের প্রকৃত অংশের প্রান্তে মুদ্রণ করতে সক্ষম হয় না। আপনি যখন এই শ্রেণীর সাথে একটি মুদ্রণ নথি তৈরি করেন তখন নিশ্চিত করুন যে আপনি পৃষ্ঠার অমুদ্রণযোগ্য প্রান্তগুলির জন্য অ্যাকাউন্ট করেছেন৷