小编典典

使用iText Java为整个pdf文档选择文本和背景

java

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

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


阅读 208

收藏
2020-11-30

共1个答案

小编典典

正如我在对问题的最后一条评论中提到的那样,只要将所有颜色反转都足以解决您的任务,那么在混合模式下绘制白色矩形 差异 就可以完成工作:

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并绘制混合模式的差异上述提到的白reactangle 的页面。此外,它通常 页面 下方
绘制一个白色矩形;事实证明,至少对于我在这里使用的Acrobat Reader版本而言,这是必需的。

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

有关PDF混合模式的一些背景,你可能需要阅读部分11.3.5 混合模式PDF规范ISO
32000-1
和研究透明度的相关实例行动iText的-
第二版

PS:此代码仅反转页面内容。注释不受影响。如果结果证明是必要的,则可以执行类似于其外观流的操作。

2020-11-30