Страница 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.

Другие вопросы по тегам