java 如何使用PDFBox调整XObjects中的运算符和操作数

imzjd6km  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(84)

使用PDFContentStreamEditor.class可以操作主PDF页面内容的运算符和操作数。
似乎XObject不是编辑器编辑的,我的问题是是否有例子也可以调整XObject的操作符和操作数?

PDResources pdResources = page.getResources();
        pdResources.getXObjectNames().forEach(propertyName -> {
                    PDXObject xObject = pdResources.getXObject(propertyName);
                    if(xObject instanceof PDFormXObject pdformxobject) {
                           //Is this the right place
                    }
            }

字符串
我在PDFContentStreamEditor.class中尝试了其他方法-processControlrencyGroup方法。我认为我离解决方案越来越近了,但在下面的行中,我只在XObject中添加了一个Contents元素,并且不更改根对象操作符和操作数:

group.getCOSObject().setItem(COSName.CONTENTS, stream);


这里是完整的方法:

@Override
protected void processTransparencyGroup(PDTransparencyGroup group){
 PDStream stream = new PDStream(document, group.getContents());
        replacementForm = new ContentStreamWriter(replacementFormStream = stream.createOutputStream(COSName.FLATE_DECODE));// stream.createOutputStream(COSName.FLATE_DECODE));
        super.processTransparencyGroup(group);
        replacementFormStream.close();

        group.getCOSObject().setItem(COSName.CONTENTS, stream);
        replacementForm = null;
        replacementFormStream = null;
}

laximzn5

laximzn51#

您可以通过将此方法添加到this old answerPdfContentStreamEditor类来编辑表单XObjects内容流:

public void processFormXObject(PDFormXObject formXObject, PDPage page) throws IOException {
    PDStream stream = new PDStream(document);
    replacement = new ContentStreamWriter(replacementStream = stream.createOutputStream(COSName.FLATE_DECODE));
    super.processChildStream(formXObject, page);
    replacementStream.close();
    try (OutputStream outputStream = formXObject.getCOSObject().createOutputStream()) {
        stream.createInputStream().transferTo(outputStream);
    } finally {
        replacement = null;
        replacementStream = null;
    }
}

字符串
(PdfContentStreamEditor方法)
(Form XObject的内容流并不在Contents子条目中,它们本身就是内容流。因此,替换流内容必须以不同的方式存储。)
你可以这样使用它:

PDDocument document = ...;
for (PDPage page : document.getDocumentCatalog().getPages()) {
    PdfContentStreamEditor editor = new PdfContentStreamEditor(document, page) {
        @Override
        protected void write(ContentStreamWriter contentStreamWriter, Operator operator, List<COSBase> operands) throws IOException {
            String operatorString = operator.getName();

            if (RGB_FILL_COLOR_OPERATORS.contains(operatorString))
            {
                for (int i = 0; i < operands.size(); i++) {
                    COSBase number = operands.get(i);
                    if (number instanceof COSNumber) {
                        operands.set(i, new COSFloat(1.0f - ((COSNumber)number).floatValue()));
                    }
                }
            }

            super.write(contentStreamWriter, operator, operands);
        }

        final List<String> RGB_FILL_COLOR_OPERATORS = Arrays.asList("rg", "sc", "scn");
    };
    PDResources resources = page.getResources();
    for (COSName name : resources.getXObjectNames()) {
        PDXObject xObject = resources.getXObject(name);
        if (xObject instanceof PDFormXObject) {
            System.out.printf("Editing form XObject %s.\n", name.toString());
            editor.processFormXObject((PDFormXObject) xObject, page);
        }
    }
}

  • (EditFormXObjectContent测试testInvertColorsHighPioneerFallNewsletterADApdf_2)*

此示例反转文档的直接表单XObject页面资源中的某些填充颜色。

相关问题