2012-01-18 15 views
14

मैं एक लिंक में पीडीएफ फ़ाइल डाउनलोड करने योग्य कैसे बना सकता हूं?पीडीएफबॉक्स (दूषित पीडीएफ) के साथ डाउनलोड करने योग्य पीडीएफ कैसे उत्पन्न करें?

मैं जेएसएफ का उपयोग कर एक वेब एप्लिकेशन बना रहा हूं, जब उपयोगकर्ता "पीडीएफ के रूप में सहेजें" लिंक पर क्लिक करता है तो पीडीएफ डाउनलोड होने के लिए उपलब्ध होना चाहिए।

अभी तक मेरे पास एक कामकाजी कोड है जो पीडीएफ फ़ाइल उत्पन्न करता है, लेकिन फ़ाइल मेरे डेस्कटॉप पर सहेजी जाती है और मैं क्या करना चाहता हूं यह है कि जब उपयोगकर्ता लिंक पर क्लिक करता है तो पीडीएफ फ़ाइल को डाउनलोड करने के बजाय डाउनलोड करने योग्य होना चाहिए ऐप में संग्रहीत।

अद्यतन 3: आपकी मदद के लोगों के लिए धन्यवाद, मैं अपने सुझाव के साथ मेरी कोड modifed और यह काम कर रहा।

अद्यतन 2: मैं निम्न त्रुटि हो रही है: Adoble रीडर "yourfile.pdf" खुल नहीं सका क्योंकि या तो नहीं एक समर्थित फ़ाइल प्रकार या है, क्योंकि फ़ाइल

क्षतिग्रस्त हो गया है अद्यतन 1: मैं परिवर्तन तुम मुझे बताया है साथ मेरे वर्तमान कोड जोड़ रहा है, तथापि मैं अभी भी इस काम

This is my method that generated the PDF:

के लिए संघर्ष कर रहा हूँ Adoble रीडर "yourfile.pdf" खुल नहीं सका क्योंकि या तो नहीं एक:
public ByteArrayOutputStream createPDF() throws IOException, COSVisitorException { 

    PDDocument document; 
    PDPage page; 
    PDFont font; 
    PDPageContentStream contentStream; 
    PDJpeg front; 
    PDJpeg back; 

    InputStream inputFront; 
    InputStream inputBack; 
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 

    // Creating Document 
    document = new PDDocument(); 

    // Creating Pages 
    for(int i=0; i<2; i++) { 

     page = new PDPage(); 

     // Adding page to document 
     document.addPage(page); 

     // Adding FONT to document 
     font = PDType1Font.HELVETICA;   

     // Retrieve Image to be added to the PDF 
     inputFront = new FileInputStream(new File("D:/Media/imageFront.jpg")); 
     inputBack = new FileInputStream(new File("D:/Media/imageBack.jpg")); 

     BufferedImage buffFront = ImageIO.read(inputFront); 
     BufferedImage resizedFront = Scalr.resize(buffFront, 460); 

     BufferedImage buffBack = ImageIO.read(inputBack); 
     BufferedImage resizedBack = Scalr.resize(buffBack, 460); 

     front = new PDJpeg(document, resizedFront); 
     back = new PDJpeg(document, resizedBack); 

     // Next we start a new content stream which will "hold" the to be created content. 
     contentStream = new PDPageContentStream(document, page);     

     // Let's define the content stream 
     contentStream.beginText(); 
     contentStream.setFont(font, 8); 
     contentStream.moveTextPositionByAmount(10, 770); 
     contentStream.drawString("Amount: $1.00"); 
     contentStream.endText(); 

     contentStream.beginText(); 
     contentStream.setFont(font, 8); 
     contentStream.moveTextPositionByAmount(200, 770); 
     contentStream.drawString("Sequence Number: 123456789"); 
     contentStream.endText(); 

     contentStream.beginText(); 
     contentStream.setFont(font, 8); 
     contentStream.moveTextPositionByAmount(10, 760); 
     contentStream.drawString("Account: 123456789"); 
     contentStream.endText(); 

     contentStream.beginText(); 
     contentStream.setFont(font, 8); 
     contentStream.moveTextPositionByAmount(200, 760); 
     contentStream.drawString("Captura Date: 04/25/2011"); 
     contentStream.endText(); 

     contentStream.beginText(); 
     contentStream.setFont(font, 8); 
     contentStream.moveTextPositionByAmount(10, 750); 
     contentStream.drawString("Bank Number: 123456789"); 
     contentStream.endText(); 

     contentStream.beginText(); 
     contentStream.setFont(font, 8); 
     contentStream.moveTextPositionByAmount(200, 750); 
     contentStream.drawString("Check Number: 123456789"); 
     contentStream.endText();    

     // Let's close the content stream  
     contentStream.close(); 

    } 

    // Finally Let's save the PDF 
    document.save(output); 
    document.close(); 

    return output; 
} 

This is my servlet that call the previous code and generates the output and set the header:

try { 

     ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     output = createPDF(); 

     response.addHeader("Content-Type", "application/force-download"); 
     response.addHeader("Content-Disposition", "attachment; filename=\"yourFile.pdf\""); 
     response.getOutputStream().write(output.toByteArray()); 

    } catch (Exception ex) {    
     ex.printStackTrace(); 
    } 

मुझे यकीन है कि मैं के बाद से जब मैं पीडीएफ मैं त्रुटि मिली खोलने का प्रयास क्या याद कर रहा हूँ नहीं कर रहा हूँ समर्थित फ़ाइल प्रकार या क्योंकि फ़ाइल क्षतिग्रस्त हो गई है

+0

पुन "अद्यतन 2", यह यह बग हो सकता है: http://issues.apache.org/jira/browse/PDFBOX-2026। इसे 1.8.5 में तय किया जाएगा। या एक स्नैपशॉट डाउनलोड करें। –

+0

हैलो @ नाइट। मैं आपके द्वारा किए गए कार्यों के समान कुछ लागू करने की कोशिश कर रहा हूं। क्या आप कृपया अपने सर्वलेट के अंदर प्रतिक्रिया ऑब्जेक्ट घोषणा कर सकते हैं? या शायद पूरा कोड पोस्ट कर सकते हैं? – Erick

उत्तर

7

ब्राउज़र को फ़ाइल डाउनलोड करने के लिए आपको उचित http शीर्षलेख सेट करने की आवश्यकता है।

response.addHeader("Content-Type", "application/force-download") 
response.addHeader("Content-Disposition", "attachment; filename=\"yourFile.pdf\"") 
+0

मैंने अपने प्रश्न में एक नमूना कोड भी जोड़ा, मैंने हेडर भी जोड़े लेकिन मुझे पीडीएफ फ़ाइल खोलने का प्रयास करते समय निम्न त्रुटि मिली: एडोबल रीडर "yourfile.pdf" नहीं खोल सका क्योंकि या तो समर्थित फ़ाइल प्रकार नहीं है या क्योंकि फाइल क्षतिग्रस्त हो गई है। –

+0

"yourfile।पीडीएफ "एक फ़ाइल नाम होना चाहिए जो आप उत्पन्न कर रहे हैं। मैंने केवल नमूना नाम के रूप में शामिल किया है। बैकस्लैश और उद्धरण को हटाने का प्रयास करें। – jloper3

+0

response.addHeader (" सामग्री-विस्थापन "," अनुलग्नक; फ़ाइल नाम = yourFile.pdf ") – jloper3

4

मैंने थोड़ी देर में ऐसा नहीं किया है, इसलिए मेरे साथ सहन करें, लेकिन आप क्या करते हैं पीडीएफ को स्ट्रीम के माध्यम से फ़ाइल में सहेजने के बजाय, आप स्ट्रीम में स्ट्रीम को सहेजते हैं एक बाइट सरणी के रूप में और फिर जब उपयोगकर्ता लिंक पर क्लिक करता है, तो आप एमआईएमई प्रकार को पीडीएफ पर सेट करते हैं और फिर बाइट सरणी को एक स्ट्रीम के रूप में खोलते हैं जिसे आप फिर से लौटते हैं प्रायोजक। विवरण पर थोड़ा आलसी होने के लिए मैं क्षमा चाहता हूं। मुझे लगता है कि मैंने इसे करने के लिए jpedal और iText का भी उपयोग किया।

import com.itextpdf.text.BaseColor; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Paragraph; 
import com.itextpdf.text.Phrase; 
import com.itextpdf.text.pdf.PdfPCell; 
import com.itextpdf.text.pdf.PdfPTable; 
import com.itextpdf.text.pdf.PdfWriter; 
import com.itextpdf.text.pdf.draw.DottedLineSeparator; 

... // class, etc. 

public ByteArrayOutputStream createOrderFormPdf(OrderFormDTO dto) 
     throws DocumentException { 
    Document document = new Document(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    PdfWriter.getInstance(document, baos); 
    document.open(); 

    Paragraph header = new Paragraph(); 
    header.add(new Phrase(...)); 

    OrderFormDtoPdfAdapter pdfAdapter = new OrderFormDtoPdfAdapter(dto); 
    header.add(pdfAdapter.getPdfHeaderTable()); 

    document.add(header); 

      ... // other code 

    Paragraph footer = new Paragraph(); 
    footer.add(pdfAdapter.getPDFFooterTable()); 

    document.add(footer); 
    Paragraph paragraph = new Paragraph(); 
    PdfTableUtils.addEmptyLine(paragraph, 2); 

    document.add(paragraph); 
    document.add(new DottedLineSeparator()); 

    document.close(); 

    return baos; 
} 

फिर आप एक पीडीएफ सही MIME प्रकार का उपयोग कर के रूप में आप अपनी प्रतिक्रिया पर baos बाहर लिख सकते हैं:

मैं तुम्हें कोड के सभी नहीं दिखा सकते हैं, लेकिन यहाँ कुछ है।

+0

मैंने आपकी प्रतिक्रिया के आधार पर अपने कोड के संशोधित संस्करण के साथ अपना प्रश्न अपडेट किया। –

संबंधित मुद्दे