简体   繁体   English

如何在iText中从pdf的第一页创建图像

[英]How to create an image from first page of a pdf in iText

I want to create image from first page of an PDF . 我想从PDF的第一页创建图像。 I am using iText in java . 我在java中使用iText。 Can you suggest me what to do to extract first page of an pdf as an image ? 您能否建议我如何将pdf的第一页作为图像提取?

Document document = new Document();               
PdfWriter writer = PdfWriter.getInstance(  
  document, new FileOutputStream(RESULT));     
document.open();                  

File extStore = Environment.getExternalStorageDirectory();
String path=extStore.getPath()+"/FirstPdf.pdf";

PdfReader reader = new PdfReader(path); 
int n = reader.getNumberOfPages();
PdfImportedPage page; 
for (int i = 1; i <= n; i++) {
  page = writer.getImportedPage(reader, i);
//  Image.getInstance(page) ; 
} 

document.close();

I have written the above code . 我写了上面的代码。 What to do to extract first page of a pdf as an image and save it in SDCARD ? 如何将pdf的第一页作为图像提取并保存在SDCARD中?

iText doesn't work for that purpose. iText不适用于此目的。

http://www.java2s.com/Open-Source/Android_Free_Code/Pdf/Download_Free_code_Android_Pdf_Viewer_Library.htm http://www.java2s.com/Open-Source/Android_Free_Code/Pdf/Download_Free_code_Android_Pdf_Viewer_Library.htm

The jar file is in the zip. jar文件在zip中。

Download that library PdfViewer.jar and try this code: 下载该库PdfViewer.jar并尝试以下代码:

 byte[] bytes;
        try {

            File file = new File("/storage/extSdCard/Test.pdf");
            FileInputStream is = new FileInputStream(file);

            // Get the size of the file
            long length = file.length();
            bytes = new byte[(int) length];
            int offset = 0;
            int numRead = 0;
            while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
            }
            ByteBuffer buffer = ByteBuffer.NEW(bytes);
            String data = Base64.encodeToString(bytes, Base64.DEFAULT);
            PDFFile pdf_file = new PDFFile(buffer);
            PDFPage page = pdf_file.getPage(2, true);

            RectF rect = new RectF(0, 0, (int) page.getBBox().width(),
            (int) page.getBBox().height());

            Bitmap image = page.getImage((int)rect.width(), (int)rect.height(), rect);
            FileOutputStream os = new FileOutputStream("/storage/extSdCard/pdf.jpg");
            image.compress(Bitmap.CompressFormat.JPEG, 80, os);
            //((ImageView) findViewById(R.id.testView)).setImageBitmap(image);

        } catch (Exception e) {
            e.printStackTrace();
        }

You can change the rect around to make it extract any part of the pdf you want etc too, pretty good. 您可以更改矩形,使其提取您想要的PDF格式的任何部分,非常好。 Spent about 16 hours banging my head against a wall before finding that solution. 在找到解决方案之前,花了大约16个小时撞到墙上。 Wasn't really sure if it was possible without the swing awt library. 如果没有swing awt库,是不是真的可以肯定。 Sorry the storage is hard coded but it was the least of my concerns at the time. 对不起存储是硬编码的,但这是我当时最不关心的问题。

I ended up finding out how to do what the question initially asked!!! 我最终找到了如何做最初问的问题!!!

You need iTextG library (itextg-5.5.3.jar), scpkix-jdk15on.1.47.0.1.jar & scprov-jdk15on-1.47.0.2.jar 你需要iTextG库(itextg-5.5.3.jar),scpkix-jdk15on.1.47.0.1.jar和scprov-jdk15on-1.47.0.2.jar

inside where want to call it from: 在里面想要调用它:

public static final String RESULT = "/storage/sdcard0/dirAtExtStorage/Img%s.%s";

public void extractImages(String filename)
    throws IOException, DocumentException {

    PdfReader reader = new PdfReader(filename);
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    MyImageRenderListener listener = new MyImageRenderListener(RESULT);
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        parser.processContent(i, listener);
    }
}

inside MyImageRendererListener.java: 在MyImageRendererListener.java中:

public class MyImageRenderListener implements RenderListener{

private String path;

public MyImageRenderListener(String path) {
    this.path = path;

  }



@Override
public void beginTextBlock() {
    // TODO Auto-generated method stub

}

@Override
public void endTextBlock() {
    // TODO Auto-generated method stub

}

public void renderImage(ImageRenderInfo renderInfo) {
    try {
        System.out.print("renderImage");
        String filename;
        FileOutputStream os;
        PdfImageObject image = renderInfo.getImage();
        if (image == null) return;
        filename = String.format(path, renderInfo.getRef().getNumber(), image.getFileType());
        os = new FileOutputStream(filename);
        os.write(image.getImageAsBytes());
        os.flush();
        os.close();
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}

@Override
public void renderText(TextRenderInfo arg0) {
    // TODO Auto-generated method stub
  }
  }

enjoy guys 喜欢伙计们

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM