2

PDF の最初のページから画像を作成したい。私は Java で iText を使用しています。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();

上記のコードを書きました。PDFの最初のページを画像として抽出し、SDCARDに保存するにはどうすればよいですか?

4

2 に答える 2

5

iText はその目的では機能しません。

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

jar ファイルは zip にあります。

そのライブラリ 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();
        }

rect を変更して、必要な pdf の任意の部分を抽出することもできます。その解決策を見つける前に、壁に頭をぶつけて約16時間を費やしました. swing awt ライブラリなしで可能かどうかはよくわかりませんでした。申し訳ありませんが、ストレージはハードコードされていますが、当時はそれが私の懸念の中で最も少なかった.

于 2014-10-08T19:40:22.303 に答える
4

質問が最初に尋ねたことを行う方法を見つけることになりました!!!

iTextG ライブラリ (itextg-5.5.3.jar)、scpkix-jdk15on.1.47.0.1.jar および scprov-jdk15on-1.47.0.2.jar が必要です。

どこから呼び出したいか:

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);
    }
}

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
  }
  }

みんなを楽しむ

于 2014-10-09T10:37:04.280 に答える