java blob 导出_java – 从数据库中读取BLOB(PDF内容)并编辑和输出PDF编辑的文件,而无需创建物理文件...

这篇博客讨论了如何在Java中从Oracle数据库读取BLOB(PDF内容),然后编辑(添加标题、水印和页脚)并直接通过HTTP响应流输出,避免创建物理文件。博主遇到的问题包括如何正确地合并标题和BLOB内容,以及如何在不保存到磁盘的情况下添加水印。解决方案涉及到使用iText库进行PDF操作。
摘要由CSDN通过智能技术生成

我正在使用Oracle数据库并将PDF内容存储在BLOB字段中.

我想阅读BLOB内容,然后编辑并输出编辑过的内容.

我需要做的编辑是:

>在BLOB内容上方添加标题

>在每页上添加水印

>在每个页面上添加页脚

然后我需要输出文件,而不会在响应流中创建任何物理文件.

我尝试使用itext实现这一点,但没有到达任何地方.我被困住了,不知道从哪里开始.

有时候我可能不得不将blob内容组合成一个,但有些东西必然会发生在一百万……所以现在不是一个问题……

如何在java中实现上述三个步骤的主要要求? Itext可以吗?或者是否有其他可用的库?

数据库:Oracle 10g第2版

操作系统:Linux Fedora / Redhat

前端:Java / Servlet / JSP

编辑

这是我试图做的

oracle.sql.BLOB blob = (BLOB) rs.getBlob("MYPDF");

byte[] bytes = blob.getBytes(1,(int) blob.length());

InputStream is = blob.getBinaryStream();

Document document=new Document();

ServletOutputStream servletOutputStream = response.getOutputStream();

PdfWriter writer=PdfWriter.getInstance(document,servletOutputStream);

document.open();

document.add(new Paragraph("Some title"));

document.add(new Paragraph("Some title"));

response.setContentType("application/pdf");

response.setHeader("Content-Disposition","attachment; filename=output.pdf");

servletOutputStream.write(bytes,bytes.length);

servletOutputStream.flush();

servletOutputStream.close();

document.close();

该程序在数据库中的BLOB字段中输出pdf内容而没有标题.

当我在代码中更改一点(将最后几行的顺序更改为)时:

document.close();

servletOutputStream.flush();

servletOutputStream.close();

我得到了包含标题内容的文档,没有BLOB字段的pdf内容.

它关闭的第一件事(servletoutputstream / document)被抛出作为输出.

当我在输出流中放入blob内容之前关闭文档时:

document.close();

response.setContentType("application/pdf");

response.setHeader("Content-Disposition",bytes.length);

servletOutputStream.flush();

servletOutputStream.close();

我让浏览器显示如下内容:

%PDF-1.4 %���� 2 0 obj Box[0 0 595 842]>> endobj 1 0 obj

我需要用pdf内容和标题输出文件.

希望这个编辑有点帮助……

UPDATE(文件因标题和BLOB内容而被抛出):

Document document = new Document(PageSize.A4,108,72,30,72);

PdfWriter writer = PdfWriter.getInstance(document,outputstream);

document.open();

///-----Added Some Title----///

rs = stmt.executeQuery(queryToGetBLOBCONTENT);

if (rs.next()) {

response.setContentType("application/pdf");

response.setHeader("Content-Disposition","attachment; filename=watermark.pdf");

oracle.sql.BLOB blob = (BLOB) rs.getBlob("MYPDF");

byte[] bytes = blob.getBytes(1,(int) blob.length());

InputStream is = blob.getBinaryStream();

PdfReader pdfReader = new PdfReader(is,bytes);

BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,BaseFont.CP1252,BaseFont.NOT_EMBEDDED);

PdfContentByte cb = writer.getDirectContent(); // Holds the PDF

PdfImportedPage page;

int currentPageNumber = 0;

int pageOfCurrentReaderPDF = 0;

while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {

if (pageOfCurrentReaderPDF > 0) {

document.newPage();

}

pageOfCurrentReaderPDF++;

currentPageNumber++;

page = writer.getImportedPage(pdfReader,pageOfCurrentReaderPDF);

cb.addTemplate(page,0);

}

pageOfCurrentReaderPDF = 0;

outputstream.flush();

document.close();

outputstream.close();

}

这给了我一个响应文件,它有一个来自DB的BLOB,标题在顶部,并且没有生成任何物理文件.

现在要生成水印,我需要将文档传递给PDfreader,如何在关闭文档之前实现该目标(即执行document.close(),这会在文件流关闭时将文件放在水印上)

我在这段代码中做错了什么?如何使用水印实现相同的文件,如果没有在后台创建文件也是如此.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值