2014-10-10 82 views
0

我修改了这个职位的一些代码:PDF页面图像,Apportable BridgeKit

Need help to convert a Pdf page into Bitmap in Android Java

要尝试从PDF获得一个页面,将其转换为一个byte [],并将其传递回Xcode项目被显示。我正在使用Apportables BridgeKit框架来完成这个工作,它编译时没有任何错误。

问题是应用程序一旦加载到设备就崩溃了。

ImageExtractor.java

package com.pdflib; 

import android.graphics.Bitmap; 
import android.os.Environment; 
import android.util.Log; 

import com.sun.pdfview.PDFFile; 
import com.sun.pdfview.PDFPage; 

import net.sf.andpdf.nio.ByteBuffer; 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.RandomAccessFile; 

public class ImageExtractor 
{ 
    //Globals: 
    private int ViewSize = 0; 

    //Load Images: 
    private byte[] pdfLoadImages() 
    { 
     try 
     { 
      File file = new File(Environment.getExternalStorageDirectory().getPath() + "/backs.pdf"); 
      RandomAccessFile f = new RandomAccessFile(file, "r"); 
      byte[] data = new byte[(int)f.length()]; 
      f.readFully(data); 

      //create pdf document object from bytes 
      ByteBuffer bb = ByteBuffer.NEW(data); 
      PDFFile pdf = new PDFFile(bb); 
      //Get the first page from the pdf doc 
      PDFPage PDFpage = pdf.getPage(1, true); 
      //create a scaling value according to the WebView Width 
      final float scale = ViewSize/PDFpage.getWidth() * 0.95f; 
      //convert the page into a bitmap with a scaling value 
      Bitmap page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true); 
      //save the bitmap to a byte array 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      page.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 
      stream.reset(); 

      return byteArray; 
     } 
     catch (Exception e) 
     { 
      Log.d("error", e.toString()); 
     } 

     return null; 
    } 
} 

MainScene.m

#import "MainScene.h" 
#import "CreateTexture.h" 

@implementation MainScene 

- (void)didLoadFromCCB 
{ 
    CGSize size = CGSizeMake(100, 75); 

    CreateTexture* sprite = [[CreateTexture alloc] initWithBackSize: size]; 

    sprite.positionInPoints = CGPointMake(100, 100); 

    [self addChild: sprite]; 
} 

@end 

CreateTexture.m

#import "CreateTexture.h" 

#ifdef ANDROID 
#import "PDFBridge.h" 
#endif 

@implementation CreateTexture 

- (instancetype) initWithBackSize: (CGSize) size 
{ 
    #ifdef APPORTABLE 
     PDFBridge *temp = [[PDFBridge alloc] init]; 
     [temp TestBridge]; 
     NSData* tempBytes = temp.imageBytes; 

     UIImage* image = [[UIImage alloc] initWithData:tempBytes]; 

     CCTexture* texture = [[CCTexture alloc] initWithCGImage: image.CGImage contentScale: image.scale]; 

     self = [super initWithTexture: texture]; 

    #endif 

    NSAssert (self, @"Initializer failed"); 

    return self; 
} 

@end 

PDFBridge.m

#import "PDFBridge.h" 

@implementation PDFBridge 

@dynamic imageBytes; 

- (void) TestBridge 
{ 
    #ifdef APPORTABLE 
    [PDFBridge registerInstanceMethod:@"pdfLoadImages" 
          selector:@selector(imageBytes) 
          returnValue:[NSData className]]; 
    #endif 
} 

+ (NSString *)className 
{ 
    return @"com.pdflib.ImageExtractor"; 
} 

@end 

回答

0

代替- (void) TestBridge方法,你应该重写+[JavaObject initializeJava],所以像:

+ (void)initializeJava 
{ 
    // always call [super initializeJava] 
    [super initializeJava]; 

    // register bridge constructors, methods, callbacks here ... 
} 

还要注意开源ParseBridge提供了使用Apportable BridgeKit的相当广泛的例子。