gpt4 book ai didi

java - 从数据库中读取 BLOB(PDF 内容)并在不创建物理文件的情况下编辑和输出 PDF 编辑文件

转载 作者:搜寻专家 更新时间:2023-10-31 20:15:42 28 4
gpt4 key购买 nike

我正在使用 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, 0, 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", "attachment; filename=output.pdf");
servletOutputStream.write(bytes, 0, bytes.length);
servletOutputStream.flush();
servletOutputStream.close();

我的浏览器显示如下:

%PDF-1.4 %���� 2 0 obj <>stream x�+�r �26S�00SI�2P�5��1���BҸ4��sSJ2KrR5C��*P�B�5�+��k)&� endstream endobj 4 0 obj <<<>>>/MediaBox[0 0 595 842]>> endobj 1 0 obj <> endobj 3 0 obj <> endobj 5 0 obj <> endobj 6 0 obj <> endobj xref 0 7 0000000000 65535 f 0000000304 00000 n 0000000015 00000 n 0000000392 00000 n 0000000147 00000 n 0000000443 00000 n 0000000488 00000 n trailer <]/Info 6 0 R/Size 7>> startxref 620 %%EOF 

我需要输出带有 pdf 内容和标题的文件。

希望这个编辑能有点帮助......

更新(文件被抛出以响应标题和 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, 0);
}
pageOfCurrentReaderPDF = 0;
outputstream.flush();
document.close();
outputstream.close();

}

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

现在要生成水印,我需要将文档传递给 PDfreader 如何在关闭文档之前实现这一点(即执行 document.close() ,这将输出文件当流关闭时没有水印)

我在这段代码中做错了什么?如何在不在后台创建文件的情况下获得带有水印的相同文件。

最佳答案

如果您不想创建临时文件,那么您只需要从数据库中将 PDF 作为 InputStream 获取,然后让 iText 从中读取并最后写入 OutputStream 响应。您的问题实际上过于宽泛,无法给出合适的答案(“我什么都做不了”没有什么用处),所以这里有一个宽泛的答案:

InputStream input = resultSet.getBinaryStream("columnname");
PdfReader reader = new PdfReader(input);
// ...

OutputStream output = response.getOutputStream();
PdfWriter pdfWriter = PdfWriter.getInstance(document, output);
// ...

您也可以传递 ByteArrayOutputStream 代替。


根据您的问题更新:

  1. 在将响应正文传递给 PdfWriter 之前,您需要设置响应 header

    response.setContentType("application/pdf");
    response.setHeader("Content-Disposition", "attachment; filename=output.pdf");
    PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
    // ...
  2. 去掉下面几行。他们只会把事情搞砸。

    byte[] bytes = blob.getBytes(1, (int) blob.length());
    servletOutputStream.write(bytes, 0, bytes.length);
    servletOutputStream.flush();
    servletOutputStream.close();

    PdfWriter 将已经写入响应正文。你不需要自己重复。

关于java - 从数据库中读取 BLOB(PDF 内容)并在不创建物理文件的情况下编辑和输出 PDF 编辑文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5455334/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com