我試圖爲現有的pdf文件創建一個目錄表,然後將目錄頁面合併到pdf文件中。頁面標題和相應的頁碼可在單獨的Excel中使用文件。爲現有的Pdf創建目錄
我正在使用iText進行PDF操作。 我遇到的所有例子都與創建新pdf時插入鏈接有關。但在我的情況下,我想創建現有網頁的鏈接。
任何建議或例子將不勝感激。
我試圖爲現有的pdf文件創建一個目錄表,然後將目錄頁面合併到pdf文件中。頁面標題和相應的頁碼可在單獨的Excel中使用文件。爲現有的Pdf創建目錄
我正在使用iText進行PDF操作。 我遇到的所有例子都與創建新pdf時插入鏈接有關。但在我的情況下,我想創建現有網頁的鏈接。
任何建議或例子將不勝感激。
我終於找到答案。感謝我的朋友指點我在c#中的一個例子。
在Java代碼如下所示:
public class Test1 {
public static void main(String args[]) throws Exception{
PdfReader reader = new PdfReader(new RandomAccessFileOrArray("C:\\test.pdf"), null);
Document doc = new Document(reader.getPageSize(1));
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("C:\\result.pdf"));
Font link = FontFactory.getFont("Arial", 12, Font.UNDERLINE);
doc.open();
PdfContentByte pdfContentByte = writer.getDirectContent();
Anchor topAnchor = null;
PdfImportedPage page = null;
for (int i = 1; i < reader.getNumberOfPages(); i++)
{
if (i == 1)
{
Anchor click = new Anchor("Click to go to Target");
click.setReference("#target");
Paragraph p1 = new Paragraph();
p1.add(click);
doc.add(p1);
page = writer.getImportedPage(reader, i);
doc.newPage();
pdfContentByte.addTemplate(page, 0, 0);
}
else
{
if (i == 5)
{
Anchor target = new Anchor("My targer");
target.setName("target");
Paragraph p3 = new Paragraph();
p3.add(target);
doc.add(p3);
}
page = writer.getImportedPage(reader, i);
doc.newPage();
pdfContentByte.addTemplate(page, 0, 0);
}
}
doc.close();
}
}
我查找了我在Flying Saucer中製作的補丁,可以點擊鏈接並使其執行某些操作。這是很久以前的,所以我不確定這是否會有所幫助,但似乎是使用iText。下面是代碼,我覺得我寫的這個片斷:P
private void processLink(RenderingContext c, Box box) {
Element elem = box.getElement();
if (elem != null) {
NamespaceHandler handler = _sharedContext.getNamespaceHandler();
String uri = handler.getLinkUri(elem);
if (uri != null) {
if (uri.length() > 1 && uri.charAt(0) == '#') {
String anchor = uri.substring(1);
Box target = _sharedContext.getBoxById(anchor);
if (target != null) {
PdfDestination dest = createDestination(c, target);
if (dest != null) {
PdfAction action = new PdfAction();
if (!"".equals(handler.getAttributeValue(elem, "onclick"))) {
action = PdfAction.javaScript(handler.getAttributeValue(elem, "onclick"), _writer);
} else {
action.put(PdfName.S, PdfName.GOTO);
action.put(PdfName.D, dest);
}
com.lowagie.text.Rectangle targetArea = checkLinkArea(c, box);
if (targetArea == null) {
return;
}
targetArea.setBorder(0);
targetArea.setBorderWidth(0);
PdfAnnotation annot = new PdfAnnotation(_writer, targetArea.getLeft(), targetArea.getBottom(),
targetArea.getRight(), targetArea.getTop(), action);
annot.put(PdfName.SUBTYPE, PdfName.LINK);
annot.setBorderStyle(new PdfBorderDictionary(0.0f, 0));
annot.setBorder(new PdfBorderArray(0.0f, 0.0f, 0));
_writer.addAnnotation(annot);
}
}
} else if (uri.indexOf("://") != -1) {
PdfAction action = new PdfAction(uri);
com.lowagie.text.Rectangle targetArea = checkLinkArea(c, box);
if (targetArea == null) {
return;
}
PdfAnnotation annot = new PdfAnnotation(_writer, targetArea.getLeft(), targetArea.getBottom(), targetArea.getRight(),
targetArea.getTop(), action);
annot.put(PdfName.SUBTYPE, PdfName.LINK);
annot.setBorderStyle(new PdfBorderDictionary(0.0f, 0));
annot.setBorder(new PdfBorderArray(0.0f, 0.0f, 0));
_writer.addAnnotation(annot);
}
}
}
}
這是org.xhtmlrenderer.pdf.ITextOutputDevice。
我不確定你的工作環境。是否有足夠的信息來弄清楚如何做到這一點?
我不確定上述代碼是如何工作的。我會檢查這一點,並讓你知道。 –
@RachitAgrawal看到我的編輯。我在這個重要的路線上包含了更多的背景。這有幫助嗎? –
在我看來,部分內容的表是一個細節。你真正要問的是如何修改一個已經存在的PDF。我知道我揮手致意,但如果您可以閱讀PDF並編寫PDF,那麼您所需要做的就是在這些步驟之間添加TOC。有什麼問題? –
我的問題是如何創建現有網頁的鏈接?我可以在pdf中添加一個新頁面並添加標籤,但是如何將該標籤指向某個頁碼? –
啊,這是我不知道如何在iText中做的事情,但我做了一個補丁,使它可以在飛碟https://code.google.com/p/flying-saucer/中使用iText,所以我知道這一定是可能的。你應該看看飛碟。它可能是一個更好的API。 –