0

appengine内でPDFを画像ファイルに変換したい。理想的には、PDFをBLOBとしてアップロードし、PDFとPDFの画像の両方を保存します。変換は別の時間(タスクキュー)で実行することもできます。

これを行うための実用的なサンプルや優れたドキュメントは見つかりませんでした。
公式ドキュメントはこちらです。これが私のアップロードサーブレットでの私の実装です。

@SuppressWarnings("serial")
public class UploadBlobServlet extends HttpServlet {

  private static final Logger log = Logger.getLogger(UploadBlobServlet.class.getName());

public void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
    BlobKey blobKey = blobs.get("data");
    log.log(Level.WARNING,"blobKey: "+blobKey.getKeyString());



        if (blobKey != null) {
        resp.getWriter().println(blobKey.getKeyString());

        BlobstoreInputStream in=new BlobstoreInputStream(blobKey);
        byte[] b = IOUtils.toByteArray(is);
      //  try{
            in.read(b);
            Asset asset = new Asset(
                    "application/pdf", b, "testfile.pdf");
                Document document = new Document(asset);
                Conversion conversion = new Conversion(document, "image/png");

                ConversionService service =
                    ConversionServiceFactory.getConversionService();
                ConversionResult result = service.convert(conversion);

                if (result.success()) {
                  // Note: in most cases, we will return data all in one asset,
                  // except that we return multiple assets for multi-page images.
                FileService fileService=FileServiceFactory.getFileService(); 
                for (Asset ass : result.getOutputDoc().getAssets()) {
                    AppEngineFile file=fileService.createNewBlobFile("image/png", "testfile.png");
                    FileWriteChannel writeChannel=fileService.openWriteChannel(file, false);
                    writeChannel.write(ByteBuffer.wrap(b));
                    writeChannel.closeFinally();
                  }
                } else {
                    log.log(Level.WARNING,"error");

                }

更新:byte [] = IOUtils.toByteArray(is);を追加しました。まだNPEを取得しています...

誰かが経験を持っているなら、私は変換の質についても興味があります。

4

2 に答える 2

2

ドキュメントを変換するには、最初にアセットを作成する必要があります。アセットは、例に示すように、バイトをコンストラクターに渡すことによって作成されます。あなたの場合、PDFのバイトを読み取るためにクラスBlobstoreInputStreamを使用する必要があります。

BlobKey blobKey = new BlobKey("your-pdf-blobkey");
InputStream is = new BlobstoreInputStream(blobkey);

次に、この入力ストリームからすべてのバイトを読み取る必要があります。

変換後、で変換された画像のバイトにアクセスし、このドキュメントasset.getData()に従って画像をblobstoreに書き込むことができます。

于 2012-07-16T23:39:19.883 に答える
0

これは、アップロードpdfを受け取り、Conversionapiを使用してpngに変換するための作業コードです。アップロードはマルチパート投稿で完了します。アップロードURLは、次の方法で取得する必要があります。

     String url=blobstoreService.createUploadUrl("/upload");

このコードをサーブレットに配置し、web.xmlの「アップロード」にマップするだけです。

変換は高品質ですが、テキストの周りに少しぼやけていることに気づきました。私の場合、pngは約25%大きかった。

public void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
    BlobKey blobKey = blobs.get("data");



        if (blobKey != null) {
        resp.getWriter().println(blobKey.getKeyString());
        BlobstoreInputStream in=new BlobstoreInputStream(blobKey);

        byte[] b = IOUtils.toByteArray(in);
        if(b!=null){
            log.log(Level.WARNING,"blobsize: "+b.length);
        }else{
            log.log(Level.WARNING,"b is null");

        }
            in.read(b);
            Asset asset = new Asset(
                    "application/pdf", b, "testfile.pdf");
                Document document = new Document(asset);
                Conversion conversion = new Conversion(document, "image/png");

                ConversionService service =
                    ConversionServiceFactory.getConversionService();
                ConversionResult result = service.convert(conversion);

                if (result.success()) {
                  // Note: in most cases, we will return data all in one asset,
                  // except that we return multiple assets for multi-page images.
                FileService fileService=FileServiceFactory.getFileService(); 
                for (Asset ass : result.getOutputDoc().getAssets()) {
                    AppEngineFile file=fileService.createNewBlobFile("image/png", "test3file.png");
                    FileWriteChannel writeChannel=fileService.openWriteChannel(file, true);
                    writeChannel.write(ByteBuffer.wrap(ass.getData()));

                    writeChannel.closeFinally();
                  }
                } else {
                    log.log(Level.WARNING,"error");

                }
于 2012-07-17T17:18:59.257 に答える