簡體   English   中英

以編程方式在android中創建一個pdf文件並在其中寫入

[英]Creating a pdf file in android programmatically and writing in it

我正在嘗試在我的應用程序中創建一個 pdf 文件,將其保存在外部存儲中並打開它。 保存文件對我來說不是問題,打開文件也不是問題,我的問題是創建一個文件並在其中寫入。 因此,經過一些在線研究后,我發現了以下方法:

        File file = new File(directoryName, fileName);

        // Creating output stream to write in the newly created file
        FileOutputStream fOut = null;

        try {
            fOut = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // Creating a new document
        Document document = new Document(PageSize.A4, 50, 50, 50, 50);

        try {
            PdfWriter.getInstance(document, fOut);

            // Open the document for writing
            document.open();

            // Write in the document
            document.add(new Paragraph("Hello world"));
            document.close();

        } catch(DocumentException de) {
            System.err.println(de.getMessage());
        }

運行我的應用程序並執行上面的代碼后,我收到以下錯誤:

java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/Color;

有人會知道我的代碼有什么問題,或者知道另一種肯定適用於創建和編寫 pdf 文件的方法嗎?

謝謝 !

所以顯然我使用的代碼與 android 不兼容,因此我得到了錯誤。 您將在下面找到實際運行的正確代碼(用於創建 pdf 文件、在其中放入一些內容、保存並打開新創建的文件):

PS:為此,您需要將iTextG的 jar 添加到您的項目中:

// Method for creating a pdf file from text, saving it then opening it for display
    public void createandDisplayPdf(String text) {

        Document doc = new Document();

        try {
            String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Dir";

            File dir = new File(path);
            if(!dir.exists())
                dir.mkdirs();

            File file = new File(dir, "newFile.pdf");
            FileOutputStream fOut = new FileOutputStream(file);

            PdfWriter.getInstance(doc, fOut);

            //open the document
            doc.open();

            Paragraph p1 = new Paragraph(text);
            Font paraFont= new Font(Font.COURIER);
            p1.setAlignment(Paragraph.ALIGN_CENTER);
            p1.setFont(paraFont);

            //add paragraph to document
            doc.add(p1);    

        } catch (DocumentException de) {
            Log.e("PDFCreator", "DocumentException:" + de);
        } catch (IOException e) {
            Log.e("PDFCreator", "ioException:" + e);
        }
        finally {
            doc.close();
        }

        viewPdf("newFile.pdf", "Dir");
    }

    // Method for opening a pdf file
    private void viewPdf(String file, String directory) {

        File pdfFile = new File(Environment.getExternalStorageDirectory() + "/" + directory + "/" + file);
        Uri path = Uri.fromFile(pdfFile);

        // Setting the intent for pdf reader
        Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
        pdfIntent.setDataAndType(path, "application/pdf");
        pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        try {
            startActivity(pdfIntent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(TableActivity.this, "Can't read pdf file", Toast.LENGTH_SHORT).show();
        }
    }

PdfDocument類允許從原生 Android 內容生成 PDF 文檔。 通過使用這個類,我們可以創建 pdf 並使用PdfRenderer打開它。 創建pdf文件的示例代碼

 public void stringtopdf(String data)  {
    String extstoragedir = Environment.getExternalStorageDirectory().toString();
    File fol = new File(extstoragedir, "pdf");
    File folder=new File(fol,"pdf");
    if(!folder.exists()) {
        boolean bool = folder.mkdir();
    }
    try {
        final File file = new File(folder, "sample.pdf");
        file.createNewFile();
        FileOutputStream fOut = new FileOutputStream(file);


        PdfDocument document = new PdfDocument();
        PdfDocument.PageInfo pageInfo = new 
        PdfDocument.PageInfo.Builder(100, 100, 1).create();
        PdfDocument.Page page = document.startPage(pageInfo);
        Canvas canvas = page.getCanvas();
        Paint paint = new Paint();

        canvas.drawText(data, 10, 10, paint);



        document.finishPage(page);
        document.writeTo(fOut);
        document.close();

    }catch (IOException e){
        Log.i("error",e.getLocalizedMessage());
    }

從這里下載源代碼( 以編程方式在 android 中創建 pdf 文件

活動_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_generate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Generate PDF" />

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:id="@+id/ll_pdflayout"
        android:background="#ffffff"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/iv_image"
            android:src="@drawable/image"
            android:layout_width="300dp"
            android:scaleType="fitXY"
            android:layout_marginTop="10dp"
            android:layout_gravity="center"
            android:layout_height="250dp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14dp"
            android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
            android:layout_marginTop="10dp"
            android:gravity="center"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:textColor="#000000"/>


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv_link"
            android:textSize="10dp"
            android:textColor="#000000"/>


    </LinearLayout>

</LinearLayout>

主活動.java

package com.deepshikha.generatepdf;

import android.Manifest;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.pdf.PdfDocument;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    Button btn_generate;
    TextView tv_link;
    ImageView iv_image;
    LinearLayout ll_pdflayout;
    public static int REQUEST_PERMISSIONS = 1;
    boolean boolean_permission;
    boolean boolean_save;
    Bitmap bitmap;
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        fn_permission();
        listener();
    }


    private void init(){
        btn_generate = (Button)findViewById(R.id.btn_generate);
        tv_link = (TextView)findViewById(R.id.tv_link);
        iv_image = (ImageView) findViewById(R.id.iv_image);
        ll_pdflayout = (LinearLayout) findViewById(R.id.ll_pdflayout);

    }

    private void listener(){
        btn_generate.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.btn_generate:

                if (boolean_save) {
                    Intent intent = new Intent(getApplicationContext(), PDFViewActivity.class);
                    startActivity(intent);

                } else {
                    if (boolean_permission) {
                        progressDialog = new ProgressDialog(MainActivity.this);
                        progressDialog.setMessage("Please wait");
                         bitmap = loadBitmapFromView(ll_pdflayout, ll_pdflayout.getWidth(), ll_pdflayout.getHeight());
                        createPdf();
//                        saveBitmap(bitmap);
                    } else {

                    }

                    createPdf();
                    break;
                }
        }
    }

    private void createPdf(){
        WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        DisplayMetrics displaymetrics = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        float hight = displaymetrics.heightPixels ;
        float width = displaymetrics.widthPixels ;

        int convertHighet = (int) hight, convertWidth = (int) width;

//        Resources mResources = getResources();
//        Bitmap bitmap = BitmapFactory.decodeResource(mResources, R.drawable.screenshot);

        PdfDocument document = new PdfDocument();
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(convertWidth, convertHighet, 1).create();
        PdfDocument.Page page = document.startPage(pageInfo);

        Canvas canvas = page.getCanvas();


        Paint paint = new Paint();
        canvas.drawPaint(paint);


        bitmap = Bitmap.createScaledBitmap(bitmap, convertWidth, convertHighet, true);

        paint.setColor(Color.BLUE);
        canvas.drawBitmap(bitmap, 0, 0 , null);
        document.finishPage(page);


       String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() + "/PdfTett/";
    File dir = new File(path);
    if (!dir.exists())
        dir.mkdirs();

    File filePath = new File(dir,"Testtt.pdf");

        try {
            document.writeTo(new FileOutputStream(filePath));
            btn_generate.setText("Check PDF");
            boolean_save=true;
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "Something wrong: " + e.toString(), Toast.LENGTH_LONG).show();
        }

        // close the document
        document.close();
    }



    public static Bitmap loadBitmapFromView(View v, int width, int height) {
        Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        v.draw(c);

        return b;
    }

    private void fn_permission() {
        if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)||
                (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {

            if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) {
            } else {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
                        REQUEST_PERMISSIONS);

            }

            if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))) {
            } else {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        REQUEST_PERMISSIONS);

            }
        } else {
            boolean_permission = true;


        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_PERMISSIONS) {

            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                boolean_permission = true;


            } else {
                Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show();

            }
        }
    }


}

謝謝!

你可以使用波紋管之類的。

pdf 會喜歡波紋管..

在此處輸入圖片說明

  1. 活動_main.xml

<Button
    android:id="@+id/btnCreatePdf"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Create PDF" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:singleLine="true"
        android:text="Thank You!"
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
        android:textSize="20sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tv_sub_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:singleLine="true"
        android:text="Your transaction is successful"
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
        android:textSize="16sp" />

</LinearLayout>

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="#e6e6e6" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:id="@+id/tv_location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Location" />

    <TextView
        android:id="@+id/tv_city"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"
        android:text="Dhaka"
        android:textStyle="bold" />

</LinearLayout>
  1. 主要活動

     public class MainActivity extends AppCompatActivity { Button btnCreatePdf; TextView tv_title; TextView tv_sub_title; TextView tv_location; TextView tv_city; String file_name_path = ""; int PERMISSION_ALL = 1; String[] PERMISSIONS = { android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE, }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); if (!hasPermissions(MainActivity.this, PERMISSIONS)) { ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS, PERMISSION_ALL); } File file = new File(this.getExternalFilesDir(null).getAbsolutePath(), "pdfsdcard_location"); if (!file.exists()) { file.mkdir(); } btnCreatePdf = findViewById(R.id.btnCreatePdf); tv_title = findViewById(R.id.tv_title); tv_sub_title = findViewById(R.id.tv_sub_title); tv_location = findViewById(R.id.tv_location); tv_city = findViewById(R.id.tv_city); btnCreatePdf.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { createpdf(); } }); } public void createpdf() { Rect bounds = new Rect(); int pageWidth = 300; int pageheight = 470; int pathHeight = 2; final String fileName = "mypdf"; file_name_path = "/pdfsdcard_location/" + fileName + ".pdf"; PdfDocument myPdfDocument = new PdfDocument(); Paint paint = new Paint(); Paint paint2 = new Paint(); Path path = new Path(); PdfDocument.PageInfo myPageInfo = new PdfDocument.PageInfo.Builder(pageWidth, pageheight, 1).create(); PdfDocument.Page documentPage = myPdfDocument.startPage(myPageInfo); Canvas canvas = documentPage.getCanvas(); int y = 25; // x = 10, int x = 10; paint.getTextBounds(tv_title.getText().toString(), 0, tv_title.getText().toString().length(), bounds); x = (canvas.getWidth() / 2) - (bounds.width() / 2); canvas.drawText(tv_title.getText().toString(), x, y, paint); paint.getTextBounds(tv_sub_title.getText().toString(), 0, tv_sub_title.getText().toString().length(), bounds); x = (canvas.getWidth() / 2) - (bounds.width() / 2); y += paint.descent() - paint.ascent(); canvas.drawText(tv_sub_title.getText().toString(), x, y, paint); y += paint.descent() - paint.ascent(); canvas.drawText("", x, y, paint); //horizontal line path.lineTo(pageWidth, pathHeight); paint2.setColor(Color.GRAY); paint2.setStyle(Paint.Style.STROKE); path.moveTo(x, y); canvas.drawLine(0, y, pageWidth, y, paint2); //blank space y += paint.descent() - paint.ascent(); canvas.drawText("", x, y, paint); y += paint.descent() - paint.ascent(); x = 10; canvas.drawText(tv_location.getText().toString(), x, y, paint); y += paint.descent() - paint.ascent(); x = 10; canvas.drawText(tv_city.getText().toString(), x, y, paint); //blank space y += paint.descent() - paint.ascent(); canvas.drawText("", x, y, paint); //horizontal line path.lineTo(pageWidth, pathHeight); paint2.setColor(Color.GRAY); paint2.setStyle(Paint.Style.STROKE); path.moveTo(x, y); canvas.drawLine(0, y, pageWidth, y, paint2); //blank space y += paint.descent() - paint.ascent(); canvas.drawText("", x, y, paint); Resources res = getResources(); Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.logo); Bitmap b = (Bitmap.createScaledBitmap(bitmap, 100, 50, false)); canvas.drawBitmap(b, x, y, paint); y += 25; canvas.drawText(getString(R.string.app_name), 120, y, paint); myPdfDocument.finishPage(documentPage); File file = new File(this.getExternalFilesDir(null).getAbsolutePath() + file_name_path); try { myPdfDocument.writeTo(new FileOutputStream(file)); } catch (IOException e) { e.printStackTrace(); } myPdfDocument.close(); viewPdfFile(); } public void viewPdfFile() { File file = new File(this.getExternalFilesDir(null).getAbsolutePath() + file_name_path); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/pdf"); startActivity(intent); } public static boolean hasPermissions(Context context, String... permissions) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { for (String permission : permissions) { if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { return false; } } } return true; } }
  2. 不要忘記在清單文件中添加波紋管權限

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  3. 完整源代碼從 GitHub 下載: https : //github.com/enamul95/CreatePdf.git

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM