Java 从PDFBox 1.x移动到PDFBox 2

Java 从PDFBox 1.x移动到PDFBox 2,java,pdfbox,Java,Pdfbox,我一直在使用PDFBox 1.8来处理PDF。现在我正计划迁移到PDFBOX2.0-RC-2。我在迁移方面遇到了一些困难 在PDFBox 1.8中,我使用以下方法从PDPage获取令牌: PDStream contents = page.getContents(); PDFStreamParser parser = new PDFStreamParser(contents.getStream()); parser.parse(); List<Object> tokens = pars

我一直在使用PDFBox 1.8来处理PDF。现在我正计划迁移到PDFBOX2.0-RC-2。我在迁移方面遇到了一些困难

在PDFBox 1.8中,我使用以下方法从PDPage获取令牌:

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

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

回答问题的第一部分:

PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List<Object> pageTokens = parser.getTokens();
更新: 如果它们不相同,也要执行以下操作:

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

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


@酒鬼,对不起。我明天会调查此事(现在是午夜)。旧图像和新图像是什么类型的?(jpeg、pixelmap、ccitt?)对不起,刚才注意到IOUtils.copy没有按预期工作。当我试图打开pdf时,我得到一个错误,说图像的数据不足。当我使用replaceWithStream时,它在早期使用1.8。我可以看到InputStream有内容。我是否需要以某种方式将输出流写回pdf?我想不会的。@醉汉,很明显,你需要保存PDF文件。你很可能在1.8版本中做了。是的,我保存了pdf。图像是否必须具有相同的格式?新的肯定是jpeg,因为我手动将其转换为jpeg。不知道旧的是什么。如何检查图像的格式?是的,正如我所说,相同的格式,相同的大小,相同的属性。使用PDFDebugger查看该文件。
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));
}                
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());