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 �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
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
Vous devez vous connecter pour publier un commentaire.
Au lieu d'écrire directement à servletOutputStream, vous pouvez essayer cette approche:
PDF n'a pas besoin de venir à partir d'un fichier. Pour la fusion, l'un des PDF serait de BLOB (ByteArrayInputStream) et un autre fichier PDF sera créé lors de l'exécution avec le titre qui est généré dynamiquement. Les deux peuvent remian en mémoire et être exposée en tant que Tableau d'Octets Flux au format PDF API.
Le code sur le lien fait la job dans une certaine mesure, mais une ligne de code,
while (pageOfCurrentReaderPDF <pdfReader.getNumberOfPages()) {document.newPage();...
dans le lien que tu as donné met le contenu de la nouvelle page...c'est très bien pour toutes les pages sauf la première page...j'ai besoin de la GOUTTE de contenu pour commencer à partir de la ligne suivante, où le titre se termine...essayé de supprimer lesocument.newPage();
pour la première page, mais le titre et le contenu blob obtenu superposées...j'ai besoin d'obtenir les coordonnées decb.addTemplate(page, 0, 0);
qui est réglé sur 0,0 dans le code...comment puis-je obtenir de l'endroit exact où le titre se termineSeule façon de cul titre en serait à se rétrécir reste du contenu sur la première page. Ce serait déformer beaucoup de documents perceptible. Dans ce cas, il est préférable d'ajouter que le titre de la nouvelle page, et garder le reste du document, tel qu'il est.
Ok très bien pour le moment je laisse le contenu à venir sur la nouvelle page, mais mon prochain problème est que j'ai besoin d'ajouter une marque d'eau sur elle...et sans trop d'un fichier se créé....est-ce possible d'aller de l'avant avec la procédure décrite dans le lien?? Si oui, Merci de me dire comment..
OriginalL'auteur Shamit Verma
Si vous ne voulez pas créer de fichiers temporaires, alors vous avez juste besoin d'obtenir le PDF comme un
InputStream
à partir de la DB et de laisser iText lire et écrire à laOutputStream
de la réponse. Votre question est trop large pour donner bien adapté à la réponse ("je ne suis pas aller nulle part" ne donne pas beaucoup de travailler avec), voici donc une large réponse:Vous pouvez également passer une
ByteArrayOutputStream
à la place.Mise à jour selon votre les problèmes:
Vous devez définir les en-têtes de réponse avant vous passer le corps de la réponse à
PdfWriter
.Se débarrasser des lignes suivantes. Ils ne messup choses.
La
PdfWriter
déjà écrire le corps de la réponse. Vous n'avez pas besoin de répéter vous-même.OriginalL'auteur BalusC