首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Restlet的PDFbox

带Restlet的PDFbox
EN

Stack Overflow用户
提问于 2015-09-18 17:00:37
回答 3查看 428关注 0票数 2

我有一个问题,从我们的Restlet API提供一个PDF文件。

我使用的是来自Apache PDFBox文档的基本示例代码,它在Restlet上下文之外工作得很好。

代码语言:javascript
复制
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"从未被打印过。

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

这是我的基本路由器:

代码语言:javascript
复制
public class ApiRestletApplication extends Application {

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

这是我的资源

代码语言:javascript
复制
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

代码语言:javascript
复制
<!-- 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文件让我发疯了。

下面是我使用的版本:

代码语言:javascript
复制
[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

以下是卷曲请求:

代码语言:javascript
复制
curl "http://localhost:8889/v1/myresource" -H "Content-Type: application/pdf" -H "Accept: application/pdf"

下面是eclipse中的日志:

代码语言:javascript
复制
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:下面的代码工作,但我仍然不知道为什么我的代码没有:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-22 00:08:08

问题来自于PDFBox版本。如果我使用版本2.0.0-SNAPSHOT (http://pdfbox.apache.org/2.0/getting-started.html),我可以通过servlet生成一个PDF。谢谢你的帮助。

票数 0
EN

Stack Overflow用户

发布于 2015-09-19 09:43:29

我试过你的样本代码,它对我有用。

我刚刚设置了一个类PDDocumentRepresentation,它封装了一个PDDocument:

代码语言:javascript
复制
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);
        }
    }
}

以下是资源的代码:

代码语言:javascript
复制
public class MyResource extends ServerResource {

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

        return new PDDocumentRepresentation(document);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-09-19 07:45:15

实际上,您从未在响应中返回您创建的PDF的内容。带注释的方法的返回表示对应于响应内容。

在您的例子中,它应该对应一个二进制的。您还可以利用内容配置头来触发浏览器中的下载对话框。

您可以尝试将这些内容放入一个字节数组中,然后通过Restlet使用一个专用的表示(例如,基于OuputStream的表示)发送它。

希望它能帮到你。蒂埃里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32657388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档