iText pdf 生成在 Android 浏览器上失败
iText pdf generation fails on Android browsers
我在 Android 设备上的应用程序使用 iText 时出现一些奇怪的行为。这是一个典型的 Java/Spring 网络应用程序,没什么特别的,它使用 iText 生成一些简单的 pdf(没什么大不了的,文件大小约为 50k)。
它只是标准的 response.setContentType("application/pdf");
,在我试过的每个桌面浏览器中都可以正常工作,在 iOS 上也可以,但在我的每个 Android 设备上都失败已经测试过了。好吧,大部分都失败了...
在 Samsung Galaxy 设备上,我自己的 Note 4 (运行 Android 5.0.1) 和其中一款 10" 平板电脑,在标准浏览器和 Chrome 上,它根本无法下载 - 它抛出一个通知“controllerName.bin 下载失败”,其中 pdf 的实际名称被触发生成它的控制器的名称替换。
它实际上会在原版浏览器和 Chrome 上的 HTC One M9 (运行 Android 5.1) 上下载,但它仍然会用控制器名称替换 pdf 名称并将其下载为 .bin 而不是 pdf。将文件重命名为 pdf 可以完美打开它。对于 Android 在 Galaxy 设备上的 Firefox,它也会以这种方式下载。
Windows Apple 设备没有问题,它只在 Android 上执行此操作。我正在尝试找到任何适用于大多数设备的一致方法,我只是在 Android 方面超出了我的理解范围。任何指点或建议将不胜感激。
我想我已经按照@Bruno 的PdfServlet 示例解决了这个问题(再次感谢您!)。
这个东西的原始开发者是这样调用 PdfWriter 的,
PdfWriter.getInstance(document, response.getOutputStream());
似乎 response.getOutputStream()
是罪魁祸首,导致了 Android 上的奇怪行为。
在示例代码中,我将其更改为使用 ByteArrayOutputStream:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
然后将输出写回servlet输出流:
// write ByteArrayOutputStream to the ServletOutputStream
OutputStream os = response.getOutputStream();
baos.writeTo(os);
os.flush();
os.close();
就这样,在 Android 台设备上的行为一致。
我在 Android 设备上的应用程序使用 iText 时出现一些奇怪的行为。这是一个典型的 Java/Spring 网络应用程序,没什么特别的,它使用 iText 生成一些简单的 pdf(没什么大不了的,文件大小约为 50k)。
它只是标准的 response.setContentType("application/pdf");
,在我试过的每个桌面浏览器中都可以正常工作,在 iOS 上也可以,但在我的每个 Android 设备上都失败已经测试过了。好吧,大部分都失败了...
在 Samsung Galaxy 设备上,我自己的 Note 4 (运行 Android 5.0.1) 和其中一款 10" 平板电脑,在标准浏览器和 Chrome 上,它根本无法下载 - 它抛出一个通知“controllerName.bin 下载失败”,其中 pdf 的实际名称被触发生成它的控制器的名称替换。
它实际上会在原版浏览器和 Chrome 上的 HTC One M9 (运行 Android 5.1) 上下载,但它仍然会用控制器名称替换 pdf 名称并将其下载为 .bin 而不是 pdf。将文件重命名为 pdf 可以完美打开它。对于 Android 在 Galaxy 设备上的 Firefox,它也会以这种方式下载。
Windows Apple 设备没有问题,它只在 Android 上执行此操作。我正在尝试找到任何适用于大多数设备的一致方法,我只是在 Android 方面超出了我的理解范围。任何指点或建议将不胜感激。
我想我已经按照@Bruno 的PdfServlet 示例解决了这个问题(再次感谢您!)。
这个东西的原始开发者是这样调用 PdfWriter 的,
PdfWriter.getInstance(document, response.getOutputStream());
似乎 response.getOutputStream()
是罪魁祸首,导致了 Android 上的奇怪行为。
在示例代码中,我将其更改为使用 ByteArrayOutputStream:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
然后将输出写回servlet输出流:
// write ByteArrayOutputStream to the ServletOutputStream
OutputStream os = response.getOutputStream();
baos.writeTo(os);
os.flush();
os.close();
就这样,在 Android 台设备上的行为一致。