小编典典

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

jsp

我正在使用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内容放入outputstream之前关闭文档时:

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内容和标题一起输出。

希望此编辑对您有所帮助…

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, 0);
}
pageOfCurrentReaderPDF = 0;
outputstream.flush();
document.close();
outputstream.close();

}

这给了我一个响应文件,该文件的DBBLOB标题在顶部,并且没有生成任何物理文件。

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

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


阅读 743

收藏
2020-06-08

共1个答案

小编典典

您可以尝试以下方法,而不是直接写入servletOutputStream:

  1. 创建ByteArrayOutputStream的实例
  2. 创建“合并的” PDF文档的实例。即具有标题的PDF表单Blob + PDF。该示例可能会有所帮助:http : //java-x.blogspot.com/2006/11/merge-pdf-files-with-itext.html
  3. 将合并的PDF写入ByteArrayOutputStream的实例
  4. 设置响应的内容长度
  5. 设置内容类型和内容处置
  6. 从ByteArrayOutputStream获取字节并将这些字节写入servletOutputStream
  7. 关闭ByteArrayOutputStream
2020-06-08