English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
قابلت في العمل مؤخرًا العديد من المشاكل. سألخصها. وظيفة هذا الكود الرئيسية هي تحويل صفحة JSP إلى PDF وتقديمها على الصفحة
يحتاج إلى استخدام ITEXT
String html = ServletUtils.forward(request,response,"/WEB-INF/jsp/depot/print/jhd.jsp"); // تنقل الطلب إلى jsp، وتقوم بتقديم المحتوى المفسر بعد ذلك وليس الطباعة على المتصفح //System.out.println(html); byte[] pdf = PDFUtils.html2pdf(html); response.setContentType("application/pdf"); response.setHeader("Content-Length",String.valueOf(pdf.length)); response.setHeader("Connection","keep-alive"); response.setHeader("Accept-Ranges","none"); response.setHeader("X-Frame-Options","DENY"); OutputStream out = response.getOutputStream(); out.write(pdf); out.flush(); public class ServletUtils { /** * هذا الطريقة الفوروارد لا تقوم بطباعة أي محتوى على المتصفح بعد إكمالها، بل تضيف إلى تدفق البيانات، وتنتهي بتحويلها إلى شكل نصي * @param request * @param response * @param src * @return */ public static String forward(HttpServletRequest request, HttpServletResponse response, String src) { try{ /* ↓↓↓↓↓重新构造response,修改response中的输出流对象,使其输出到字节数组↓↓↓↓↓ */ final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); final ServletOutputStream servletOutputStream = new ServletOutputStream() { @Override public void write(int b) throws IOException { byteArrayOutputStream.write(b); } @Override public boolean isReady() { return false; } @Override public void setWriteListener(WriteListener writeListener) { } }; final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream, "UTF-8")); response = new HttpServletResponseWrapper(response) { public ServletOutputStream getOutputStream() { return servletOutputStream; } public PrintWriter getWriter() { return printWriter; } }; /* ↑↑↑↑↑↑重新构造response,修改response中的输出流对象,使其输出到字节数组↑↑↑↑↑↑ */ //执行转发操作 request.getRequestDispatcher(src).forward(request, response); //将字节流内容转换为字符串 return new String(byteArrayOutputStream.toByteArray(),"utf-8"); } catch (Exception e){ throw new RuntimeException(e); } } } import com.itextpdf.text.*; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.tool.xml.Pipeline; import com.itextpdf.tool.xml.XMLWorker; import com.itextpdf.tool.xml.XMLWorkerFontProvider; import com.itextpdf.tool.xml.XMLWorkerHelper; import com.itextpdf.tool.xml.exceptions.CssResolverException; import com.itextpdf.tool.xml.html.CssAppliers; import com.itextpdf.tool.xml.html.CssAppliersImpl; import com.itextpdf.tool.xml.html.Tags; import com.itextpdf.tool.xml.parser.XMLParser; import com.itextpdf.tool.xml.pipeline.css.CSSResolver; import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline; import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline; import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline; import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext; import java.io.*; /** * pdf工具类 */ public class PDFUtils { /** * تحويل html إلى pdf وعدم العودة كنوع من بيانات الحزم pdf * @param html * @return pdf array of bytes * @throws IOException * @throws DocumentException * @throws CssResolverException */ public static byte[] html2pdf(String html) throws IOException, DocumentException,CssResolverException { Document document = new Document(PageSize.A4); ByteArrayOutputStream os = new ByteArrayOutputStream(); PdfWriter writer = PdfWriter.getInstance(document,os); document.open(); XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(){ @Override public Font getFont(String fontname, String encoding, float size, int style) { return super.getFont(fontname == null ? "宋体" : fontname, encoding, size, style); } }; fontProvider.addFontSubstitute("lowagie", "garamond"); fontProvider.setUseUnicode(true); //استخدام مقدمتي الأحرف الخاصة بنا، وإعدادها كنمط أحرف Unicode CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers); htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true); Pipeline<?> pipeline = new CssResolverPipeline(cssResolver,new HtmlPipeline(htmlContext, new PdfWriterPipeline(document,writer))); XMLWorker worker = new XMLWorker(pipeline, true); XMLParser p = new XMLParser(worker); p.parse(new InputStreamReader(new ByteArrayInputStream(html.getBytes("gbk")))); document.close(); return os.toByteArray(); } }
ما ذكرته أعلاه هي طريقة تحويل صفحة JSP الديناميكية إلى PDF وعرضها على الصفحة التي قد تكون مفيدة لكم، إذا كان لديكم أي أسئلة، فيرجى ترك تعليق، وسأقوم بالرد على أسئلتكم في أقرب وقت ممكن!
بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الأصلي بحقوق الطبع والنشر، ويتم توفير المحتوى من قبل مستخدمي الإنترنت الذين يقدمون مساهماتهم الخاصة ويقومون بتحميله، ولا يمتلك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا اكتشفتم محتوى مخالف للحقوق، يرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (يرجى استبدال # ب @ عند إرسال البريد الإلكتروني) لتقديم الشكوى، ويرجى تقديم الأدلة ذات الصلة، وسيقوم الموقع بإزالة المحتوى المزعوم عن حقوق الطبع والنشر فور التحقق من ذلك.