Страница PDF в изображение, Apportable BridgeKit
Я изменил код из этого поста:
Нужна помощь для преобразования страницы PDF в растровое изображение в Android Java
Чтобы попытаться получить страницу из PDF-файла, преобразуйте ее в байт [] и передайте обратно в проект 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
1 ответ
Решение
Вместо - (void) TestBridge
метод, вы должны переопределить +[JavaObject initializeJava]
так что-то вроде:
+ (void)initializeJava
{
// always call [super initializeJava]
[super initializeJava];
// register bridge constructors, methods, callbacks here ...
}
Также обратите внимание, что ParseBridge с открытым исходным кодом предоставляет довольно обширный пример использования Apportable BridgeKit.