{"id":1184,"date":"2022-03-18T04:42:41","date_gmt":"2022-03-18T04:42:41","guid":{"rendered":"https:\/\/es-andreabianchini.it\/andrewsblog\/?p=1184"},"modified":"2022-03-18T04:45:18","modified_gmt":"2022-03-18T04:45:18","slug":"pdf-rendering-in-android","status":"publish","type":"post","link":"https:\/\/es-andreabianchini.it\/andrewsblog\/?p=1184","title":{"rendered":"PDF rendering in Android"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Esempio di Android PdfRendererBasic<br>Questo esempio mostra come visualizzare un documento PDF sullo schermo usando PdfRenderer introdotto in Android 5.0 Lollipop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">introduzione<br>\u00c8 ora possibile eseguire il rendering di pagine di documenti PDF in immagini bitmap per la stampa utilizzando la nuova classe PdfRenderer. \u00c8 necessario specificare un ParcelFileDescriptor che \u00e8 ricercabile (ovvero, \u00e8 possibile accedere al contenuto in modo casuale) su cui il sistema scrive il contenuto stampabile. La tua app pu\u00f2 ottenere una pagina per il rendering con openPage(), quindi chiamare render() per trasformare PdfRenderer.Page aperto in una bitmap.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questo esempio carica il PDF dalle risorse. Il contenuto delle risorse \u00e8 compresso per impostazione predefinita e la classe PdfRenderer non pu\u00f2 aprirlo. In questo esempio, risolviamo questo problema copiando il file nella directory della cache.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prerequisiti<br>SDK Android 28<br>Strumenti di compilazione Android v28.0.3<br>Archivio di supporto Android<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Codice della classe principale per il rendering :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http:\/\/www.apache.org\/licenses\/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\/\n\npackage com.example.android.pdfrendererbasic;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.ImageView;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport androidx.lifecycle.LifecycleOwner;\nimport androidx.lifecycle.ViewModelProvider;\n\n\/**\n * This fragment has a big {@link ImageView} that shows PDF pages, and 2\n * {@link android.widget.Button}s to move between pages.\n *\/\npublic class PdfRendererBasicFragment extends Fragment {\n\n    private PdfRendererBasicViewModel mViewModel;\n\n    private final View.OnClickListener mOnClickListener = (view) -&gt; {\n        switch (view.getId()) {\n            case R.id.previous:\n                if (mViewModel != null) {\n                    mViewModel.showPrevious();\n                }\n                break;\n            case R.id.next:\n                if (mViewModel != null) {\n                    mViewModel.showNext();\n                }\n                break;\n        }\n    };\n\n    @Override\n    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.pdf_renderer_basic_fragment, container, false);\n    }\n\n    @Override\n    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {\n        \/\/ View references.\n        final ImageView image = view.findViewById(R.id.image);\n        final Button buttonPrevious = view.findViewById(R.id.previous);\n        final Button buttonNext = view.findViewById(R.id.next);\n\n        \/\/ Bind data.\n        mViewModel = new ViewModelProvider(this).get(PdfRendererBasicViewModel.class);\n        final LifecycleOwner viewLifecycleOwner = getViewLifecycleOwner();\n        mViewModel.getPageInfo().observe(viewLifecycleOwner, pageInfo -&gt; {\n            if (pageInfo == null) {\n                return;\n            }\n            final Activity activity = getActivity();\n            if (activity != null) {\n                activity.setTitle(getString(R.string.app_name_with_index,\n                        pageInfo.index + 1, pageInfo.count));\n            }\n        });\n        mViewModel.getPageBitmap().observe(viewLifecycleOwner, image::setImageBitmap);\n        mViewModel.getPreviousEnabled().observe(viewLifecycleOwner, buttonPrevious::setEnabled);\n        mViewModel.getNextEnabled().observe(viewLifecycleOwner, buttonNext::setEnabled);\n\n        \/\/ Bind events.\n        buttonPrevious.setOnClickListener(mOnClickListener);\n        buttonNext.setOnClickListener(mOnClickListener);\n    }\n\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Articolo integrale -> <a href=\"https:\/\/github.com\/android\/graphics-samples\/tree\/main\/PdfRendererBasic\" target=\"_blank\" rel=\"noreferrer noopener\">jarakiPdfRenderBasic<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esempio di Android PdfRendererBasicQuesto esempio mostra come visualizzare un documento PDF sullo schermo usando PdfRenderer introdotto in Android 5.0 Lollipop. introduzione\u00c8 ora possibile eseguire il rendering di pagine di documenti PDF in immagini bitmap per la stampa utilizzando la nuova classe PdfRenderer. \u00c8 necessario specificare un ParcelFileDescriptor che \u00e8 ricercabile (ovvero, \u00e8 possibile accedere al &hellip; <a href=\"https:\/\/es-andreabianchini.it\/andrewsblog\/?p=1184\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;PDF rendering in Android&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,7],"tags":[],"class_list":["post-1184","post","type-post","status-publish","format-standard","hentry","category-android","category-stem"],"_links":{"self":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts\/1184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1184"}],"version-history":[{"count":2,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts\/1184\/revisions"}],"predecessor-version":[{"id":1187,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts\/1184\/revisions\/1187"}],"wp:attachment":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}