gpt4 book ai didi

java - 带有 ReSTLet 的 PDFbox

转载 作者:行者123 更新时间:2023-11-30 08:47:04 26 4
gpt4 key购买 nike

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

我正在使用 Apache PDFBox documentation 中的基本示例代码,它在 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 请求:

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 相关:PDFBox: Unable to save pdf while running on tomcat

编辑 4:这是解决方案 https://stackoverflow.com/a/32706385/1039265

最佳答案

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

我刚刚设置了一个包装 PDDocument 的类 PDDocumentRepresentation:

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

关于java - 带有 ReSTLet 的 PDFbox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32657388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com