如何使用 pdfbox 生成可下载的 PDF(损坏的 PDF)?

2023-12-31

如何使 PDF 文件可通过链接下载?

我正在使用 JSF 构建一个 Web 应用程序,当用户单击“另存为 PDF”链接时,应该可以下载 PDF。

到目前为止,我有一个生成 PDF 文件的工作代码,但该文件保存在我的桌面上,我想要做的是,当用户单击链接时,pdf 文件应该是可下载的,而不是存储在应用程序中。

更新3: 感谢您的帮助,我根据您的建议修改了我的代码并使其正常工作。

更新2: 我收到以下错误: Adob​​e Reader 无法打开“您的文件.pdf”,因为它不是受支持的文件类型或文件已损坏

更新1: 我正在添加我当前的代码以及您指出的更改,但是我仍在努力使这项工作正常进行

这是我生成 PDF 的方法:

public ByteArrayOutputStream createPDF() throws IOException, COSVisitorException {

    PDDocument document;
    PDPage page;
    PDFont font;
    PDPageContentStream contentStream;
    PDJpeg front;
    PDJpeg back;

    InputStream inputFront;
    InputStream inputBack;
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 

    // Creating Document
    document = new PDDocument();

    // Creating Pages
    for(int i=0; i<2; i++) {

        page = new PDPage();

        // Adding page to document
        document.addPage(page); 

        // Adding FONT to document
        font = PDType1Font.HELVETICA;           

        // Retrieve Image to be added to the PDF
        inputFront = new FileInputStream(new File("D:/Media/imageFront.jpg"));  
        inputBack = new FileInputStream(new File("D:/Media/imageBack.jpg"));

        BufferedImage buffFront = ImageIO.read(inputFront);
        BufferedImage resizedFront = Scalr.resize(buffFront, 460);

        BufferedImage buffBack = ImageIO.read(inputBack);
        BufferedImage resizedBack = Scalr.resize(buffBack, 460); 

        front = new PDJpeg(document, resizedFront);
        back = new PDJpeg(document, resizedBack);

        // Next we start a new content stream which will "hold" the to be created content.
        contentStream = new PDPageContentStream(document, page);                

        // Let's define the content stream
        contentStream.beginText();
        contentStream.setFont(font, 8);
        contentStream.moveTextPositionByAmount(10, 770);
        contentStream.drawString("Amount: $1.00");
        contentStream.endText();

        contentStream.beginText();
        contentStream.setFont(font, 8);
        contentStream.moveTextPositionByAmount(200, 770);
        contentStream.drawString("Sequence Number: 123456789");
        contentStream.endText();

        contentStream.beginText();
        contentStream.setFont(font, 8);
        contentStream.moveTextPositionByAmount(10, 760);
        contentStream.drawString("Account: 123456789");
        contentStream.endText();

        contentStream.beginText();
        contentStream.setFont(font, 8);
        contentStream.moveTextPositionByAmount(200, 760);
        contentStream.drawString("Captura Date: 04/25/2011");
        contentStream.endText();

        contentStream.beginText();
        contentStream.setFont(font, 8);
        contentStream.moveTextPositionByAmount(10, 750);
        contentStream.drawString("Bank Number: 123456789");
        contentStream.endText();

        contentStream.beginText();
        contentStream.setFont(font, 8);
        contentStream.moveTextPositionByAmount(200, 750);
        contentStream.drawString("Check Number: 123456789");
        contentStream.endText();            

        // Let's close the content stream       
        contentStream.close();

    }

    // Finally Let's save the PDF
    document.save(output);
    document.close();

    return output;
}

这是我的 servlet,它调用前面的代码并生成输出并设置标头:

try {

        ByteArrayOutputStream output = new ByteArrayOutputStream();
        output = createPDF();

        response.addHeader("Content-Type", "application/force-download"); 
        response.addHeader("Content-Disposition", "attachment; filename=\"yourFile.pdf\"");
        response.getOutputStream().write(output.toByteArray());

    } catch (Exception ex) {            
        ex.printStackTrace();
    }   

我不确定我错过了什么,因为当我尝试打开 PDF 时,出现错误:Adoble Reader 无法打开“yourfile.pdf”,因为不是受支持的文件类型或因为文件已损坏


您需要设置正确的 http 标头才能告诉浏览器下载文件。

response.addHeader("Content-Type", "application/force-download")
response.addHeader("Content-Disposition", "attachment; filename=\"yourFile.pdf\"")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 pdfbox 生成可下载的 PDF(损坏的 PDF)? 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 使用 WebDriver 单击新打开的选项卡中的链接

    有人可以在这种情况下帮助我吗 场景是 有一个网页 我仅在新选项卡中打开所有指定的链接 现在我尝试单击新打开的选项卡中的任何一个链接 在下面尝试过 但它仅单击主 第一个选项卡中的一个链接 而不是在新选项卡中 new Actions drive
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • org/codehaus/plexus/archiver/jar/JarArchiver(不支持的major.minor版本49.0)-Maven构建错误

    下午大家 我在尝试构建项目时收到上述错误 我很确定这与使用 Java 1 6 编译的 Maven 最新更新有关 而我们尝试构建的项目是 1 4 项目 在此之前的插件工作没有问题 因此我将以下内容添加到 POM xml 文件中以尝试强制使用现
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • Eclipse - 安装新的 JRE (Java SE 8 1.8.0)

    我正在尝试安装 Java 8 到目前为止我所做的 安装最新版本的 Eclipse 下载并安装 Java SE 运行时环境 8http www oracle com technetwork java javase downloads jre8
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不

随机推荐

  • 从 url 下载 zip 并使用 SBT 将其解压到资源中

    我想从 URL 下载 zip 文件 我的数据库 并将其解压到特定文件夹 例如资源 中 我想在我的项目构建 sbt 文件中执行此操作 这样做的适当方法是什么 我知道sbt IO已经解压并下载 我找不到使用下载的好示例 我发现的示例不起作用 有
  • 如何在数据库中存储 8000 亿个 GPS 标记 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • rstudent() 返回“mlm”的错误结果(装有多个 LHS 的线性模型)

    我知道对具有多个 LHS 的线性模型的支持是有限的 但是 当可以在 mlm 对象上运行函数时 我希望结果是可信的 使用时rstudent 产生奇怪的结果 这是一个错误还是有其他解释 在下面的例子中fittedA and fittedB是相同
  • F# 说计算表达式中未定义值

    我一直在使用 F 计算表达式开发 State Monad 并且我还尝试利用自定义操作 我遇到了一些没有意义的奇怪行为 当仅在上面两行声明该值时 编译器报告该值不存在 type State lt a s gt s gt a s module
  • 如何在没有数据上下文的情况下更新对象

    实体框架提供了极大的灵活性 可以在同一数据上下文中更新数据 Dim personA from p in datacontext Person where p PersonID 1 select p personA name txtName
  • 获取 React-Select 中突出显示选项的值

    我在用着反应选择 v2 https react select com home使用异步选择组件
  • GCC 不喜欢带空格的 C++ 风格转换 [重复]

    这个问题在这里已经有答案了 我正在将一些 C 代码移植到 GCC 显然 当涉及空间时 它对 C 样式转换不满意 如unsigned int 1 long long ShortVar 等等 它给出了error expected primary
  • PDF 规范中“base 14”字体的字体规格

    我一直在编写软件来解析 PDF 中的内容 特别是分成区域的文本 为此 我需要字体度量 例如字形位移 字体宽度上升 下降和字形边界框等 简而言之 PDF 中字体定义的 FontDescriptor 字典中应提供的度量类型 不幸的是 对于基本字
  • 在 Python 中解析 XML 的最快方法

    我正在尝试寻找最快的方法来解析智能手机中的传感器数据以用于实时应用程序 格式如下
  • UITableView 页脚,停止浮动在内容上

    我想让我的 UITableView 页脚停止漂浮在我的内容上 就像默认活动一样 我希望我的页脚是 好吧 页脚 始终是在表格视图末尾显示的最后一个视图 实际上 标题也是如此 有没有什么简单的方法可以在滚动时禁止它浮动在表格视图的顶部 谢谢大家
  • np.power 还做了哪些额外的工作?

    我意识到np power a b 慢于np exp b np log a import numpy as np a b np random random 2 100000 timeit np power a b best of 3 4 16
  • jQuery 1.3 只选择第一个元素

    我不确定这是否是一个错误 或者只是 jQuery 1 3 中我不知道的一些疯狂的新事物 或者我只是疯了 我有一个表 其中有 11 个复选框 我无法使用 jQuery 1 3 将它们全部选中 jQuery 1 2 6 myTable find
  • 如何使用官方 10gen C# 驱动程序设置地理值的序列化选项?

    考虑这个类 public class Location public Coordinates Geo get set public Location Geo new Coordinates public class Coordinates
  • jquery删除新行然后用块元素包装文本节点

    我有一些这样的段落 这是第一段 r r n n 这 是第二个有很多新行的 在 n n n n n n 和最后一段之后 n r r 我想删除新行并将每个段落用 p 标签 我期望输出如下 p p This is the first para p
  • Windows 头文件中的“#ifdef _MAC”是什么意思?

    我正在浏览 Windows Platform SDK 头文件 真是太棒了 对吧 我注意到很多地方都包含对预处理器符号的引用 MAC 例如 WinUser h line 1568 Message structure typedef struc
  • 控制器策略/垃圾收集(销毁)

    试图找出我的应用程序关于 MVC 的 ember 最佳实践 另外供参考 我正在使用 ember data ember layout 和 ember route manager 我将以用户为例 我觉得我想做的是从数据库中获取用户模型 然后将其
  • 如何用Python做华夫饼图? (方形饼图)

    Something like this 有一个很好的包在 R 中做到这一点 https github com hrbrmstr waffle 在Python中 我能想到的最好的办法就是使用squarify包 灵感来自关于如何制作树形图的帖子
  • 如何在 C# 3.5 中对泛型方法施加接口约束?

    我想在 C 3 5 中实现这样的目标 public void Register
  • Elasticsearch 访问日志

    我正在尝试追踪谁向 ElasticSearch 集群发出查询 Elastic 似乎没有访问日志 有没有地方可以找出哪个 IP 正在访问集群 Elasticsearch 不提供任何开箱即用的安全性 即有目的和有意设计 所以你有几个解决方案 不
  • 如何使用 pdfbox 生成可下载的 PDF(损坏的 PDF)?

    如何使 PDF 文件可通过链接下载 我正在使用 JSF 构建一个 Web 应用程序 当用户单击 另存为 PDF 链接时 应该可以下载 PDF 到目前为止 我有一个生成 PDF 文件的工作代码 但该文件保存在我的桌面上 我想要做的是 当用户单