抱歉,我是PDF框的新手,正在寻找一种解决方案,该方案如何使用书签名称获取特定的pdf页面?像下面的代码片段一样,我试图循环所有页面,但卡住了将书签与我需要的页面链接。有人可以帮忙吗?
import java.awt.print.PrinterException;
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.cos.COSObject;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageFitWidthDestination;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineNode;
public class PDFLoader {
public static void main(String[] args) throws InvalidPasswordException, IOException, PrinterException {
File file = new File("d:\\pdf\\sample.pdf");
PDDocument document = PDDocument.load(file);
PDPage page01 = document.getDocumentCatalog().getPages().get(0);
PDPage page02 = document.getDocumentCatalog().getPages().get(1);
PDDocumentOutline outline = document.getDocumentCatalog().getDocumentOutline();
printBookmark(outline, "");
PDDocument doc = new PDDocument();
doc.addPage(page01);
doc.addPage(page02);
doc.save("d:\\pdf\\newSample.pdf");
doc.close();
}
public static PDPage getBookmark(PDOutlineNode bookmark, String indentation) throws IOException
{
PDOutlineItem current = bookmark.getFirstChild();
while (current != null)
{
System.out.println(indentation + current.getTitle());
if (current.getAction() instanceof PDActionGoTo)
{
PDActionGoTo gta = (PDActionGoTo) current.getAction();
if (gta.getDestination() instanceof PDPageDestination)
{
if(current.getTitle().equals("MyBookMark")){
PDPageDestination pd = (PDPageDestination) current.getDestination();
System.out.println("Destination page: " + pd.retrievePageNumber());
return pd.getPage();
}
}
}
getBookmark(current, indentation + " ");
current = current.getNextSibling();
}
return null;
}
//Stack Trace
Exception in thread "main" java.lang.NullPointerException
at com.mypackage.PDFLoader.getBookmark(PDFLoader.java:67)
at com.mypackage.PDFLoader.main(PDFLoader.java:40)
事实证明,在PDF中,页面目标不在书签的目标条目中,而是在书签的操作项中(是的,PDF使您可以通过两种方式来执行同一操作)。将此添加到您的代码:
if (current.getDestination() instanceof PDPageDestination)
{
PDPageDestination pd = (PDPageDestination) current.getDestination();
System.out.println("Destination page: " + (pd.retrievePageNumber() + 1));
return pd.getPage();
}
if (current.getAction() instanceof PDActionGoTo)
{
PDActionGoTo gta = (PDActionGoTo) current.getAction();
if (gta.getDestination() instanceof PDPageDestination)
{
PDPageDestination pd = (PDPageDestination) gta.getDestination();
System.out.println("Destination page: " + (pd.retrievePageNumber() + 1));
return pd.getPage();
}
}
我正在从PDF中删除一个带有书签链接的页面。删除页面后,指向此页面的书签链接不再有效。 我没有从PDFBox api中找到一种方法来完成这项工作 有没有办法删除这个书签?有没有办法删除全部书签? 提前感谢
我正在尝试使用pdfbox库签署pdf。我现在卡住了,真的需要帮助。 这是我的代码: 然后我正在保存我的pdf,但是:1)我注意到sign method从来没有被调用2)我应该在哪里附加CertyFicate?在sign method中? 以下是我保存PDF的方法:
我已经用所有3种可用的字体试过了;TimesNewRoman、Courier和Helvitica三家公司都出现了相同的例外情况。 但是当您查看apcahe pdfBox源代码中的WIN_ANSI_ENCODING_TABLE时, 我们可以看到定义了下面的非破缺空间。 在pdf规范文档中也引用了以下内容: 空格字符在MacRomanEncoding中也应编码为312,在WinAnsiEncoding
我刚刚创建了DocuSign开发人员帐户。我必须使用签名对PDF进行签名,并用C#将其发送给收件人。我不希望收件人使用https://developers.docusign.com/esign-rest-api/code-examples/code-example-request-a-signature-via-email。我的系统中已经有PDF可用,我需要使用DocuSign API签名并将其发
我想使用在数字PDF末尾插入空白页面。我的困惑是添加页面会使现有签名无效?谢谢。
问题内容: 我有一个简单的HTML页面,iText可以从中生成PDF。很好,但是该复选框被忽略。我该怎么办? 我在YAHP(http://www.allcolor.org/YaHPConverter/)上使用了它。 问题答案: 从html使用iText创建pdf有点麻烦。我建议为此使用飞碟库。它还在后台使用iText。