2012-07-16 58 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