Lire la GOUTTE (le Contenu PDF) à partir de la base de données et d'édition et de sortie PDF fichier modifié sans créer de fichier physique

Je suis en utilisant une Base de données Oracle et le stockage de contenu PDF dans un champ BLOB.

Je veux lire le contenu BLOB et ensuite les modifier et de sortie du contenu modifié.

L'édition j'ai besoin de faire sont:

  • ajouter un titre au-dessus du contenu BLOB
  • ajouter une marque d'Eau sur chaque page
  • ajouter un pied de page sur chaque page

Alors j'ai besoin de générer le fichier sans fichier physique se créé, qui est à l'intérieur du flux de la réponse.

J'ai essayé de réaliser cela à l'aide de la bibliothèque itext mais n'a pas été atteint partout avec elle. Je suis coincé et ne savez pas par où commencer.

Aussi parfois je pourrais avoir à combiner le contenu d'un objet blob en un seul, mais c'est quelque chose qui est lié à se produire une Fois sur un million..de telle sorte que pas un souci maintenant...

Comment puis-je atteindre mes exigences primaires de trois étapes ci-dessus à l'aide de java? Est-il possible avec Itext?? Ou une autre bibliothèque que l'on ne dispose de l'aide?

Base de données : Oracle 10g Release 2

OS: Linux Fedora/Redhat

Avant la fin de l': Java/Servlet/JSP

MODIFIER

Voici ce que j'ai essayé de faire

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

Le programme des sorties le contenu pdf dans un champ BLOB dans la base de données et sans le titre.

et quand j'ai changer un peu dans le code (modifier l'ordre de la dernière quelques lignes):

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

- Je obtenir le document avec le titre du contenu, et pas de pdf le contenu du champ BLOB.
C'est la première chose(servletoutputstream/document) qui est fermé a été jeté comme la sortie.

Et quand j'ai fermé le document avant de mettre le contenu blob dans 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();

J'ai eu le navigateur affichant quelque chose comme ceci:

%PDF-1.4 %���� 2 0 obj <>stream x�+�r 26S00SI2P5��1���BҸ4��sSJ2KrR5C��*PB5�+��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 

J'ai besoin du fichier à éditer le fichier pdf contenu et le titre.

Espère que cette édition vous aide un peu...

Mise à JOUR(Fichier jeté en réponse avec le titre et le Contenu 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();

}

Cela me donne un fichier de réponse qui a une tache de DB avec titre sur le dessus et c'est fait sans aucun physique de fichiers générés.

Maintenant, de générer de la marque d'eau et j'ai besoin de transmettre le document à la PDfreader comment puis-je réaliser que avant de fermer le document (c'est à dire l'exécution de document.close() , qui serait hors mis le fichier w/o la marque d'eau comme le flux est fermé)

Ce que je fais mal dans ce code? Comment puis-je obtenir le même fichier avec le filigrane et que trop sans un fichier se créé à l'arrière-plan.

OriginalL'auteur Sangeet Menon | 2011-03-28