从 PDFBox 1.x 移动到 PDFBox 2
Moving from PDFBox 1.x to PDFBox 2
我一直在使用 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()
returns PDFBox 2 中有一个 InputStream。如何获取 PDStream?我应该使用 page.getContentStreams()
(returns 可迭代)并遍历它吗?此外,构造函数 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));
}
问题第二部分的答案(本人亲测):
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());
我一直在使用 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()
returns PDFBox 2 中有一个 InputStream。如何获取 PDStream?我应该使用 page.getContentStreams()
(returns 可迭代)并遍历它吗?此外,构造函数 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));
}
问题第二部分的答案(本人亲测):
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());