gpt4 book ai didi

overlay - PDFBox 叠加失败

转载 作者:行者123 更新时间:2023-12-02 20:26:12 24 4
gpt4 key购买 nike

我使用 PDFBox 1.8.8 并尝试使用以下 scala 方法将 PDDocument 与其他文档叠加

def mergeTest() = {
val home = System.getProperty("user.home")
val doc = PDDocument.load(home + "/tmp/document.pdf")
val ovl = PDDocument.load(home + "/tmp/overlay.pdf")
val ov = new Overlay()
val mergeDoc = ov.overlay(ovl, doc)
mergeDoc.save(home + "/tmp/result.pdf")
doc.close()
ovl.close()
mergeDoc.close()

}

我期望“document.pdf”的每一页(N页)都覆盖“overlay.pdf”(1页)的内容。

因此,“result.pdf”中的页面与“document.pdf”中的页面一样多,但是“document.pdf”的原始内容完全被覆盖内容覆盖。

最佳答案

原因

OP 的 overlay.pdf页面内容开头为

/Cs1 cs
1 sc
0.1400146 841.945 m
595.14 841.945 l
595.14 -0.05499268 l
0.1400146 -0.05499268 l
h
f
0.1400146 841.945 m
595.14 841.945 l
595.14 -0.05499268 l
0.1400146 -0.05499268 l
h
f

这些操作绘制两个白色(CS1 是灰度颜色空间)矩形,几乎覆盖整个 MediaBox [0, 0, 595.28, 841.89] 除了顶部和左侧有一条非常细的线

因此,将此页面内容放置在另一个页面上,完全覆盖了该其他页面的所有现有内容,这正是您所观察到的:

the original content of "document.pdf" is completely overwritten by the content of the overlay

通常只有覆盖一个不能覆盖所有内容的页面才有意义。

使用混合模式变暗的解决方法

或者,您可能想尝试使用混合模式变暗进行叠加,该模式选择背景颜色和源颜色中较暗的一个背景将替换为源颜色光源较暗的地方;否则,保持不变。

在Java中(我没有使用Scala的经验,所以我希望你可以利用Java源代码)你可以使用如下方法:

void overlayWithDarkenBlendMode(PDDocument document, PDDocument overlay) throws IOException
{
PDXObjectForm xobject = importAsXObject(document, (PDPage) overlay.getDocumentCatalog().getAllPages().get(0));
PDExtendedGraphicsState darken = new PDExtendedGraphicsState();
darken.getCOSDictionary().setName("BM", "Darken");

List<PDPage> pages = document.getDocumentCatalog().getAllPages();

for (PDPage page: pages)
{
Map<String, PDExtendedGraphicsState> states = page.getResources().getGraphicsStates();
if (states == null)
states = new HashMap<String, PDExtendedGraphicsState>();
String darkenKey = MapUtil.getNextUniqueKey(states, "Dkn");
states.put(darkenKey, darken);
page.getResources().setGraphicsStates(states);

PDPageContentStream stream = new PDPageContentStream(document, page, true, false, true);
stream.appendRawCommands(String.format("/%s gs ", darkenKey));
stream.drawXObject(xobject, 0, 0, 1, 1);
stream.close();
}
}

PDXObjectForm importAsXObject(PDDocument target, PDPage page) throws IOException
{
final PDStream xobjectStream = new PDStream(target, page.getContents().createInputStream(), false);
final PDXObjectForm xobject = new PDXObjectForm(xobjectStream);

xobject.setResources(page.findResources());
xobject.setBBox(page.findCropBox());

COSDictionary group = new COSDictionary();
group.setName("S", "Transparency");
group.setBoolean(COSName.getPDFName("K"), true);
xobject.getCOSStream().setItem(COSName.getPDFName("Group"), group);

return xobject;
}

(OverlayWithEffect.java)

将它们应用到您的示例文档

@Test
public void testOverlayWithDarkenVolker() throws COSVisitorException, IOException
{
try ( InputStream sourceStream = getClass().getResourceAsStream("document1.pdf");
InputStream overlayStream = getClass().getResourceAsStream("overlay.pdf") )
{
final PDDocument document = PDDocument.load(sourceStream);
final PDDocument overlay = PDDocument.load(overlayStream);

overlayWithDarkenBlendMode(document, overlay);

document.save(new File(RESULT_FOLDER, "document1-with-overlay.pdf"));
}
}

结果

document1-with-overlay.pdf

如您所见,这两个数字都来自 document1.pdf以及来自 overlay.pdf 的行在那里。

当心!此代码是概念验证,尚未准备好用于一般生产用途。它例如完全忽略旋转页面条目...

关于overlay - PDFBox 叠加失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29095822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com