2012-07-16 61 views
0

我想將pdf轉換爲appengine中的圖像文件。理想情況下,我會將pdf上傳爲blob,並存儲pdf和pdf的圖像。轉換也可以在不同的時間完成(taskqueue)。Appengine轉換Api(java)

我還沒有找到任何工作樣本或做這件事的好文件。
官方文檔是here。這是我在我的上傳servlet上的實現。

@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"); 

       } 

更新:是否加入字節[] = IOUtils.toByteArray(是);並仍然得到NPE ...

我也很好奇轉換的質量,如果任何人有經驗。

回答

0

以下是接收上傳pdf並使用轉換API將其轉換爲PNG的工作代碼。上傳完成後用多部分後到上傳網址必須通過獲得:

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

只需將此代碼放在一個servlet並將其映射在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"); 

       } 
2

要轉換文檔,您首先必須創建資產。通過將字節傳遞給構造函數來創建資產,如示例中所示。在你的情況下,你將需要使用類BlobstoreInputStream來讀取PDF的字節。

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

然後你需要從這個輸入流中讀取所有字節。

轉換後,您可以使用asset.getData()訪問已轉換圖像的字節,然後按照this doc將圖像寫入Blob存儲區。

+0

我已經添加了我嘗試過的東西的源代碼。現在爲blobstoreinputstream獲取空值。 – Patrick 2012-07-17 00:32:17

+0

你確定InputStream爲空。我會說,你得到的NullPointerException是因爲你傳遞一個空數組到read方法(參見http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read (字節[]))。你需要閱讀大塊,請參閱http://stackoverflow.com/questions/1264709/convert-inputstream-to-byte-in-java的第二位。 – 2012-07-17 00:51:55

+0

好吧,關於null傳入......呃!我用IOUtils.toByteArray(is)更新了代碼;並仍在獲得NPE。將不得不挖更多一點... – Patrick 2012-07-17 01:30:13