- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发帖的一半原因是在这里放一些对其他人有用的东西,因为网上几乎没有关于 PDF OCG/层的好东西,但我也需要一些帮助才能让它正常工作。 90% 好,还需要完成 10%。
我有一个层/OCG 列表,我希望其中一些嵌套。我想关闭整个组。我可以通过分成 2 个以上的数组并将我想要嵌套的列表插入基本列表来嵌套图层/OCG。
如果嵌套数组的第一个元素是字符串,它会在树结构中创建一个组。我可以单击“+”来打开和关闭组,但是没有“眼睛”框来打开或关闭组的可见性。
如果第一个元素不是字符串,它只是使用数组中的前一个元素作为父级,完成文件夹图标和可见性“眼睛”来点击,但是点击父层的“眼睛会转动/OCG,它不会关闭底层嵌套层/OCG。
如果我知道如何正确创建数据,这可能会得到解决。或者如何设置父 OCG。
有什么想法吗?
通过放置在以下位置来安装此脚本:c:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Javascripts
它会在Edit下创建一个菜单项,或者Document->Edit
一个示例 PDF 是 here 767k在本地下载以查看图层。
/********************************
RSCivilTools by Andrew Binning
Version 01, 2-15-2012
********************************/
//Some code by:
// InDesign Fixups by Dave Merchant - Creative Commons Share-alike license
// version 02, November 2010
// http://www.uvsar.com/go/indesignfixups
//create new submenu for the Acrobat 8/9 or X menus
//Determine version, assign menu location
var menuParent = (app.viewerVersion<10)? "DocumentProcessing":"Edit";
//Add the menu
app.addSubMenu({ cName:"RSCivilTools", cUser:"RSCivil Tools", cParent:menuParent, nPos:((app.viewerVersion<10)? 0:7) });
//Create a nested layer (tailored code for my specific Document.
app.addMenuItem({ cName:"RSCcreateNest", cUser:"Create Nest", cParent:"RSCivilTools",
cExec:"createNest();",
cEnable:"event.rc = (event.target != null);", nPos:0 });
//Promote sub layers - Unravel the nests
app.addMenuItem({ cName:"RSCpromote", cUser:"Undo Nest", cParent:"RSCivilTools",
cExec:"promoteOCG_handler(event.target);",
cEnable:"event.rc = (event.target != null);", nPos:1 });
//Unlist Guides and Grids layer (from Adobe IN-Design)
app.addMenuItem({ cName:"RSCremGAG", cUser:"Unlist 'Guides and Grids'", cParent:"RSCivilTools",
cExec:"removeGAG(event.target);",
cEnable:"event.rc = (event.target != null);", nPos:2 });
//Set up layers ( this is tailored code for my specific Document)
app.addMenuItem({ cName:"RSCsetStates", cUser:"Set Layers", cParent:"RSCivilTools",
cExec:"setStates();",
cEnable:"event.rc = (event.target != null);", nPos:3 });
//Toggle this list of layers on and off (tailored code for my specific Document.
app.addMenuItem({ cName:"RSCtoggleCityLimits", cUser:"Toggle City Limits", cParent:"RSCivilTools",
cExec:"toggleCityLimits();",
cEnable:"event.rc = (event.target != null);", nPos:4 });
//Link to the company website
app.addMenuItem({ cName:"RSCsite", cUser:"Website", cParent:"RSCivilTools",
cExec:"app.launchURL('http://rscivil.com');", nPos:5 });
//Add a button for this function - Add from Quick Tools 3rd party addons
app.addToolButton({
cName: "RSCcreateNestButton",
cExec: "createNest();",
cTooltext: "Create Nest",
cEnable: true,
nPos: 0,
cLabel: "Create Nest"
})
//Add a button for this function - Add from Quick Tools 3rd party addons
app.addToolButton({
cName: "promoteLayers",
cExec: "promoteOCG_handler(event.target);",
cTooltext: "Undo Nest",
cEnable: true,
nPos: 1,
cLabel: "Undo Nest"
})
//Creates a nested layer from a predetermined list
function createNest(){
var layers = this.getOCGs();
var newOrder = new Array();
var cityLimits = new Array();
var comps = new Array();
/*******************************************************
This is where I need help.
By not setting the first element to a String it does not name the group. Instead it seems to attach it as a child to the previous element in the array.
This is fine, except that when you turn off said parent it does not turn off the sub layers/OCGs.
If I could figure out how to create an object and set it up as an element before my inserted array it might help.
*******************************************************/
//Commented for testing - Set first element of the array to a descriptive string (this will be the name of the nested group)
//cityLimits[0] = "City Limits";
//Set first element of the array to a descriptive string (this will be the name of the nested group)
comps[0] = "Comps";
//Separate all layers/OCGs containing "CityLimits|" or "COMP" from the original list of layers/OCGs
for (var i=0,j=0,k=0,l=1; i<layers.length; i++){
if(layers[i].name.substr(0,11)==="CityLimits|"){
cityLimits[j] = layers[i]; //separate CityLimits OCG
j++;
}
else if(layers[i].name.substr(0,4)==="COMP"){
comps[l] = layers[i]; //separate COMP OCG
l++;
}
else{
newOrder[k] = layers[i]; //cram everything else into a new array
k++;
}
}
//Insert the cityLimits array into the newOrder array at position 5, do not remove any elements (the element before this arbitrarily becomes the parent, but does not work correctly)
newOrder.splice(5,0,cityLimits);
//Append the comps array to the end of the newOrder array
newOrder[newOrder.length] = comps;
//set the newOrder array as the OCGOrder.
this.setOCGOrder(newOrder);
}
//Code by Dave Merchant
//Handler for promoting OCGs out of nested layers
function promoteOCG_handler(oDoc) {
var ocgOrder = oDoc.getOCGOrder();
var hasNest = false;
if (ocgOrder==null) {
app.alert( "No layers in current file", 0, 0, "Cannot proceed");
} else {
for (var i=0; i<ocgOrder.length; i++) {
if ((typeof(ocgOrder[i]) == "object") && (ocgOrder[i].length > 0)) hasNest = true;
}
if (hasNest) {
promoteOCGs(oDoc,ocgOrder);
} else app.alert( "No nested layers in current file", 0, 0, "Cannot proceed");
}
}
//Code by Dave Merchant
//Promote/unravel layers/OCG out of nests
function promoteOCGs(oDoc,ocgOrder) {
// Removes the top-level OCG nest structure from a PDF, promoting all sub-OCGs to the top level.
// Used to remove the nesting created when a PDF is exported from InDesign with "Create Acrobat Layers" checked.
var oChk = { cMsg:"Unlist the 'Guides and Grids' layer?", bInitialValue:true, bAfterValue:false};
//var cMesg = "This action will ungroup all nested layers. IT CANNOT BE UNDONE.\n\nDo you want to continue?";
//var nRtn = app.alert({ cMsg:cMesg, nIcon:2, nType:2, cTitle:"Promote nested layers", oCheckbox:oChk});
//if (nRtn == 4) {
var newOrder = new Array();
for (var i=0; i<ocgOrder.length; i++) {
var oType = typeof(ocgOrder[i]);
var oLeng = ocgOrder[i].length
if ((oType == "object") && (oLeng > 0)) { // it's a nest, do the promotions
for (var j=0; j<oLeng; j++) {
if ((typeof(ocgOrder[i][j]) == "object") &&
(!oChk.bAfterValue || (ocgOrder[i][j].name != "Guides and Grids"))) newOrder.push(ocgOrder[i][j]);
}
} else if (!oChk.bAfterValue || (ocgOrder[i].name != "Guides and Grids")) newOrder.push(ocgOrder[i]);
}
oDoc.setOCGOrder( newOrder );
//}
}
//Code by Dave Merchant
// Removes the listing for (sub)OCG named "Guides and Grids".
// Does NOT delete the layer, simply hides it from the sidebar display.
function removeGAG(oDoc) {
var cMesg = "This action will unlist the 'Guides and Grids' layer from the sidebar but will NOT delete the ";
cMesg += "layer itself. IT CANNOT BE UNDONE.\n\nDo you want to continue?";
var nRtn = app.alert(cMesg, 2, 2, "Unlist 'Guides and Grids'");
if (nRtn == 4) {
var ocgOrder = oDoc.getOCGOrder();
var newOrder = new Array();
for (var i=0; i<ocgOrder.length; i++) {
var oType = typeof(ocgOrder[i]);
var oLeng = ocgOrder[i].length
if ((oType == "object") && (oLeng > 0)) { // it's a nest
var subObj = new Array();
for (var j=0; j<oLeng; j++) {
if ((typeof(ocgOrder[i][j]) == "string") || (ocgOrder[i][j].name != "Guides and Grids")) subObj.push(ocgOrder[i][j]);
}
newOrder.push(subObj);
} else if (ocgOrder[i].name != "Guides and Grids") newOrder.push(ocgOrder[i]);
}
oDoc.setOCGOrder( newOrder );
}
}
//Just a list of layers I want to toggle on or off (document specific)
function togList(name){
if(name.substr(0,11)==="CityLimits|")
return true;
return false;
}
//Just a list of layers I want to set an initial state to off (document specific)
function offList(name){
var lOff = new Array();
lOff[0] = "ADT";
lOff[1] = "CityLimits|1900";
lOff[2] = "CityLimits|1910";
lOff[3] = "CityLimits|1920";
lOff[4] = "CityLimits|1930";
lOff[5] = "CityLimits|1940";
lOff[6] = "CityLimits|1950";
lOff[7] = "CityLimits|1960";
lOff[8] = "CityLimits|1970";
lOff[9] = "CityLimits|1975";
lOff[10] = "CityLimits|1980";
lOff[11] = "CityLimits|1985";
lOff[12] = "CityLimits|1990";
lOff[13] = "CityLimits|1995";
lOff[14] = "CityLimits|2000";
lOff[15] = "CityLimits|2005";
lOff[16] = "CityLimits|2006";
lOff[17] = "CityLimits|2007";
lOff[18] = "CityLimits|2008";
lOff[19] = "CityLimits|2009";
lOff[20] = "CityLimits|2010";
lOff[21] = "CityLimits|2011";
lOff[29] = "Distance Circles 1";
lOff[30] = "Distance Circles 2";
lOff[31] = "landuse|Agriculture";
lOff[32] = "landuse|Industrial";
lOff[33] = "Landmark Labels Locations";
lOff[34] = "landmarks|Locations";
for (var i=0; i<lOff.length; i++){
if(lOff[i] === name)
return true;
}
return false;
}
//Checks all layers against a list and toggles them off or on (document specific)
function toggleCityLimits(){
var layers = this.getOCGs();
for (var i=0; i<layers.length; i++){
var tog = true;
if(togList(layers[i].name)){
if(layers[i].state)
tog = false;
layers[i].state = tog; //toggle layer
}
}
}
//Checks all layers against a list and sets the initial state and current state to off (state=visibility) (document specific)
function setStates(){
var layers = this.getOCGs();
for (var i=0; i<layers.length; i++){
var tog = true;
if(offList(layers[i].name))
tog = false;
layers[i].state = tog; //turn off layer
layers[i].initState = tog; //set initial visibilty to off
}
}
最佳答案
Acrobat 中显示的图层树(您上面的代码构建的内容)不一定与 PDF 页面中定义的图层树内容相匹配。
页面内容中的 PDF 层定义如下:
/OC /layerid /BDC
...
/EMC
在页面内容中,您可以并排放置 2 个图层:
/OC /layer1id /BDC
...
/EMC
/OC /layer2id /BDC
...
/EMC
但在 Acrobat 的图层 Pane 中,您可以将 layer2 作为 layer1 的子级,因为定义此层次结构的/Order 数组与页面内容无关。
为了在隐藏 layer1(其父级)时自动隐藏 layer2,必须在页面内容中这样定义它们:
/OC /layer1id /BDC
...
/OC /layer2id /BDC
...
/EMC
/EMC
layer2的内容必须在物理上包含在layer1中。
您的问题出现是因为页面内容中的所有图层都是并排构建的,而不是子父级,并且更改/Order 数组不会影响页面内容。
我看到的解决方案是,尽管我对 Adobe Acrobat JavaScript 不是很熟悉,而且我不知道是否可行,但它是将一个 JavaScript 函数附加到每个父层,该函数在层可见性发生变化时执行,并且还改变了所有子层的可见性。
关于javascript - 如何在 acrobat PDF 中使用 javascript 创建嵌套的 OCG/图层并将其附加到父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9299757/
所以我试图设置“内容”类的高度,但它似乎不起作用。我对嵌套 DIV 非常陌生,我已经尝试了我在谷歌搜索中发现的修复程序,但似乎没有任何效果。帮助?
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
基本上,我的问题很简单,但它需要知道 Struts 1.1 并且还活着的人。 我尝试构建的伪代码看起来像这样: IF element.method1 = true THEN IF element
我正在尝试将 Excel 嵌套 IF 语句转换为代码语言,但我不确定我是否正确执行此操作,希望能得到一些帮助 这是Excel语句: =IF(D3="Feather",IF(OR(I3>1000,R3=
如果我们创建两个或三个评论并对其进行多次回复,则“有用”链接在单击时会导致问题,它会对具有相同编号的索引执行 ng-click 操作,从而显示具有相同索引的所有文本。如何解决此嵌套问题,以便在单击链接
我在项目中使用Scala,想与Stripe集成,但它只提供Java API。例如,要创建 session ,我使用: val params = new util.HashMap[String, Any
以下代码有一个 Div,其中连续包含四个较小的 Div。四个 Div 中的每一个还包含一个较小的 Div,但此 Div 未显示。我尝试了各种显示和位置组合,看看 div 是否会出现。 classGoa
我在这里有一个问题,循环是: for (i=0; i < n; ++i) for (j = 3; j < n; ++j) { ...
我正在尝试编写代码来显示具有奇数宽度的形状。形状完成后,将其放置在外部形状内。用户将能够输入用于形状的字符和行数。我希望生成一个形状,并通过 for 循环生成一个外部形状。 ***** .
$(".globalTabs").each(function(){ var $globalTabs = $(this); var parent = $globalTabs.parent
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
所以我在这个问题上遇到了一些麻烦,因为变量 i。我只是不确定在第二个 while 循环中如何处理它。对于我的外循环,我知道它将运行 log_4(n^2) 次迭代。对于内部 while 循环,我计算的迭
我似乎找不到在枚举上应用多个 if/then 逻辑的工作方式。 anyOf 不应用条件逻辑,而是表示如果其中任何一个匹配则很好。 allOf 再次不应用条件逻辑,而是测试属性/必填字段的超集。 这是一
如何访问 ReaderT 的内部 monad。 在我的例子中,我有类型: newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSCo
这个问题在这里已经有了答案: Add leading zeroes/0's to existing Excel values to certain length (7 个回答) 7年前关闭。 我正在寻
我已经绑定(bind)了很多 AND/OR 函数的组合并且没有运气。 这是我需要创建的: 在 B 列中,我有公司 ID,范围从两个数字字符到六个数字字符。 我需要在 B 列中的每个公司 ID 之前的每
我是 VBA 新手,在尝试编写的宏中使用 If 语句时遇到了一些困难。每个月我都会收到一份 Excel 报告,其中列出了我们公司的哪些员工执行了某些任务。我正在编写的宏旨在将每个员工的数据复制并粘贴到
如果在 B 列中找到单元格 A1 中的值,则使用文本 321 填充除非在 C 列中找到单元格 A1 中的值,在这种情况下填充文本 121反而。如果单元格 A1 的内容不在 B 列或 C 列中,则使用
我有几十万个地址。其中一些在整数之后有粒子。如 4356 A Horse Avenue , 其他格式正常4358 Horse Avenue .有些有“A”,有些有“B”。我正在尝试删除整数和粒子之间的
我是一名优秀的程序员,十分优秀!