从 Java 到 PHP 重新创建 PDF 文件

2023-12-01

我有一个 Java 中的 WebService(使用 Apache Axis),它获取文档的 id,并调用 JasperReports 来创建 PDF 文件(之前在 java 应用程序中创建的报告 - 服务器端),以创建我正在使用的方法的报告:JasperManager.fillReport 和 JasperExportManager.exportReportToPdf。最后一个返回一个字节数组。我的 Web 服务获取该数组并将其编码为 Base64 字符串,PHP 接收该字符串作为来自 WebService 的响应。

我想用 PHP 重新创建该文件,但我不知道这是否可行。我正在尝试使用以下代码片段来做到这一点:

private function createFileFromString($stringWithFile){
    header('Content-Description: File Transfer');
    header("Content-Type: application/pdf");
    header('Content-Disposition: attachment; filename=remesa.pdf');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    ob_start();
    ob_clean();
    ob_flush();
    flush();
    $fp = file_put_contents("document.pdf", "w");
    fwrite($fp, base64_decode($stringWithFile));
    readfile($fp);
    ob_get_contents();
    fclose($fp);
    exit();
}

WebService 返回一个像这样的字符串:

JVBERi0xLjQKJeLjz9MKNCAwIG9iaiA8PC9UeXBlL1hPYmplY3QvQ29sb3JTcGFjZS9EZXZpY2VS R0IvU3VidHlwZS9JbWFnZS9CaXRzUGVyQ29tcG9uZW50IDgvV2lkdGggMjg0L0xlbmd0aCAzNjc0 L0hlaWdodCA1MC9GaWx0ZXIvRENURGVjb2RlPj5zdHJlYW0K/9j/4AAQSkZJRgABAgAAAQABAAD/ 2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0 Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/waARCAyARwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA...

该字符串具有“PDF 标题”,开头如下:

%PDF-1.4 % 4 0 目标 流ÿØÿà

当我尝试下载该文件时,它的大小约为 4-5KB(并且文件已损坏),但响应字符串约为 180KB。

这可能吗?我做错了什么?

编辑:我读过unpack功能,也许这个功能可以帮助我?

提前致谢


好的,我解决了。基本上,我有两个错误:

1.从Java:我用来编码 PDF 文件内容的类(org.w3c.tools.codec.Base64Encoder)正在用文件内容破坏字符串,我已经切换到 Apache Axis Tools (而不是此类)(org.apache.axis.encoding.Base64)。我这样说是因为我比较了用 Java 应用程序生成的 PDF 内容和从 WebService 返回的内容,最后一个要小一些。

2. 从 PHP:构建文件:在这一部分我试图这样做:

$fp = file_put_contents("document.pdf", "w");
fwrite($fp, base64_decode($stringWithFile));
readfile($fp);

但是,只有使用 file_put_contents 我才将内容写入 PDF 文件,此时不一定要使用 fwrite 。我用这个片段生成pdf:

private function createFileFromString($stringWithFile){
    header('Content-Description: File Transfer');
    header("Content-Type: application/pdf");
    header('Content-Disposition: attachment; filename=document.pdf');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    flush();
    file_put_contents("document.pdf", base64_decode($stringWithFile));
    readfile("document.pdf");
    exit();
}

希望这个回答对大家有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Java 到 PHP 重新创建 PDF 文件 的相关文章

随机推荐

  • 使用 python requests 库获得 200 响应但未登录

    我尝试抓取 Twitter 帐户关注者列表 为此 需要进行身份验证 所以我使用请求库来进行身份验证 我遇到的问题是 当我尝试进行身份验证时 我收到 200 响应 但身份验证尚未完成 代码是 import requests from bs4
  • WPF DataGrid 分页

    我正在使用此处提供的示例StackOverflow相关问题 如果我在网格中有偶数个项目 那么它工作得很好 但如果例如我有一个奇数 例如 7 个项目 它会抛出超出范围的异常 我通过添加此行来修复该异常 public override obje
  • Typescript:如何从返回函数的输入参数推断高阶函数中的泛型类型

    type FindCallback
  • 鸭子类型和类方法(或者,如何使用类和实例中的方法?)

    我有一些代码 我想互换地传递实例或类 我在该代码中要做的就是调用一个我希望类和实例都具有的方法 该方法go 在下面的例子中 不幸的是 我无法创建与常规方法同名的类方法 请参见下面的示例 我最初预计第二次调用会产生一个a代替b 关于如何实现这
  • 使用 RestSharp 为 Etsy 的 API 调用 oauth/request_token 获取签名无效

    我正在尝试使用休息锐利访问 Etsy 的 API 这是我尝试获取 OAuth 访问令牌时使用的代码 var authenticator OAuth1Authenticator ForRequestToken ConfigurationMan
  • 高unicode码点如何表示为两个码点?

    I ve seen像 U 10000 这样 gt 2 字节的 unicode 代码点可以写成一对 就像 uD800 uDC00 他们似乎是从啃咬开始的d 但这就是我所注意到的 这种分裂动作叫什么 它是如何工作的 UTF 8的意思是 用我自己
  • 未为参数指定实参

    使用 VB net 和 WPF 我已经转换了可用的代码使用装饰器覆盖 WPF 中的控件从 C 到 VB Net 原始 C 代码
  • Java中如何按两个字段排序?

    我有对象数组person int age String name 如何按名称字母顺序排序此数组 然后按年龄排序 您会为此使用哪种算法 您可以使用Collections sort如下 private static void order Lis
  • 使用 GSON 解析嵌套 JSON 数据

    我正在尝试使用 Java 中的 gson 解析一些 JSON 数据 其结构如下 但通过查看在线示例 我找不到任何可以完成这项工作的东西 有人可以帮忙吗 data id stuff values 123 456 123
  • 在 Salesforce iOS SDK 中查询用户名

    我有一个使用最新 Salesforce iOS SDK 的 iOS 应用程序 它使用 Salesforce 站点上的 oAuth2 0 通过 Web 视图对用户进行身份验证 因此我不会在应用程序中捕获用户名 有没有办法可以使用 API 或会
  • Swift:如果计时器从函数启动,如何使计时器无效?

    我有一个timer函数中的变量如下所示 timer NSTimer func whatever timer NSTimer scheduledTimerWithTimeInterval 1 target self selector time
  • 清除应用程序数据不会清除 GCM 令牌或 GCM 订阅主题

    我已经订阅了 GCM 的主题 当我通过 Android 设置删除所有应用程序数据时 GCM 令牌是相同的 并且有关主题的 GCM 通知仍然可用 因此我收到了我不想收到的通知 我的问题是 如何获取 GCM 订阅的所有主题的列表 如何在不知道主
  • 使用 Javascript/Jquery 上下移动节点 Div

    我想知道 Javascript 中是否有一种方法可以在没有 id 的情况下上下移动节点 div 元素 当选择该项目并右键单击时 将出现 上移 和 下移 选项 现在在 上移 上单击它应该在 div 中上移 例如 div div 1 div d
  • std::vector 实现是否使用内部数组或链表或其他?

    有人告诉我 std vector 在内部实现上有一个 C 风格的数组 但这不会否定动态容器的全部目的吗 那么在向量中插入一个值是 O n 操作吗 还是像链表那样 O 1 来自 C 11 标准 在 序列容器 库部分 强调我的 23 3 6 1
  • 如何计算进程id的执行指令数,包括所有未来的子线程

    前段时间 我问了以下问题 如何统计进程id 包括子进程 的执行指令数 M Iduoad 提供了一个解决方案pgrep捕获所有子 PID 并将其与 perf stat 中的 p 一起使用 效果很好 然而 我遇到的一个问题是多线程应用程序以及当
  • 在 ASP.NET 中管理实体框架 ObjectContext

    我正在将实体框架用于 ASP NET Web 表单应用程序 我想知道应该如何处理ObjectContext这是一生 例如 我有一个InviteService管理邀请的类 例如创建和接受邀请 该类本身位于 Web 项目的另一个项目 命名空间中
  • 在 Fedora 容器中,systemctl 给出 Failed to get D-Bus connection

    当我在 Fedora 容器中使用 systemctl 时 我得到 无法获得 D Bus 连接 未知错误 1 有人知道如何解决这个问题吗 或者说systemctl不能在docker容器中使用吗 The systemctl命令与systemd通
  • 根据 Google 表格中单列中的重复项删除行

    我有与此类似的电子表格 我想根据第一列数据删除行的所有重复项 因此 在此屏幕截图行中 将保留第 1 行和第 2 行 并删除第 2 行 任何帮助将不胜感激 附 在我的例子中 列从 A 到 AU 行从 2 到 9500 谢谢 Maya s an
  • 如何在同一个循环中同时循环所有 Firebase 子项?

    我在 firebase 中有三个节点 我想使用相同的循环来循环它们 我成功地能够使用以下代码循环遍历单个节点 cookie databaseRef child cookies observeSingleEvent of value with
  • 从 Java 到 PHP 重新创建 PDF 文件

    我有一个 Java 中的 WebService 使用 Apache Axis 它获取文档的 id 并调用 JasperReports 来创建 PDF 文件 之前在 java 应用程序中创建的报告 服务器端 以创建我正在使用的方法的报告 Ja