微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle Apex、Apache PDFBox java 存储过程问题

如何解决Oracle Apex、Apache PDFBox java 存储过程问题

一些背景:在我的应用程序中,有一些 pdf 报告。但是,这些 pdf 报告需要基于“图像”,我被告知报告服务器无法执行此操作。对报表服务器的调用是从 pl/sql 过程完成的,结果是一个 blob,所以现在我可以尝试进行这种转换的只是一个 java 存储过程。这是我想出的(使用 Apache PDFBox):

create or replace and compile java source named "APDFUtil"
    as
    import oracle.sql.*;
    import oracle.jdbc.driver.*;
    import java.sql.*;
    import oracle.sql.BLOB;
    import java.sql.Blob;
    import javax.imageio.ImageIO;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.io.*;
    import java.util.*;
    import javax.imageio.ImageIO;
    import org.apache.pdfBox.pdmodel.*;
    import org.apache.pdfBox.rendering.*;
    import org.apache.pdfBox.pdmodel.PDDocument;
    import org.apache.pdfBox.pdmodel.common.PDRectangle;
    import org.apache.pdfBox.pdmodel.graphics.image.LosslessFactory;
    import org.apache.pdfBox.pdmodel.graphics.image.PDImageXObject;
    import org.apache.pdfBox.rendering.PDFRenderer;
    import org.apache.pdfBox.tools.imageio.ImageIoUtil;
    import java.awt.image.BufferedImage;
    
        public class APDFUtil{
            
           
    
     static OracleDriver ora = new OracleDriver();
        static Connection conn;
        static ByteArrayOutputStream out;
        
        static {
            try {
                conn = ora.defaultConnection();
            } catch (Exception ex) {}
        }
          
        public static oracle.sql.BLOB flattenPDF (oracle.sql.BLOB value) throws Exception {
            
            if (conn == null) conn = ora.defaultConnection();
            BLOB retBlob = BLOB.createTemporary(conn,true,oracle.sql.BLOB.DURATION_SESSION);
             
            /*BEGIN TO_JPG*/
            InputStream inputStream = value.getBinaryStream();
            PDDocument document = PDDocument.load(inputStream);
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            
            int noOfPages = document.getNumberOfPages();
            BufferedImage[] pdfJPEG = new BufferedImage[noOfPages];
            
            for (int page = 0; page < noOfPages; ++page) {
                    BufferedImage bim = pdfRenderer.renderImageWithDPI(page,300,ImageType.RGB);           
                    pdfJPEG[page] = bim;
            }         
            
            /*write images to new pdf*/
            PDDocument documentOut = new PDDocument();
                
            for (int page = 0; page < noOfPages;++page) {
                /*get page from old document to determine width and height*/
                PDPage oldPage = document.getPage(page);
                Float pw = oldPage.getMediaBox().getWidth();
                Float ph = oldPage.getMediaBox().getHeight();
                
                PDRectangle rec = new PDRectangle(pw,ph);
                PDPage newPage = new PDPage(rec);
                
                documentOut.addPage(newPage);
                
                PDImageXObject pdImage = LosslessFactory.createFromImage(documentOut,pdfJPEG[page]);
        
                PDPageContentStream contents = new PDPageContentStream(documentOut,newPage);
                contents.drawImage(pdImage,pw,ph);
                contents.close();                       
            }               
                   
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            documentOut.save(out);
        
            documentOut.close();
            document.close();
            /*END OF TO_JPG*/
            
           /*out - we used to get this back from TO_JPG*/
            try {
                java.io.OutputStream outStr = retBlob.setBinaryStream(0);
                outStr.write(out.toByteArray());
                outStr.flush();
            } finally {
            out.close();
            }
            return retBlob;
        }
    }
  • pdfBox jar 已加载到数据库
  • 数据库是 oracle 19c 标准版 2 版本 19.0.0.0.0
  • 我将此代码作为一个独立的 Java 项目进行了尝试,但正在从磁盘读取 pdf 文件,并将新文件写入磁盘,并且在那里它可以完美运行。

问题:

enter image description here

我相信问题从这一行开始:BufferedImage bim = pdfRenderer.renderImageWithDPI(page,ImageType.RGB); 但我不知道是什么导致了错误或如何调试它(我通过消除代码和抛出异常的艰苦过程得出了这个结论),尤其是因为它在独立项目中工作。 Java 存储过程不是我的专长,这段代码是从网上的许多不同来源拼凑而成的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。