Rails PDF Generation مع الروبيان في IE7
-
21-09-2019 - |
سؤال
أنا أستخدم الجمبري والقريدس لإنشاء ملف PDF في تطبيق Ruby On Rails (الإصدار 2.2.2) الذي يعمل بشكل رائع وينشئ PDFs بسعادة ويرسلها إلى المستخدم للتنزيل في Firefox.
المشكلة في IE7.
لدي طريق تم إعداده مثل:
map.invoice_pdf '/invoices.pdf', :controller => 'invoices',
:action => 'index', :format => 'pdf'
الذي لدي رابط مثل ذلك للاتصال:
invoice_pdf_path(:year => params[:year], :month => params[:month],
:unpaid_only => params[:unpaid_only])
وما يلي في وحدة التحكم الخاصة بي:
def index
params[:year] = default params[:year]
params[:month] = default params[:month]
params[:page] ||= 1
@invoices = Arobl.find_invoices_for_customer(current_customer.strCustomerID,
params)
respond_to do |format|
format.html{ render :action => 'index' }
format.pdf{
prawnto :inline => false, :filename =>
"#{current_customer.strCustomerID}_invoice.pdf"
end
في FF ، يعمل هذا كما هو متوقع ، عند النقر فوق الرابط ، يتم استدعاء إجراء العرض بتنسيق .pdf ، ويستجيب بـ PDF المسمى بشكل صحيح. عندما يتم ضربه مع IE7 ، فإنه لا يمكن العثور على الملف أو موقع الويب ، والمراجع "الفواتير.
أي فكرة عما يمكن أن يسبب هذا السلوك؟
شكرًا!
المحلول 4
كحل مؤقت ، استخدمت النهج الموثق هنا: http://chelsearbb.wordpress.com/2009/09/09/saving-a-prawn-pdf-to-file/ وقم بحفظ الملف محليًا ، واستخدم send_data و file.read ، ثم حذف الملف الذي يبدو أنه يعمل بشكل جيد في جميع المتصفحات.
ما زلت أشعر بالفضول حول سبب عدم عمله في IE7 سابقًا.
نصائح أخرى
أواجه هذه المشكلة أيضًا. عندما أحاول أن أطلب نفس PDF بدون SSL على Internet Explorer (7 أو 8) ، فهو يعمل ، ولكن إذا طلبت ذلك مع SSL ، فإنه لا يعمل ...
نعتقد أننا قد نتعقب هذا إلى الرؤوس التي تتوقعها IE عند تنزيل PDF. لم أتحقق من رمز المصدر الربيدي لمعرفة الرؤوس التي حددها ، لكن من المحتمل أن نستخدم بعض البرامج الوسيطة على الرف لضخ الرؤوس التي نحتاجها:
# add headers for PDF downloads in IE
# PDFs not downloading correctly via SSL in IE
# solution: add some headers for PDF downloads
# http://marc.info/?l=php-general&m=124301243808544&w=2
class RackAddPdfHeadersForIe
def initialize( app )
@app = app
end
def call( env )
@status, @headers, @body = @app.call env
add_headers if is_pdf? and is_internet_explorer?
[@status, @headers, @body]
end
def is_pdf?
@headers['Content-Type'] =~ /pdf/
end
def is_internet_explorer?
@headers['User-Agent'] =~ /MSIE ([0-9]{1,}[\.0-9]{0,})/
end
def add_headers
@headers['Content-Description'] = 'File Transfer'
@headers['Content-Transfer-Encoding'] = 'binary'
@headers['Expires'] = '0'
@headers['Pragma'] = 'public'
end
end
لذلك جربت هذا ، اعتقدت أنه سيعمل ، ثم وجدت أنه في الواقع لم ينجح.
لذلك انتهى بي الأمر القيام بذلك ، لأي سبب من الأسباب ، لقد نجح هذا بالنسبة لي:
class ReportsController < ApplicationController
def payroll_summary
respond_to do |format|
format.pdf do
response.headers['Content-Disposition'] = "attachment;filename=\"#{action_name}.pdf\""
response.headers['Content-Description'] = 'File Transfer'
response.headers['Content-Transfer-Encoding'] = 'binary'
response.headers['Expires'] = '0'
response.headers['Pragma'] = 'public'
render
end #format.pdf
end #respond_to
end #payroll_summary
end
تم شرح قضية IE هذه في http://support.microsoft.com/kb/323308
الحل هو ضبط رأس التحكم في ذاكرة التخزين المؤقت إلى شيء آخر غير متجر مع شيء مثل:
response.headers["Cache-Control"] = "private, max-age=0, must-revalidate"
من المحتمل أن يصادف المزيد من الأشخاص في هذا الأمر ، حيث يبدو أن Rails 2.3.6+ يضعون التحكم في ذاكرة التخزين المؤقت إلى أي متجر لم تكن الإصدارات السابقة.
لقد طاردت مشكلتي إلى ملف Compile_Support.rb الخاص بـ Prawnto.
# added to make ie happy with ssl pdf's (per naisayer)
def ssl_request?
@controller.request.env['SERVER_PROTOCOL'].downcase == "https"
end
كنا نرى أن متغير env من Apache Server_protcol تم تعيينه دائمًا على HTTP/1.1 حتى عند استخدام HTTPS. متى SSL_Required؟ كاذب وهو طلب من IE prawnto سوف يعين pragma = "عدم وجود آذان". هذا هو ما كان يسبب قضايانا.
إذا كان تطبيقك يستخدم HTTPS فقط ، فيمكنك تغيير هذه الوظيفة لإرجاع True دائمًا. إذا لم يكن هذا كافياً ، يمكنك كتابة توجيه Apache على غرار:
setenv server_protocol "https"
لقد وضعت هذا بشكل صحيح في ملف ssl.conf الخاص بي وكل شيء يعمل الآن كما هو متوقع.