我有一个问题,从我们的Restlet API提供一个PDF文件。
我使用的是来自Apache PDFBox文档的基本示例代码,它在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的尝试,最终我希望返回一个OutputRepresentation并将PDDcoument保存到流中。
下面的代码在PDPage page = new PDPage();上停止工作,我没有得到任何异常,Restlet服务器不返回任何响应。文本"after instantiating new 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);
}
}这是我的web.xml
<!-- Restlet application -->
<context-param>
<param-name>org.restlet.application</param-name>
<param-value>com.xxx.api.ApiRestletApplication</param-value>
</context-param>
<!-- Restlet adapter -->
<servlet>
<servlet-name>RestletServlet</servlet-name>
<servlet-class>
org.restlet.ext.servlet.ServerServlet
</servlet-class>
</servlet>
<!-- Catch all requests -->
<servlet-mapping>
<servlet-name>RestletServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>如果我用PDPage声明进行注释并返回一些StringRepresentation,那么一切都正常。我可以为一些Json,xml和excel服务。但这份PDF文件让我发疯了。
下面是我使用的版本:
[INFO] +- org.restlet.jee:org.restlet:jar:2.2.1:compile
[INFO] +- org.restlet.jee:org.restlet.ext.crypto:jar:2.2.1:compile
[INFO] +- org.restlet.jee:org.restlet.ext.servlet:jar:2.2.1:compile
[INFO] | +- org.apache.pdfbox:pdfbox:jar:1.8.10:compile
[INFO] | | +- org.apache.pdfbox:fontbox:jar:1.8.10:compile
[INFO] | | \- org.apache.pdfbox:jempbox:jar:1.8.10:compile
[INFO] | \- com.sun:tools:jar:jdk:system以下是卷曲请求:
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和servlets有关: PDFBox:在tomcat上运行时无法保存pdf
编辑4:这是解决方案 https://stackoverflow.com/a/32706385/1039265
发布于 2015-09-22 00:08:08
问题来自于PDFBox版本。如果我使用版本2.0.0-SNAPSHOT (http://pdfbox.apache.org/2.0/getting-started.html),我可以通过servlet生成一个PDF。谢谢你的帮助。
发布于 2015-09-19 09:43:29
我试过你的样本代码,它对我有用。
我刚刚设置了一个类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);
}
}发布于 2015-09-19 07:45:15
实际上,您从未在响应中返回您创建的PDF的内容。带注释的方法的返回表示对应于响应内容。
在您的例子中,它应该对应一个二进制的。您还可以利用内容配置头来触发浏览器中的下载对话框。
您可以尝试将这些内容放入一个字节数组中,然后通过Restlet使用一个专用的表示(例如,基于OuputStream的表示)发送它。
希望它能帮到你。蒂埃里
https://stackoverflow.com/questions/32657388
复制相似问题