gpt4 book ai didi

pdf - iText PDF : replace/transform colours

转载 作者:行者123 更新时间:2023-12-04 15:15:35 32 4
gpt4 key购买 nike

我在Java中使用iText从一个较大的PDF文档中选择几页,然后另存为新的较小的PDF。同时,我想更改它们的颜色。

例如,假设我的页面全部使用灰色阴影,而我想将其设置为绿色。所有使用的颜色都是灰色阴影。我想将每种颜色替换为绿色的相应颜色。

Mark Storer问:

What exactly are you trying to accomplish?



把这个变成这个:

我有 some documents,我已经在其中使用iText根据用户输入从文档中选择一小组较小的页面-将100多个页面缩减到大约5个页面。同时,我希望生成绿色,蓝色,黄色,粉红色等版本。并非每个页面都是灰度的,但是所有重要的页面都是灰度的,因此如果需要,我可以强制使用它们的色彩空间。

更新:

遵循Mark Storer关于混合模式的建议,这就是我的想法:
    val reader = new PdfReader(file.toURL)
val document = new Document
val writer = PdfWriter.getInstance(document, outputStream)
document.open()

/* draw a white background behind the page, so the
blend always has something to transform, otherwise
it just fills. */
val canvas = writer.getDirectContent
canvas.setColorFill(new CMYKColor(0.0f, 0.0f, 0.0f, 0.0f))
canvas.rectangle(10f, 0f, 100f, 100f)
canvas.fill

/* Put the imported page on top of that */
val page = writer.getImportedPage(reader, 1)
canvas.addTemplate(page, 0, 0)

/* Fill a box with colour and a blending mode */
canvas.setColorFill(new CMYKColor(0.6f,0.1f,0.0f,0.5f))
val gstate = new PdfGState
gstate.setBlendMode(PdfGState.BM_SCREEN)
canvas.setGState(gstate)
canvas.rectangle(0f, 0f, 100f, 100f)
canvas.fill

document.close()

(它在Scala中,但是iText库与Java中的相同)

问题是,iText可用的所有混合模式都是“可分离的”模式:它们分别在每个颜色 channel 上运行。这意味着我可以分别调整青色,品红色,黄色或黑色的值,但不能将灰色变成绿色。

为此,我需要使用“不可分离”的颜色混合模式,即颜色 channel 会相互影响。据我所知,iText不提供- PdfGState的常量中没有列出任何非分离混合模式。我正在使用iText 5.0.5,它是撰写本文时的最新版本。

有没有一种方法可以在iText中访问这些混合模式,甚至可以侵入其中?还有另一种方法可以达到目的吗?
  • This adobe document described blending modes


  • 更新:

    甚至将混合模式设置为“颜色”均无效。我在代码中这样做是为了强制它:
        val gstate = new PdfGState
    gstate.put(PdfName.BM, new PdfName("Color"))
    canvas.setGState(gstate)

    然后我在文本编辑器中检查了生成的PDF,以确保其表示正确的内容。遗憾的是,屏幕上的结果无法正常工作。我不知道为什么,根据PDF规范,它应该是正确的混合模式。

    Mark Storer问:

    "Color" didn't work? Funky. Can we see the PDF?



    Here's a PDF

    将其放到网络上,我现在可以看到“颜色”模式在Chrome中可以正常使用,但在Acrobat 9 Pro(CS4)中则无法使用。因此该技术是正确的,但是Adobe无法渲染!

    我想知道是否没有某种方法可以“弄平”混合模式的效果,因此PDF直接包含所需的颜色对象,而不是包含旨在产生正确颜色的混合。

    Idea: Turn this upside down. Use the existing page as an alpha channel on a page filled entirely with the desired color rather than the other way around.



    如何?我不确定GState是否适用于添加模板?

    同样,导入的页面需要首先添加白色背景,否则它将在没有对象的地方充斥着颜色,然后进行混合。

    我尝试这样做:
        val canvas = writer.getDirectContent
    canvas.setColorFill(new CMYKColor(0.6f,0.1f,0.0f,0.0f))
    canvas.rectangle(10f, 0f, 500f, 500f)
    canvas.fill

    val template = canvas.createTemplate(500f, 500f)
    template.setColorFill(new CMYKColor(0f, 0f, 0f, 0f))
    template.rectangle(0f, 0f, 500f, 500f)
    template.fill

    val page = writer.getImportedPage(reader, 1)
    template.addTemplate(page, 0, 0)

    val gstate = new PdfGState
    gstate.put(PdfName.BM, new PdfName("Color"))
    canvas.setGState(gstate)
    canvas.addTemplate(template, 0, 0)

    还有 here's the PDF it produced。不太合适,无论是在Chrome还是Acrobat中:)

    编辑:愚蠢的我。我将模式更改为“Luminosity”, producing this file。和以前一样,这在Chrome浏览器中看起来正确,但在Acrobat中却不正确。

    我刚刚检查了一下,甚至Adobe Reader X也无法正确渲染它。这可能意味着我要的是不可能的。 :(

    解决方案

    来自Adobe的Leonard Rosenthal回到我身边,澄清了这个问题:“颜色”混合模式仅在转换空间是RGB而不是CMYK时有效。我的PDF没有指定空间,因此Adobe产品默认为CMYK,而其他产品默认为RGB。

    iText中的解决方案是在顶部附近添加以下行:
        writer.setRgbTransparencyBlending(true)

    当然,出于色彩准确性的考虑,您不希望发生超出绝对必要的更多色彩空间转换,因此仅在确实需要使用RGB混合模式时才使用此行。

    从Photoshop用户的角度来看,生成的彩色页面看起来有些奇怪:看起来浅灰色比深灰色更饱和。我正在研究组合过滤器以调整输出的方法。

    Here's the result!

    非常感谢Mark Storer帮助我实现了此解决方案。

    最佳答案

    如果您始终希望从“灰色阴影”变为“颜色X阴影”,则可以在某些时髦的混合模式下使用透明度。

    如果要浏览所有内容流并编辑现有的颜色命令,那是一个很高的要求。您必须考虑各种各样的colo(u)r空间。 DeviceGray,DeviceRGB,DeviceCMYK,ICC配置文件,校准的RGB和CMYK,专色以及So Forth。

    您到底想完成什么?

    “颜色”无效吗?时髦我们可以看PDF吗?

    想法:把这倒过来。使用现有页面作为完全填充所需颜色的页面上的Alpha channel ,而不是相反。

    再试一次。与其混合,不如使用传递函数。您需要构建一个功能字典。您坚持使用CMYK,因此将所有输入都塞入特定输出应该非常简单。

    像这样的东西:

    C:[0 1]-> [0 0.6]
    M:[0 1]-> [0 0.1]
    Y:[0 1]-> [0 0]
    K:[0 1]-> [0 0]

    (我从您的PDF中刷了0.6 0.1 0 0)

    gh ...只有您现有的页面全都是deviceGray,对吗?不,... CMYK也是,只有K的。您需要一个传递函数,该函数需要K个值,然后根据所需的颜色输出将它们映射到CMYK。

    然后,我研究了如何在PDF中定义函数。简单就这么多。域,范围和样本哦,我的!不完全是琐碎的。

    不过,这可能仍然有效。

    (尽管我仍然认为您应该找到在Acrobat中可以使用的混合PDF,看看有什么区别)

    最后的努力:
    总理伦纳德·罗森霍尔(Leonard Rosenthol)。他在SO上有一个帐户。他是Adobe的Acrobat开发人员关系人员。告诉他Mark Storer感到难过。那应该引起他的注意。 ;)

    关于pdf - iText PDF : replace/transform colours,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4653018/

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