从PDFBox 1.x移动到PDFBox 2

时间:2015-11-28 01:34:34

标签: java pdfbox

我一直在使用PDFBox 1.8来处理pdf。现在我打算转到PDFBox 2.0-RC-2。我在迁移方面遇到了一些麻烦。

使用PDFBox 1.8,我曾经使用以下方式从PDPage获取令牌:

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的另一种方法是什么?

2 个答案:

答案 0 :(得分:2)

回答问题的第一部分:

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));
}                

答案 1 :(得分:0)

回答问题的第二部分(由我自己测试):

InputStream is = img2.getStream().getCOSObject().createRawInputStream();
OutputStream os = img1.getStream().getCOSObject().createRawOutputStream();

IOUtils.copy(is, os);
is.close();
os.close();

img1.getStream().getCOSObject().clear();
img1.getStream().getCOSObject().addAll(img2.getStream().getCOSObject().asUnmodifiableDictionary());