【问题标题】:How to create an image from first page of a pdf in iText如何在 iText 中从 pdf 的第一页创建图像
【发布时间】:2013-02-12 11:05:25
【问题描述】:

我想从 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 中?

【问题讨论】:

  • iText 不是执行此操作的正确工具,因为它不是 PDF 渲染器。
  • 你能告诉我应该遵循什么程序来实现我的目标吗?
  • 寻找适用于 android 并允许您导出缩略图的 pdf 渲染器。
  • 我尝试过使用 PDFRenderer Library 。但我有一个非常有趣的错误。我无法解决它。

标签: java android pdf itext


【解决方案1】:

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 库是否有可能。抱歉,存储是硬编码的,但这是我当时最不关心的问题。

【讨论】:

    【解决方案2】:

    我最终发现了如何做最初提出的问题!!!

    您需要 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
      }
      }
    

    大家开心

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      相关资源
      最近更新 更多