如何解决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 文件,并将新文件写入磁盘,并且在那里它可以完美运行。
问题:
我相信问题从这一行开始:BufferedImage bim = pdfRenderer.renderImageWithDPI(page,ImageType.RGB);
但我不知道是什么导致了错误或如何调试它(我通过消除代码和抛出异常的艰苦过程得出了这个结论),尤其是因为它在独立项目中工作。 Java 存储过程不是我的专长,这段代码是从网上的许多不同来源拼凑而成的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。