我正在使用Java中的iText从一个大的PDF文档中选择一些页面并保存为一个新的较小的PDF.与此同时,我想改变他们的颜色.
例如,假设我的页面都使用灰色阴影,我想将其设为绿色.使用的所有颜色都是灰色阴影.我想用绿色的相应颜色替换每种颜色.
Mark Storer问道:
你到底想要完成什么?
把这个...变成这个:


我有一些文件,我已经在使用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) …Run Code Online (Sandbox Code Playgroud) 我们需要开始为我们的计划添加国际化。值得庆幸的是,还不是全部,只是一些部分,但我希望我们的方式能够扩大规模,以覆盖整个计划。问题是,我们的程序基于插件,因此并非所有字符串都属于同一个位置。
据我了解,Java的ResourceBundle工作原理是这样的。您创建一个扩展的类ResourceBundle,称为MyProgramStrings,以及特定于语言的类,称为MyProgramStrings_fr,MyProgramStrings_es等等。每个类都将键(字符串)映射到值(任何对象)。从哪里获取数据取决于每个类,但它们的共同位置是属性文件。
您可以分两个阶段查找值:首先获得正确的包,然后在其中查询所需的字符串。
Locale locale = Locale.getDefault(); // or = new Locale("en", "GB");
ResourceBundle rb = ResourceBundle.getBundle("MyProgramStrings", locale);
String wotsitName = rb.getString("wotsit.name");
Run Code Online (Sandbox Code Playgroud)
然而,我们需要的是将多个语言环境的结果组合到一个资源空间中。例如,插件需要能够覆盖已定义的字符串,并在代码查找该字符串时返回新值。
我对这一切有点迷失。有人可以帮忙吗?
更新:大卫·沃特斯问:
我已将我的答案放在底部,但我有兴趣听听您如何解决这个问题。
好吧,我们还没有走得太远 - 长期 WIBNI 总是成为最新危机的受害者 - 但我们将其基于插件实现的接口,并约定资源具有与接口相同的完全限定名称。
所以一个接口UsersAPI可能有各种不同的实现。默认情况下,该接口上的方法getBundle()返回相当于 ResourceBundle.get("...UsersAPI", locale). 该文件可以被替换,或者如果需要更复杂的东西,UsersAPI 的实现可以覆盖该方法。
到目前为止,这满足了我们的需要,但我们仍在寻找基于插件的更灵活的解决方案。
我正在对表单数据进行验证,这样当有人点击提交按钮时,它会首先检查表单的内容.许多字段(可能为零,可能不止一个,具体取决于页面)具有类似于需要先与服务器进行检查的唯一代码.我正在向服务器运行异步请求,它只是对每个字段响应' ok'或' taken'.如果任何字段有错误,则页面不会提交.
一方面,这应该是异步的:它应该在该请求处于关闭处理时继续验证其余的表单字段,包括触发其他请求.如果同步进行呼叫,则会明显减慢后续字段的反馈速度.
另一方面,我想确保所有验证请求都返回(或超时),然后才对validate()方法作出"是"或"否" ,并允许提交继续进行.因此,如果有两个字段需要验证,那么该validate()方法应该触发这两个AJAX请求,处理其余字段,然后等到这两个请求返回后再返回.
我可以通过一些丑陋的自制解决方案来实现这一点(可能涉及一组代表正在进行的请求的随机ID),但在我做之前是否有任何内置函数,插件或标准技术我应该使用?
澄清
我认为我需要的是在继续使用方法之前使代码等待来自一个或多个异步请求的结果.这与回调不同,因为方法的结果取决于请求的结果.它与同步请求不同,因为它们可能不止一个.
我在提交之前使用它来检查表单:
$("form").submit(function () {
return validate($(this));
});
Run Code Online (Sandbox Code Playgroud)
如果validate()方法返回false,则表单不提交.validate()hilights任何不被接受的领域.对于普通字段,validate()看起来像这样(大大简化的版本,没有反馈):
function validate(form) {
resetWarnings(form);
var ok = true;
// required fields
form.find("input.required").each(function () {
var field = $(this);
if (field.val() === "") {
ok = false;
}
return this; // meaningless in this case but a good habit to keep
});
// fields that matches a pattern
form.find("input.pattern").each(function () {
var …Run Code Online (Sandbox Code Playgroud) 我想在未知的A上使用不同类型的地图:
val map: Map[Foo[A], Bar[A]] = ...
...
val foo = new Foo[Qux]
val bar: Bar[Qux] = map(foo)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为A是未知的.我必须将其定义为:
val map: Map[Foo[_], Bar[_]] = ...
...
val foo = new Foo[Qux]
val bar: Bar[Qux] = map(foo).asInstanceOf[Bar[Qux]]
Run Code Online (Sandbox Code Playgroud)
这很有效,但演员很难看.我宁愿找到更好的方法.我收集答案是使用存在类型与forSome关键字,但我很困惑如何工作.应该是:
Map[Foo[A], Bar[A]] forSome { type A }
Run Code Online (Sandbox Code Playgroud)
要么:
Map[Foo[A] forSome { type A }, Bar[A]]
Run Code Online (Sandbox Code Playgroud)
要么:
Map[Foo[A forSome { type A }], Bar[A]]
Run Code Online (Sandbox Code Playgroud) 为了响应错误传递页面的错误,我们正在考虑从Apache + Tomcat切换到Glassfish.这不是受到功能的启发,而是受到一种不会消失的故障的挫败感.
问题是:
我们应该使用Glassfish与Apache合作,还是完全取代Apache?Apache和Tomcat之间的接口显然与我们看到的错误有关,我们最不需要的是再次出现同样的问题.另一方面,我们需要PHP,Apache已经设置好处理.
我们应该使用Glassfish 2还是3?版本3似乎是一个完全重写,这里和其他地方的评论表明很多人都坚持2.
Apache和Glassfish在同一台服务器上的合作能力如何?例如,Apache可以简单地将ProxyPass所有域的所有请求转移到Glassfish(而不是现在正在执行的更具体的Tomcat代理).
有没有更简单的方法?我讨厌无所事事地完成所有这些工作.
这个问题是否属于serverfault.com?
更新:澄清和扩展,因为原始问题被简化得太过分了
我需要一对特征,每个特征引用另一个特征,使父类和子类必须相互关联.
trait Parent [C <: Child] {
def foo(c: C)
}
trait Child [P <: Parent] {
def parent: P = ...
def bar = parent.foo(this)
}
Run Code Online (Sandbox Code Playgroud)
这样实现类必须成对出现:
class ActualParent extends Parent [ActualChild] {
def foo(c: ActualChild) = ...
}
class ActualChild extends Child [ActualParent] {
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,编译器不喜欢这些特性,因为泛型类型并不完整.而不是C <: Child需要说C <: Child[些什么].如果不指定它们也不起作用:
trait Parent [C <: Child[_]] {
def foo(c: C)
}
trait Child [P <: Parent[_]] {
def parent: P = …Run Code Online (Sandbox Code Playgroud) 由于可怕的,可怕的错误,我们改变了将Apache连接到Tomcat的方式.我们用的是mod_jk:
JkMount /path ajp13
Run Code Online (Sandbox Code Playgroud)
现在我们正在使用mod_proxy_ajp:
ProxyPass /path ajp://localhost:8009/path
ProxyPassReverse /path ajp://localhost:8009/path
Run Code Online (Sandbox Code Playgroud)
但是,有一个功能JkMount提供但ProxyPass不提供:选择文件类型的能力.这使得代理html文件成为可能,但不能代理图像 - 换句话说,让好的快速Apache服务于静态的东西,并仅仅为动态的东西使用缓慢的Tomcat.
JkMount /*.html ajp13
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这一目标ProxyPass?可能使用周围的<Location>指令或类似的东西?
我正在使用Solr搜索一长串ID,如下所示:
ID:("4d0dbdd9-d6e1-b3a4-490a-6a9d98e276be"
"4954d037-f2ee-8c54-c14e-fa705af9a316"
"0795e3d5-1676-a3d4-2103-45ce37a4fb2c"
"3e4c790f-5924-37b4-9d41-bca2781892ec"
"ae30e57e-1012-d354-15fb-5f77834f23a9"
"7bdf6790-de0c-ae04-3539-4cce5c3fa1ff"
"b350840f-6e53-9da4-f5c2-dc5029fa4b64"
"fd01eb56-bc4c-a444-89aa-dc92fdfd3242"
"4afb2c66-cec9-8b84-8988-dc52964795c2"
"73882c65-1c5b-b3c4-0ded-cf561be07021"
"5712422c-12f8-ece4-0510-8f9d25055dd9"...etc
Run Code Online (Sandbox Code Playgroud)
这可以达到一定程度,但超过一定的大小会失败并显示以下消息:布尔子句太多.您可以在solrconfig.xml中增加限制,但这只会到目前为止 - 我希望限制是有原因的:
<maxBooleanClauses>1024</maxBooleanClauses>
Run Code Online (Sandbox Code Playgroud)
我可以将查询拆分成几个小的,但这会阻止我对结果进行排序.必须有更合适的方法吗?
世界各地的纸张形状不尽相同。我有一个文档,当它打印在 A4 和 US Letter 上时,我想以不同的方式打印。一些元素应该隐藏或显示。显而易见的建议是使用媒体查询,如下所示:
@media print and (max-height: 280mm) {
.a4-only {
display: none;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不起作用,大概是因为它使用的是总文档高度或一些不相关的窗口高度而不是页面高度。
有没有办法准确解决页面大小?
我正在编写一个过滤the_content的WordPress插件,我想使用<!--more-->标签,但它似乎已经被它剥离了.这看起来不是过滤器,而是WordPress工作方式的功能.
我当然可以从数据库中重新加载已经加载的内容,但这听起来可能会引起其他麻烦.有没有什么好方法让我获得原始内容而不<!--more-->删除?