- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个要求,我们需要在某些匹配的条件检查中删除注释。当我执行 allPageAnnotationsList.remove(annotationTobeRemoved)
时,PDAnnotion 被删除陈述。
但相应的文本仅以蓝色显示。如何将文本颜色更新为正常(黑色)?
最佳答案
最初我以为您要求将页面上的所有非黑色文本更改为黑色。这导致了我的原始答案,现在是第一部分“将所有文本更新为黑色”。然后您澄清说,您只希望将已删除注释区域中的文本设为黑色。这显示在第二部分“将区域中的文本更新为黑色”中。
将所有文本更新为黑色
首先,正如 Tilman 在评论中已经描述的那样,删除链接注释通常只会删除该链接的交互性,但链接注释区域中的文本保持原样。因此,如果要将文本颜色更新为正常(黑色),则必须添加第二步并操作静态页面内容中的颜色。
静态页面内容由改变图形状态或绘制某些内容的指令流定义。用于绘制的颜色是图形状态的一部分,由显式颜色设置指令设置。因此,人们可能会认为您可以简单地通过选择正常(黑色)的说明替换所有颜色设置说明。
不幸的是,这并不容易,因为颜色也可能会改变以绘制其他东西。例如。在您的文档开始时,整个页面都填充为白色;如果您在填充指令之前替换颜色设置指令,您的整个页面将是黑色的。不完全是你想要的。
要将文本颜色更新为正常(黑色)但不更改其他颜色,因此,您必须考虑要更改的指令的上下文。
PDFBox 解析框架可以帮助您在这里迭代内容流并跟踪图形状态。
此外,基于该框架,在 this answer 中创建了一个通用的内容流编辑器助手类。 , PdfContentStreamEditor
. (有关详细信息和示例用途,请参阅该答案。)现在您只需为您的用例自定义它,例如像这样:
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 (TEXT_SHOWING_OPERATORS.contains(operatorString)) {
if (currentlyReplacedColor == null)
{
PDColor currentFillColor = getGraphicsState().getNonStrokingColor();
if (!isBlack(currentFillColor))
{
currentlyReplacedColor = currentFillColor;
super.write(contentStreamWriter, SET_NON_STROKING_GRAY, GRAY_BLACK_VALUES);
}
}
} else if (currentlyReplacedColor != null) {
PDColorSpace replacedColorSpace = currentlyReplacedColor.getColorSpace();
List<COSBase> replacedColorValues = new ArrayList<>();
for (float f : currentlyReplacedColor.getComponents())
replacedColorValues.add(new COSFloat(f));
if (replacedColorSpace instanceof PDDeviceCMYK)
super.write(contentStreamWriter, SET_NON_STROKING_CMYK, replacedColorValues);
else if (replacedColorSpace instanceof PDDeviceGray)
super.write(contentStreamWriter, SET_NON_STROKING_GRAY, replacedColorValues);
else if (replacedColorSpace instanceof PDDeviceRGB)
super.write(contentStreamWriter, SET_NON_STROKING_RGB, replacedColorValues);
else {
//TODO
}
currentlyReplacedColor = null;
}
super.write(contentStreamWriter, operator, operands);
}
PDColor currentlyReplacedColor = null;
final List<String> TEXT_SHOWING_OPERATORS = Arrays.asList("Tj", "'", "\"", "TJ");
final Operator SET_NON_STROKING_CMYK = Operator.getOperator("k");
final Operator SET_NON_STROKING_RGB = Operator.getOperator("rg");
final Operator SET_NON_STROKING_GRAY = Operator.getOperator("g");
final List<COSBase> GRAY_BLACK_VALUES = Arrays.asList(COSInteger.ZERO);
};
editor.processPage(page);
}
document.save("withBlackText.pdf");
(
ChangeTextColor 测试
testMakeTextBlackTestAfterRemovingAnnotation
)
static boolean isBlack(PDColor pdColor) {
PDColorSpace pdColorSpace = pdColor.getColorSpace();
float[] components = pdColor.getComponents();
if (pdColorSpace instanceof PDDeviceCMYK)
return (components[0] > .9f && components[1] > .9f && components[2] > .9f) || components[3] > .9f;
else if (pdColorSpace instanceof PDDeviceGray)
return components[0] < .1f;
else if (pdColorSpace instanceof PDDeviceRGB)
return components[0] < .1f && components[1] < .1f && components[2] < .1f;
else
return false;
}
(
ChangeTextColor 辅助方法)
PDFStreamEngine
方法
showText(byte[])
存储当前文本绘制指令中显示的文本位置。
PDDocument document = ...;
for (PDPage page : document.getDocumentCatalog().getPages()) {
List<PDRectangle> areas = new ArrayList<>();
// Remove every other annotation, collect their areas
List<PDAnnotation> annotations = new ArrayList<>();
boolean remove = true;
for (PDAnnotation annotation : page.getAnnotations()) {
if (remove)
areas.add(annotation.getRectangle());
else
annotations.add(annotation);
remove = !remove;
}
page.setAnnotations(annotations);
PdfContentStreamEditor editor = new PdfContentStreamEditor(document, page) {
@Override
protected void write(ContentStreamWriter contentStreamWriter, Operator operator, List<COSBase> operands) throws IOException {
String operatorString = operator.getName();
if (TEXT_SHOWING_OPERATORS.contains(operatorString) && isInAreas()) {
if (currentlyReplacedColor == null)
{
PDColor currentFillColor = getGraphicsState().getNonStrokingColor();
if (!isBlack(currentFillColor))
{
currentlyReplacedColor = currentFillColor;
super.write(contentStreamWriter, SET_NON_STROKING_GRAY, GRAY_BLACK_VALUES);
}
}
} else if (currentlyReplacedColor != null) {
PDColorSpace replacedColorSpace = currentlyReplacedColor.getColorSpace();
List<COSBase> replacedColorValues = new ArrayList<>();
for (float f : currentlyReplacedColor.getComponents())
replacedColorValues.add(new COSFloat(f));
if (replacedColorSpace instanceof PDDeviceCMYK)
super.write(contentStreamWriter, SET_NON_STROKING_CMYK, replacedColorValues);
else if (replacedColorSpace instanceof PDDeviceGray)
super.write(contentStreamWriter, SET_NON_STROKING_GRAY, replacedColorValues);
else if (replacedColorSpace instanceof PDDeviceRGB)
super.write(contentStreamWriter, SET_NON_STROKING_RGB, replacedColorValues);
else {
//TODO
}
currentlyReplacedColor = null;
}
super.write(contentStreamWriter, operator, operands);
before = null;
after = null;
}
PDColor currentlyReplacedColor = null;
final List<String> TEXT_SHOWING_OPERATORS = Arrays.asList("Tj", "'", "\"", "TJ");
final Operator SET_NON_STROKING_CMYK = Operator.getOperator("k");
final Operator SET_NON_STROKING_RGB = Operator.getOperator("rg");
final Operator SET_NON_STROKING_GRAY = Operator.getOperator("g");
final List<COSBase> GRAY_BLACK_VALUES = Arrays.asList(COSInteger.ZERO);
@Override
protected void showText(byte[] string) throws IOException {
Matrix ctm = getGraphicsState().getCurrentTransformationMatrix();
if (before == null)
before = getTextMatrix().multiply(ctm);
super.showText(string);
after = getTextMatrix().multiply(ctm);
}
Matrix before = null;
Matrix after = null;
boolean isInAreas() {
return isInAreas(before) || isInAreas(after);
}
boolean isInAreas(Matrix m) {
return m != null && areas.stream().anyMatch(rect -> rect.contains(m.getTranslateX(), m.getTranslateY()));
}
};
editor.processPage(page);
}
document.save("WithoutSomeAnnotation-withBlackTextThere.pdf");
关于pdfbox - 尽管移除了 PDAnnotation,但文本显示为蓝色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68299177/
我有一个 datagridview,它的唯一目的是显示来自数据库的信息。出于某种原因,我还添加了额外的列,每一行都有“查看”链接。所以基本上 datagridView 的目的只是让用户单击“查看”链接
当按下我的按钮时,我不希望它的外观发生变化。当我触摸它时它会变成蓝色。我尝试进入 IB 并取消选中“突出显示调整图像”,但这似乎没有改变任何东西。我还没有选中“显示高亮显示触摸”。我如何禁用此功能?感
我是 CSS 和一般编程的新手,所以如果这是一个初学者问题,我很抱歉,但我自己找不到合适的解决方案。 如果我有特定的颜色代码(十六进制),例如#028dca,我怎样才能得到匹配的颜色? 我在网上找到了
Fiddler中这个图标是什么意思: 它未在 help 中列出. 最佳答案 此图标用于回复 Content-Type=Content-Type: text/html; 关于fiddler - 蓝色<>
默认的 UIButton 圆角矩形是深蓝色的。我希望表格中单元格的文本与这种蓝色相匹配。 我正在使用此代码,但我能找到的唯一蓝色是亮蓝色... cell.textLabel.textColor = [
我试过这个: myButton.highlight(true) 但这只会使按钮变成深蓝色,这就是按钮的“按下”状态。 此外,当我按键盘上的 Enter 键时,该按钮将不起作用。 当我按下回车键时,如何
我有一个 iOS 6 应用程序,它使用以下方法将所有导航栏按钮的色调颜色设置为绿色: [[UIBarButtonItem appearance] setTintColor:[UIColor color
当我创建一个 TreeView 控件时,插入几个项目,然后我使用 TVM_SELECTITEM 选择一个默认项目。但是这个项目没有用蓝色突出显示。稍后,如果我使用鼠标或键盘选择一个项目,它将突出显示。
目前我有代码: import random from psychopy import visual, event win = visual.Window() # A TextStim and five
如何更改 UISwitch 的默认颜色(蓝色)? 最佳答案 我想你要找的是这样的东西 UISwitch *testSwitch; //just something I made up [testSwi
我有一个 MKMap 和一系列 MKAnnotations,所有这些都是红色的,这很好。我在 IB 中选择了“显示用户位置”并将 MKAnnotation 从红色更改为蓝色,我的 viewForAnn
我正在尝试使用 C++ 和 openCV 检测下图中的 3 个蓝色圆圈。 我用这个代码 int main(){ Mat original=imread("img.jpg"); Ma
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C# Textbox string separation 我想将字符串值即 (red,blue,black)
我正在使用 cocos2d 库制作 iOS 游戏。 假设您有两个具有两种不同颜色的对象 - 在 RGB 中定义为 Blue: 0,0,255 Yellow: 255,255,0 我想添加蓝色和
有没有办法轻松地将给定的十六进制颜色代码分配给更一般的类别(红色、绿色、蓝色、黄色、橙色、粉色、黑色、白色、灰色……)? 比如 #ffcc55 -> 橙色,#f0f0f0 -> 白色,... 编辑:甚
我创建了一个 UIButton: testNavigationButton.setTitle("Test", forState: .Normal) testNavigationButton.layer
我正在尝试编写一个裸机程序来闪烁绿色 LED。事实上,我无法打开或关闭任何 LED。这是一个现成的板。主板名称为 NUCLEO F429ZI。 Board Image 我已经浏览了原理图,并且确信引脚
我们已经使用对话流创建了一个聊天机器人。现在,我们想要对其进行测试,并需要一些测量或分析数据以确保该机器人已准备好向公众开放。我们使用对话框流中的“分析”功能的方法之一。但是,他们的文档中没有包含任何
我可以在设置 Pane 中更改我的应用程序(任何地方)的tintColor。当我更改tintColor,然后尝试返回到默认色调颜色时,导航栏中的某些按钮不会返回蓝色,我该如何处理这个问题? 验证:-
我希望使用非常明亮的金属色或荧光色来指定我的文本和 div 颜色。我还没有找到显示这些的任何标准。这些是否存在于颜色规范中,或者您能否向我推荐任何接近的尝试。谢谢。 最佳答案 Here's一个很好的荧
我是一名优秀的程序员,十分优秀!