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