我正在寻找一种解决方案,从从MS-WORD生成的 pdf 中删除水印,我使用了来自于跟踪link的解决方案,这是从Itext pdf生成的具有水印的文件的工作。
发布于 2016-10-17 10:01:07
这里只为您的文件提供一个Apache PDFBox解决方案。它很可能不适用于其他文字文件,但值得一试。要了解我做了什么,请使用PDFBox PDFDebugger命令行应用程序(或使用itext )打开旧的和新的文件,并查看“Content”条目。
我删除的部分以
/Artifact << /Attached [ /Top ] /Type /Pagination /Subtype /Header >> BDC并以
EMC然而,其中一个也包含了颜色和字体设置,所以我保留这些。可能在一个真正的文件中,这个片段将包含更多有用的数据(毕竟,它被命名为"Header")和不同类型的颜色设置,因此需要更多的逻辑。
PDDocument document = PDDocument.load(new File("Saura.pdf"));
if (document.isEncrypted())
{
System.err.println("Error: Encrypted documents are not supported for this example.");
System.exit(1);
}
for (PDPage page : document.getPages())
{
PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List<Object> tokens = parser.getTokens();
List<Object> newTokens = new ArrayList<Object>();
List<Object> parameters = new ArrayList<Object>();
boolean skip = false;
// PDF content stream tokens have the forn
// paramater1...parameterN operator
for (Object token : tokens)
{
if (token instanceof Operator)
{
Operator op = (Operator) token;
if ("BDC".equals(op.getName()))
{
// "Watermark" starts with
// /Artifact << /Attached [ /Top ] /Type /Pagination /Subtype /Header >> BDC
if (parameters.size() == 2 && COSName.ARTIFACT.equals(parameters.get(0)) && parameters.get(1) instanceof COSDictionary)
{
COSDictionary dict = (COSDictionary) parameters.get(1);
if (COSName.getPDFName("Header").equals(dict.getItem(COSName.SUBTYPE)))
{
skip = true;
}
}
}
if (!skip || "g".equals(op.getName()) || "G".equals(op.getName()) || "Tf".equals(op.getName()))
{
// even when skipping, don't remove color and font settings
newTokens.addAll(parameters);
newTokens.add(op);
}
if ("EMC".equals(op.getName()))
{
// "Watermark" ends with EMC
skip = false;
}
parameters = new ArrayList<Object>();
}
else
{
parameters.add(token);
}
}
PDStream newContents = new PDStream(document);
OutputStream out = newContents.createOutputStream(COSName.FLATE_DECODE);
ContentStreamWriter writer = new ContentStreamWriter(out);
writer.writeTokens(newTokens);
out.close();
page.setContents(newContents);
}
document.save(new File("Saura2.pdf"));发布于 2020-06-12 06:56:19
我刚用Kotlin写了一段代码来去除水印。我对PDF一无所知,但希望能有所帮助。
@Test
fun test() {
val pdf = PDDocument.load(File("/tmp/original.pdf"))
pdf.pages.forEachIndexed { index, p ->
val tokens = ArrayList(PDFStreamParser(p).apply { parse() }.tokens)
val found = tokens.indexOfLast {
it is COSDictionary && it.toString().contains("Watermark")
}
if (found >= 0) {
runCatching {
val start = (found downTo 0).first { i ->
tokens[i].let { it is Operator && it.name == "Q" }
}
val end = (found until tokens.size).first { i ->
tokens[i].let { it is Operator && it.name == "Q" }
}
//remove unwanted
tokens.subList(start, end).clear()
p.setContents(PDStream(pdf).apply {
createOutputStream(COSName.FLATE_DECODE).use {
ContentStreamWriter(it).writeTokens(tokens)
}
})
}.onFailure {
//debug something.
println("err: $p, $index")
throw it
}
}
}
pdf.save(File("/tmp/output.pdf"))
}https://stackoverflow.com/questions/39870640
复制相似问题