سؤال

أنا أستخدم JSF 2.0 (Eclipse IDE) ولدي طريقة في أحد الفول الذي يولد بعض ملفات PDF باستخدام Apache FOP 1.0. عندما أقوم بالنقر فوق الزر "MakePDF" على صفحة JSF الخاصة بي ، يفتح PDF الذي تم إنشاؤه في نفس النافذة حيث تكون صفحتي (ويجب أن أستخدم زر "العودة" بعد عرض/حفظ/طباعة PDF).

يمكنني تغيير هذا بطريقة عندما يتم الضغط على زر "MakePDF" ، يظهر مربع حوار Pop-Out القياسي ويسألني عما إذا كنت أرغب في حفظ الملف أو فتحه مع AdObereader.

هل هناك طريقة ، عندما أنقر على زر "MakePDF" الخاص بي ، يتم فتح PDF الذي تم إنشاؤه مباشرة في AdoBereader (ولا يزال لدي صفحة JSF الخاصة بي ولا أحتاج إلى تأكيد أي شيء) ؟؟؟ أيضًا (ليس من الضروري حقًا ، ولكن من الجيد معرفة ذلك) ، هل هناك طريقة لفتحها في نافذة جديدة أو إرسالها مباشرة إلى الطابعة؟

إليكم الجزء الرئيسي من الكود الخاص بي (قمت بحذف بعض الأشياء غير ذات الصلة):

public void makePDF(long contractId, int documentType) {

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    String basePath = externalContext.getRealPath("/");

    try {
        fopFactory.setUserConfig(new File(basePath + "/pdf_transform/config/userconfig.xml"));
        fopFactory.setBaseURL(basePath);
        fopFactory.getFontManager().setFontBaseURL(basePath);
    } catch (Exception e) {
        e.printStackTrace();
    } 
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    foUserAgent.setBaseURL(fopFactory.getBaseURL());

    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
    response.reset();
    response.setHeader("Content-Type", "application/pdf");
    response.setHeader("Content-disposition", "attachment");
    BufferedOutputStream output = null;

    try {
        output = new BufferedOutputStream(response.getOutputStream(), 10240);
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output);

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile));

        Source src = new DOMSource(makeXML(contract)); // my method
        Result res = new SAXResult(fop.getDefaultHandler());

        transformer.transform(src, res);

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

    facesContext.responseComplete();
}`

عندما أزيل response.setHeader("Content-disposition", "attachment"); يفتح في نفس النافذة ، وإلا فإنه يطلب مني حفظ أو فتح.

شكرا مقدما.

هل كانت مفيدة؟

المحلول

إن فتح طلب في نافذة جديدة ليس مصدر قلق مباشرة. إنه أكثر من قلق HTML.

يضيف target="_blank" إلى النموذج

<h:form target="_blank">

وسيقوم بإرسال الطلب إلى علامة تبويب/نافذة جديدة.

الإرسال إلى طابعة العميل مباشرة غير ممكن دون تقديم بعض الكود الذي يعمل على جانب العميل كرجل في الوسط ، مثل التطبيق.

نصائح أخرى

واجهت مشكلة مماثلة ولحسن الحظ وجدت طريقة أنيقة لحلها. إذا كان لدى شخص ما حل أفضل ، فيرجى إخبارنا بذلك.

استخدام الحالة: يقوم المستخدم بإدخال البيانات في نموذج تم إنشاؤه JSF ضروري لإنشاء PDF (يتم إنشاء PDF من servlet). إذا فشل التحقق من الصحة ، يتم تقديم رسائل الخطأ ولكن إذا تم فتح ملف PDF بشكل جيد في نافذة جديدة. :-)

بلدي الحل:

  1. في قالب.

    <ui:define name="head">
            <h:outputScript rendered="#{myBean.pdfDownloadable}">
                window.open('#{myBean.pdfUrl}',"pdfWindow","width=800,height=900,left=50,top=10")
            </h:outputScript>
    </ui:define>
    
  2. رابط الأمر الخاص بك في JSF-Form يشير إلى طريقة الإجراء في MyBean أيضًا (على سبيل المثال mybean.showpdf ())

  3. إذا كانت بيانات النموذج صالحة وتم استدعاء showpdf () ، فيمكنك تعيين حقل PDFDownload القابل للتحميل إلى صواب ويتم تقديم نفس النتيجة مرة أخرى ولكن هذه المرة مع window.open () فيه.

أتمنى أن يساعد شخص ما ..

إذا كنت ترغب في فتح ملف PDF مباشرة ، فاستخدم الثابتة والمتنقلة

response.setHeader("Content-Disposition", "inline");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top