在Android中利用iText生成PDF

jopen 10年前

iText 是java和C#中的一个处理PDF的开源类库,国外的大牛已经把它移植到Android上了,但是直接拿来用还是需要花费一点功夫,下面就用一个简单的demo来测试一下。

iText项目地址:https://code.google.com/p/droidtext/

首先用过svn把代码check下来。

在Android中利用iText生成PDF

 

得到三个文件夹,droidText是一个android的库工程,droidTextTest是测试工程。

 

在eclipse中导入droidText项目。这是个library project,后面创建的项目需要引用到。

 

然后创建一个Android工程-iTextTest

在工程中引用droidText:

Project->properties->Android->LIbrary:ADD

在Android中利用iText生成PDF

 

链接好之后就像上图。

 

主界面就一个Button,按下之后就开始生产PDF。

package com.example.itexttest;    import java.io.ByteArrayOutputStream;  import java.io.File;  import java.io.PrintStream;  import java.lang.reflect.Method;    import android.os.Bundle;  import android.os.Environment;  import android.app.Activity;  import android.view.Menu;  import android.view.View;  import android.widget.Button;  import android.widget.Toast;    public class ITextActivity extends Activity {   private Button mButton;     @Override   protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_itext);    mButton = (Button)findViewById(R.id.button1);    mButton.setOnClickListener(new OnClickListenerImpl());   }     private class OnClickListenerImpl implements View.OnClickListener   {      @Override    public void onClick(View arg0) {     // TODO Auto-generated method stub     //Toast.makeText(getApplicationContext(), "Run", Toast.LENGTH_SHORT).show();     // Create droidtext directory for storing results     File file = new File(       android.os.Environment.getExternalStorageDirectory()       + File.separator + "iTextTest");     if (!file.exists()) {      file.mkdir();     }     System.out.println("Click!");       Thread t = new Thread() {        public void run() {       int success = 0;       int count = 1;       String className = "com.example.itexttest.HelloWprld";         String result = null;       try {        // Set output streams to bytearray streams so we can        // display the output of examples        ByteArrayOutputStream bos = new ByteArrayOutputStream();        PrintStream errorStream = new PrintStream(bos, true);        System.setErr(errorStream);          ByteArrayOutputStream bos2 = new ByteArrayOutputStream();        PrintStream outStream = new PrintStream(bos2, true);        System.setOut(outStream);          // Find the main method        Class c = Class.forName(className);        Method main = c.getDeclaredMethod("main",String[].class);        System.out.println("GetMain"+main.getName());          // Emulate CLI parameters if necessary        String[] params = null;        if (className          .equals("com.lowagie.examples.objects.tables.pdfptable.FragmentTable")) {         params = new String[] { "3" };        } else if (className          .equals("com.lowagie.examples.objects.images.tiff.OddEven")) {         params = new String[] { "odd.tif", "even.tif",         "odd_even.tiff" };        } else if (className          .equals("com.lowagie.examples.objects.images.tiff.Tiff2Pdf")) {         params = new String[] { "tif_12.tif" };        } else if (className          .equals("com.lowagie.examples.objects.images.DvdCover")) {         params = new String[] { "dvdcover.pdf", "Title",           "0xff0000", "hitchcock.png" };        } else if (className          .equals("com.lowagie.examples.forms.ListFields")) {         params = new String[] {};        } else if (className          .equals("com.lowagie.examples.general.read.Info")) {         params = new String[] { "RomeoJuliet.pdf" };        } else if (className          .equals("com.lowagie.examples.objects.anchors.OpenApplication")) {         params = new String[] { "" };        }          main.invoke(null, (Object) params);          // Parse results        String string = new String(bos.toByteArray());        String string2 = new String(bos2.toByteArray());        if (string.length() > 0) {         result = "Failed: " + string;        } else if (string2.contains("Exception")) {         result = "Failed: " + string2;        } else if ("Images.pdf" != null) {         File pdf = new File(           Environment.getExternalStorageDirectory()           + File.separator + "iTextTest"           + File.separator           + "Images.pdf");         System.out.println("Create Pdf@");         if (!pdf.exists()) {          result = "Failed: Resulting pdf didn't get created";         } else if (pdf.length() <= 0) {          result = "Failed: Resulting pdf is empty";         } else {          success++;          result = "Successful";         }        } else {         success++;         result = "Successful";        }       } catch (Exception e) {        result = "Failed with exception: "          + e.getClass().getName() + ": "          + e.getMessage();        System.out.println(result);       }       if (result.startsWith("Failed")) {        System.out.println("Failed!");       } else {        System.out.println("Success!");       }       System.out.println(result);      }       };     t.start();    }     }    }

OnClick里面的代码有点小复杂,要用的的话直接粘就可以了,注意修改相应的变量名,classname对应对就是操作itext生产pdf的类。

 

在包里面再创建两个测试类:

HelloWorld.java

package com.example.itexttest;    import java.io.FileOutputStream;  import java.io.IOException;    import com.lowagie.text.Document;  import com.lowagie.text.DocumentException;  import com.lowagie.text.Paragraph;  import com.lowagie.text.pdf.PdfWriter;    /**   * Generates a simple 'Hello World' PDF file.   *    * @author blowagie   */    public class HelloWorld {            /**           * Generates a PDF file with the text 'Hello World'           *            * @param args           *            no arguments needed here           */          public static void main(String[] args) {                    System.out.println("Hello World");                    // step 1: creation of a document-object                  Document document = new Document();                  try {                          // step 2:                          // we create a writer that listens to the document                          // and directs a PDF-stream to a file                          PdfWriter.getInstance(document, new FileOutputStream(android.os.Environment.getExternalStorageDirectory() + java.io.File.separator + "iTextTest" + java.io.File.separator + "HelloWorld.pdf"));                            // step 3: we open the document                          document.open();                          // step 4: we add a paragraph to the document                          document.add(new Paragraph("Hello World"));                  } catch (DocumentException de) {                          System.err.println(de.getMessage());                  } catch (IOException ioe) {                          System.err.println(ioe.getMessage());                  }                    // step 5: we close the document                  document.close();          }  }

生产Pdf如下:

在Android中利用iText生成PDF

Rotating.java(创建图片,并旋转)

注意再sdcard的根目录里面放一张图片,改名jxk_run.png。

/*   * $Id: Rotating.java 3373 2008-05-12 16:21:24Z xlv $   *   * This code is part of the 'iText Tutorial'.   * You can find the complete tutorial at the following address:   * http://itextdocs.lowagie.com/tutorial/   *   * This code is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   *   * itext-questions@lists.sourceforge.net   */  package com.example.itexttest;    import java.io.ByteArrayOutputStream;  import java.io.FileOutputStream;  import java.io.IOException;  import com.example.itexttest.R;  import com.example.itexttest.ITextActivity;    import android.graphics.Bitmap;  import android.graphics.BitmapFactory;    import com.lowagie.text.Document;  import com.lowagie.text.DocumentException;  import com.lowagie.text.Image;  import com.lowagie.text.Paragraph;  import com.lowagie.text.pdf.PdfWriter;    /**   * Rotating images.   */  public class Rotating {   /**    * Rotating images.    *     * @param args    *            No arguments needed    */   public static void main(String[] args) {      System.out.println("Rotating an Image");      // step 1: creation of a document-object    Document document = new Document();      try {       // step 2:     // we create a writer that listens to the document     // and directs a PDF-stream to a file       PdfWriter.getInstance(document, new FileOutputStream(android.os.Environment.getExternalStorageDirectory() + java.io.File.separator +  "iTextTest"  + java.io.File.separator + "rotating.pdf"));       // step 3: we open the document     document.open();       // step 4: we add content     //Can't use filename => use byte[] instead  //   Image jpg4 = Image.getInstance("otsoe.jpg");     ByteArrayOutputStream stream = new ByteArrayOutputStream();     //Bitmap bitmap = BitmapFactory.decodeResource(ITextActivity.getActivity().getResources(), R.drawable.otsoe);     Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/jxk_run.png");     bitmap.compress(Bitmap.CompressFormat.JPEG /* FileType */,100 /* Ratio */, stream);     Image jpg = Image.getInstance(stream.toByteArray());     jpg.setAlignment(Image.MIDDLE);       jpg.setRotation((float) Math.PI / 6);     document.add(new Paragraph("rotate 30 degrees"));     document.add(jpg);     document.newPage();       jpg.setRotation((float) Math.PI / 4);     document.add(new Paragraph("rotate 45 degrees"));     document.add(jpg);     document.newPage();       jpg.setRotation((float) Math.PI / 2);     document.add(new Paragraph("rotate pi/2 radians"));     document.add(jpg);     document.newPage();       jpg.setRotation((float) (Math.PI * 0.75));     document.add(new Paragraph("rotate 135 degrees"));     document.add(jpg);     document.newPage();       jpg.setRotation((float) Math.PI);     document.add(new Paragraph("rotate pi radians"));     document.add(jpg);     document.newPage();       jpg.setRotation((float) (2.0 * Math.PI));     document.add(new Paragraph("rotate 2 x pi radians"));     document.add(jpg);    } catch (DocumentException de) {     System.err.println(de.getMessage());    } catch (IOException ioe) {     System.err.println(ioe.getMessage());    }      // step 5: we close the document    document.close();   }    }

生产PDF如下:

在Android中利用iText生成PDF