0

我正在寻找一个pdf文件,将每个页面的背景颜色设置为黑色,并将所有文本设置为白色。

对我来说最简单的方法是什么?是否有一个 api 调用来选择每个页面的背景和文件中的所有文本?还是我必须以某种方式遍历每个页面?

4

1 回答 1

2

正如我在对您的问题的最后评论中所提到的,只要反转所有颜色对于您的任务来说是一个足够的解决方案,在混合模式下绘制一个白色矩形就应该可以完成工作

void invert(File source, File target) throws IOException, DocumentException
{
    PdfReader reader = new PdfReader(source.getPath());
    OutputStream os = new FileOutputStream(target);
    PdfStamper stamper = new PdfStamper(reader, os);
    invert(stamper);
    stamper.close();
    os.close();
}

void invert(PdfStamper stamper)
{
    for (int i = stamper.getReader().getNumberOfPages(); i>0; i--)
    {
        invertPage(stamper, i);
    }
}

void invertPage(PdfStamper stamper, int page)
{
    Rectangle rect = stamper.getReader().getPageSize(page);

    PdfContentByte cb = stamper.getOverContent(page);
    PdfGState gs = new PdfGState();
    gs.setBlendMode(PdfGState.BM_DIFFERENCE);
    cb.setGState(gs);
    cb.setColorFill(new GrayColor(1.0f));
    cb.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());
    cb.fill();

    cb = stamper.getUnderContent(page);
    cb.setColorFill(new GrayColor(1.0f));
    cb.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());
    cb.fill();
}

invertPage确实在页面上的混合模式差异中绘制了上述白色反应角。此外,它通常页面下方绘制一个白色矩形;事实证明,至少对于我手头的 Acrobat Reader 版本来说,这是必要的。

您可能需要稍微调整代码以使结果更易于阅读。也许混合模式Exclusion ( BM_EXCLUSION) 更合适,或者其他一些图形状态调整可以改善您的阅读体验。只要有创意!;)

有关 PDF 混合模式的一些背景知识,您可能需要阅读PDF 规范 ISO 32000-1中的第 11.3.5 节混合模式并研究iText in Action - 2nd Edition透明度相关示例

PS:此代码仅反转页面内容。注释不受影响。如果事实证明这是必要的,您可能会做一些类似于他们的外观流的事情。

于 2013-06-01T21:09:53.403 回答