使用iText
我们可以轻松更改链接的缩放级别.甚至还有一段代码可以为GoTo
目标类型执行此操作.如需便利,请在下面找到.
PdfReader reader = new PdfReader(src);
PdfDictionary page = reader.getPageN(11);
PdfArray annots = page.getAsArray(PdfName.ANNOTS);
for (int i = 0; i < annots.size(); i++) {
PdfDictionary annotation = annots.getAsDict(i);
if (PdfName.LINK.equals(annotation.getAsName(PdfName.SUBTYPE))) {
PdfArray d = annotation.getAsArray(PdfName.DEST);
if (d != null && d.size() == 5 && PdfName.XYZ.equals(d.getAsName(1)))
d.set(4, new PdfNumber(0));
}
}
Run Code Online (Sandbox Code Playgroud)
该代码仅处理PDF文件中找到的目标类型之一.我有兴趣在其他类型的目的地中更改缩放(如果有人想知道,它们会在32000-1中列出).具体来说,我想更改每个目的地以GoTo
键入并指定我自己的坐标.我希望左坐标与要跳转的页面的页面高度相同.要做到这一点,我显然需要页码.我怎么得到它?
到目前为止我做了什么?该指令PdfArray d = annotation.getAsArray(PdfName.DEST)
给出了一个数组,其第一个(0基)元素是页面引用,而不是页面编号,如Bruno Lowagie在他的iText in Action, 2nd edition, p. 202). The array looks like this:
[1931 0 R,/ XYZ,0,677,0]中解释的那样.我无法找到正确的命令来获取我自己的页码,因此这篇文章.
我希望左侧坐标与要跳转的页面的页面高度相同。为此,我显然需要页码。我怎样才能得到它?
您需要页码的假设是错误的。是的,实用PdfReader
方法主要基于页码工作,但这些方法中没有太多内容。因此,如果您可以进行一些低级数据访问,则不需要页码。
以下是您的代码,其中包含用于检索裁剪框(定义左、下、右和顶部页面坐标)的附加代码,一次直接从目标中的对象引用检索,一次通过页码检索。
PdfReader reader = new PdfReader(src);
PdfDictionary page = reader.getPageN(11);
PdfArray annots = page.getAsArray(PdfName.ANNOTS);
for (int i = 0; i < annots.size(); i++) {
PdfDictionary annotation = annots.getAsDict(i);
if (PdfName.LINK.equals(annotation.getAsName(PdfName.SUBTYPE))) {
PdfArray d = annotation.getAsArray(PdfName.DEST);
if (d == null) { // in case the link has not a Dest but instead a GoTo action
PdfDictionary action = annotation.getAsDict(PdfName.A);
if (action != null)
d = action.getAsArray(PdfName.D);
}
if (d != null && d.size() > 0) {
System.out.println("Next destination -");
PdfIndirectReference pageReference = d.getAsIndirectObject(0);
// Work with target dictionary directly
PdfDictionary pageDict = d.getAsDict(0);
PdfArray boxArray = pageDict.getAsArray(PdfName.CROPBOX);
if (boxArray == null) {
boxArray = pageDict.getAsArray(PdfName.MEDIABOX);
}
Rectangle box = PdfReader.getNormalizedRectangle(boxArray);
System.out.printf("* Target page object %s has cropbox %s\n", pageReference, box);
// Work via page number
for (int pageNr = 1; pageNr <= reader.getNumberOfPages(); pageNr++) {
PRIndirectReference pp = reader.getPageOrigRef(pageNr);
if (pp.getGeneration() == pageReference.getGeneration() && pp.getNumber() == pageReference.getNumber()) {
System.out.printf("* Target page %s has cropbox %s\n", pageNr, reader.getCropBox(pageNr));
break;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
(流程链接测试testDetermineTargetPage
)
顺便说一句,目的地也可以是命名目的地。因此,如果某些 PDF 的Dest值碰巧不是数组而是字符串,您只需在Dests名称树中进行查找即可。
归档时间: |
|
查看次数: |
347 次 |
最近记录: |