Java 带Restlet的PDFbox

Java 带Restlet的PDFbox,java,pdf,pdf-generation,restlet,pdfbox,Java,Pdf,Pdf Generation,Restlet,Pdfbox,我在从我们的RestletAPI提供PDF文件时遇到问题 我使用的是来自的基本示例代码,它在Restlet上下文之外运行良好 PDDocument document = new PDDocument(); System.err.println("before instantiating new PDPage"); // Create a new blank page and add it to the document PDPage page = new PDPage(); // LINE F

我在从我们的
Restlet
API提供PDF文件时遇到问题

我使用的是来自的基本示例代码,它在
Restlet
上下文之外运行良好

PDDocument document = new PDDocument();

System.err.println("before instantiating new PDPage");
// Create a new blank page and add it to the document
PDPage page = new PDPage(); // LINE FAILING IN RESTLET
System.err.println("after instantiating new PDPage");

document.addPage(page);
document.save("pdf.pdf");
document.close();
下面是我在资源中使用PDFBox的尝试,最终我希望返回一个
outputerPresentation
,并将
pddcount
保存到流中

以下代码在
PDPage=new PDPage()处停止工作,我没有得到任何异常,
Restlet
服务器没有返回任何响应。实例化新PDPage后的文本<代码>“
永远不会打印

编辑:我尽可能简化了代码,但仍然存在问题

这是我的基本路由器:

public class ApiRestletApplication extends Application {

  @Override
  public Restlet createInboundRoot() {
    Router router = new Router(getContext());
    router.attach("/v1/myresource", MyResource.class);
    return router;
  }
}
这是我的资源

public class MyResource extends ServerResource {

  protected static final Logger logger = LoggerFactory.getLogger(MyResource.class);

  @Get
  public Representation toPDF() {

    PDDocument document = new PDDocument();
    System.err.println("before instantiating new PDPage");
    PDPage page = new PDPage();
    System.err.println("after instantiating new PDPage"); //<= never printed
    document.addPage(page);

    return new PDFRepresentation(document);
  }
}
以下是curl请求:

curl "http://localhost:8889/v1/myresource" -H "Content-Type: application/pdf" -H "Accept: application/pdf"
以下是eclipse中的日志:

2015-09-21 15:08:15.933:INFO::Started SelectChannelConnector@0.0.0.0:8889
2015-09-21 15:08:20.698:INFO:/:RestletServlet: [Restlet] Attaching application: com.xxx.api.ApiRestletApplication@2613622c to URI: 
before instantiating new PDPage
//then nothing
谢谢你的帮助

编辑2:以下代码可以工作,但我仍然不知道为什么我的代码不能工作:

public class RestletServerTest extends Application {

  @Override
  public Restlet createInboundRoot() {
    Router router = new Router(getContext());
    router.attach("/v1/myresource", MyResource.class);
    return router;
  }

  public static void main(String[] args) throws Exception {
    Component component = new Component();
    component.getServers().add(Protocol.HTTP, 8182);

    component.getDefaultHost().attach("", new RestletServerTest());
    component.start();
  }
}
编辑3:该问题似乎与Restlet无关,而是与PDFBox和servlet有关:


编辑4:以下是解决方案

事实上,您从未在响应中返回创建的PDF的内容。带注释方法的返回表示形式与响应内容相对应

在您的情况下,它应该对应于二进制。您还可以利用content disposition标头在浏览器中触发下载对话框

您可以尝试将此内容放入字节数组,然后通过带有专用表示(例如基于OuputStream的表示)的Restlet发送它

希望对你有帮助。
Thierry

我已经尝试了您的示例代码,它对我很有效

我刚刚设置了一个类PDDocumentRepresentation,用于包装PDDocument:

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.restlet.data.MediaType;
import org.restlet.representation.OutputRepresentation;

public class PDDocumentRepresentation extends OutputRepresentation {

    private PDDocument document = new PDDocument();

    public PDDocumentRepresentation(PDDocument document) {
        super(MediaType.APPLICATION_PDF);
        this.document = document;
    }

    @Override
    public void write(OutputStream outputStream) throws IOException {
        try {
            document.save(outputStream);
            document.close();
        } catch (COSVisitorException e) {
            throw new IOException(e);
        }
    }
}
以下是资源的代码:

public class MyResource extends ServerResource {

    @Get
    public Representation getPdf() {
        PDDocument document = new PDDocument();
        PDPage page = new PDPage();
        document.addPage(page);

        return new PDDocumentRepresentation(document);
    }
}

问题来自PDFBox版本。如果我使用版本
2.0.0-SNAPSHOT
(),我就能够通过servlet生成PDF。谢谢你的帮助。

嗨,蒂埃里,谢谢你的回答。不幸的是,我仍然有这个问题。我编辑了我的答案,以显示我使用的最小代码。谢谢您的帮助。请使用ServerServlet再试一次好吗?使用独立组件时一切正常,但在使用ServerServlet时失败。嗨,Thierry,这只是为了示例。我用我用来重现问题的代码编辑了我的问题。
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.restlet.data.MediaType;
import org.restlet.representation.OutputRepresentation;

public class PDDocumentRepresentation extends OutputRepresentation {

    private PDDocument document = new PDDocument();

    public PDDocumentRepresentation(PDDocument document) {
        super(MediaType.APPLICATION_PDF);
        this.document = document;
    }

    @Override
    public void write(OutputStream outputStream) throws IOException {
        try {
            document.save(outputStream);
            document.close();
        } catch (COSVisitorException e) {
            throw new IOException(e);
        }
    }
}
public class MyResource extends ServerResource {

    @Get
    public Representation getPdf() {
        PDDocument document = new PDDocument();
        PDPage page = new PDPage();
        document.addPage(page);

        return new PDDocumentRepresentation(document);
    }
}