java - 从 PDFBox 1.x 迁移到 PDFBox 2

标签 java pdfbox

我一直在使用 PDFBox 1.8 来处理 pdf。现在我计划转向 PDFBox 2.0-RC-2。我在迁移时遇到一些问题。

在 PDFBox 1.8 中,我曾经使用以下方法从 PDPage 获取 token :

PDStream contents = page.getContents();
PDFStreamParser parser = new PDFStreamParser(contents.getStream());
parser.parse();
List<Object> tokens = parser.getTokens();

但是,page.getContents() 在 PDFBox 2 中返回一个 InputStream。如何获取 PDStream?我应该使用 page.getContentStreams() (返回 Iterable)并迭代它吗?此外,构造函数 new PDFStreamParser(COSStream) 似乎已被弃用。

我遇到的另一个问题是图像替换。我使用 replaceWithStream

将一张图像替换为另一张图像
PDResources resources = page.getResources();
Iterable<COSName> xObjectNames = resources.getXObjectNames();
if (null != xObjectNames) {
    for(COSName xObjectName : xObjectNames){
        PDXObject object = resources.getXObject(xObjectName);
        if (object instanceof PDImageXObject) {
            PDImageXObject img1 = (PDImageXObject) object;
            PDImageXObject img2 = ....
            img1.getCOSStream().replaceWithStream(
                    img2.getCOSStream());
        }
    }
}

replaceWithStream 方法在 PDFBox 1.8 中已被弃用,因此在 PDFBox 2.0 中,它已被完全删除。用 img2 替换 img1 的其他方法是什么?

最佳答案

回答问题的第一部分:

PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List<Object> pageTokens = parser.getTokens();

回答问题的第二部分:

如果两个图像具有相同的滤镜、大小等,应该是这样的:

OutputStream os = img1.getCOSStream().createRawOutputStream();
InputStream is = img2.getCOSStream().createRawInputStream();
IOUtils.copy(is, os);
is.close();
os.close();

更新: 如果它们不相同,也请执行以下操作:

COSStream c1 = img1.getCOSStream();
COSStream c2 = img2.getCOSStream();
for (COSName name : c1.keySet())
{
    c1.setItem(name, null);
}
for (COSName name : c2.keySet())
{
    c1.setItem(name, c2.getItem(name));
}                

关于java - 从 PDFBox 1.x 迁移到 PDFBox 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33966754/

相关文章:

java - 无法获取 URL http ://dl-ssl. google.com/android/repository/addons_list.xml 找不到 404

java - PDFBox character pdf 到字符串对话中的坏字符

java - 使用jdbc将android应用程序连接到mysql时捕获异常

java - 如何在 Java 中查找整数数组中缺失的数字?

java - 将文本文件解析为对象

java - Matlab 2017a 是否改变了导入外部 java 类的方式?

java - 如何使用pdfbox获取PDF表单文本域的内容?

java - 有没有办法使用 UImanager 更改 Jradiobuttons 的字体颜色

java - 使用 PDFBox 添加页面不起作用

java - pdfbox - 转换为灰度后 pdf 增加大小