Leia o BLOB (conteúdo em PDF) do banco de dados e edite e envie o arquivo editado em PDF sem criar o arquivo físico

Estou usando um banco de dados Oracle e armazenando conteúdo em PDF em um campo BLO

Eu quero ler o conteúdo do BLOB e depois editar e gerar o conteúdo editad

A edição que preciso fazer é:

adicione um título acima do conteúdo do BLOB adicione uma marca d'água em todas as páginasadicionar rodapé em todas as páginas

Então preciso gerar o arquivo sem que nenhum arquivo físico seja criado dentro do fluxo de respost

Tentei fazer isso usando o itext, mas não estava chegando a lugar nenhum. Estou preso e não sei por onde começar.

Também às vezes eu posso ter que combinar o conteúdo dos blobs em um, mas isso é algo que está prestes a acontecer Uma vez em um milhão ... então isso não é uma preocupação agora ...

Como posso atingir meus requisitos principais das três etapas acima usando java? É possível com o Itext ?? Ou alguma outra biblioteca disponível que ajudaria?

Banco de Dados: Oracle 10g Release 2

OS: Linux Fedora / Redhat

Front-end: Java / Servlet / JSP

EDITA

Aqui está o que eu tentei fazer

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();

O programa gera o conteúdo pdf no campo BLOB no banco de dados e sem o títul

e quando mudo um pouco no código (altere a ordem das últimas linhas) para:

document.close();
servletOutputStream.flush();
servletOutputStream.close();

Eu recebo o documento com o conteúdo do título e nenhum conteúdo em PDF do campo BLOB. É a primeira coisa (servletoutputstream / documento) que é fechada é lançada como saída.

E quando fechei o documento antes de colocar o conteúdo do blob no fluxo de saída:

document.close();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=output.pdf");
servletOutputStream.write(bytes, 0, bytes.length);
servletOutputStream.flush();
servletOutputStream.close();

Eu tenho o navegador exibindo algo como isto:

%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 

Preciso que o arquivo seja gerado com o conteúdo em pdf e o título també

Espero que esta edição ajude um pouco ...

UPDATE (arquivo descartado em resposta ao título e ao conteúdo do 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();

}

Isso me fornece um arquivo em resposta que possui o BLOB do DB com o título na parte superior e é feito sem que nenhum arquivo físico seja gerad

Agora, para gerar a marca d'água e preciso passar o documento para o PDfreader, como posso fazer isso antes de fechar o documento (por exemplo, executandodocument.close(), que colocaria o arquivo sem marca d'água quando o fluxo foi fechado)

O que estou fazendo de errado neste código? Como posso obter o mesmo arquivo com a marca d'água e isso também sem que um arquivo seja criado em segundo plan

questionAnswers(2)

yourAnswerToTheQuestion