【问题标题】:Appengine conversion Api (java)Appengine 转换 Api (java)
【发布时间】:2012-07-15 20:43:17
【问题描述】:

我想在 appengine 中将 pdf 转换为图像文件。理想情况下,我会将 pdf 作为 blob 上传并存储 pdf 和 pdf 的图像。转换也可以在不同的时间完成(任务队列)。

我没有找到任何工作示例或执行此操作的良好文档。
官方文档是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");

                }

更新:已添加 byte[]=IOUtils.toByteArray(is);并且仍然获得 NPE...

如果有人有经验,我也很好奇转换的质量。

【问题讨论】:

    标签: java google-app-engine pdf data-conversion


    【解决方案1】:

    要转换文档,您首先必须创建资产。通过将字节传递给构造函数来创建资产,如示例中所示。在您的情况下,您需要使用 BlobstoreInputStream 类来读取 PDF 的字节。

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

    然后你需要从这个输入流中读取所有字节。

    转换完成后,您可以使用asset.getData()访问转换后图像的字节,然后按照this doc将图像写入blobstore。

    【讨论】:

    • 我已经添加了我尝试过的源代码。现在为 blobstoreinputstream 获取 null。
    • 您确定 InputStream 为空。我会说你得到的 NullPointerException 是因为你将一个空数组传递给 read 方法(参见docs.oracle.com/javase/6/docs/api/java/io/…)。您需要按块阅读,请参阅stackoverflow.com/questions/1264709/… 的第二个分析器。
    • 好的,关于传入的 null 是正确的……呃!我已经用 IOUtils.toByteArray(is); 更新了代码。并且仍然获得NPE。将不得不再挖一点......
    • 我搞定了。谢谢指点!质量看起来不错,但转换为 png 时文本边缘有点模糊。我在您的答案中添加了代码以使其完整。
    • @Patrick 我拒绝了您建议的编辑:stackoverflow.com/suggested-edits/319831。让它自己成为一个答案。感谢您帮助其他人进行更新! :)
    【解决方案2】:

    这是接收上传 pdf 并使用 Conversion api 将其转换为 png 的工作代码。上传完成后需要多部分post到一个上传url,必须通过:

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

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2011-12-27
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多