我想使用java netbeans从pdf中的按钮中获取图像图标,并将其放在某个面板中。然而,我在这里打了一块砖头。我正在使用PDFBox作为我的PDF导出器,我似乎无法理解。我已经成功地从表单字段读取,但是只要我尝试在PDFBox中找到它,就没有按钮提取器。我应该如何制作它?是否可以使用此方法,或者是否有其他方法。提前致谢。
编辑:我已经发现使用使用此代码的示例实用程序的提取时间:
File myFile = new File(filename);
try {
//PDDocument pdDoc = PDDocument.loadNonSeq( myFile, null );
PDDocument pdDoc = null;
pdDoc = PDDocument.load( myFile );
PDDocumentCatalog pdCatalog = pdDoc.getDocumentCatalog();
PDAcroForm pdAcroForm = pdCatalog.getAcroForm();
// dipakai untuk membaca isi file
List pages = pdDoc.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
while( iter.hasNext() )
{
PDPage page = (PDPage)iter.next();
PDResources resources = page.getResources();
Map images = resources.getImages();
if( images != null )
{
Iterator imageIter = images.keySet().iterator();
while( imageIter.hasNext() )
{
String key = (String )imageIter.next();
PDXObjectImage image = (PDXObjectImage)images.get(key);
BufferedImage imagedisplay= image.getRGBImage();
jLabel5.setIcon(new ImageIcon(imagedisplay)); // NOI18N
}
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "error " + e.getMessage());
}
但是我仍然无法从按钮图像中读取。顺便说一句,我从这个页面阅读了将按钮图像添加到pdf的教程。https://acrobatusers.com/tutorials/how-to-create-a-button-form-field-to-insert-a-pdf-file
第二次编辑:在这里,我还为您提供了包含图标的pdf的链接。PDF链接。提前谢谢你。
当你谈论pdf中的按钮时,我想你指的是交互式表单按钮。
PDFBox中没有用于按钮的显式图标提取器。但是,由于具有自定义图标的按钮(以及一般的注释)将这些图标定义为其外观的一部分,因此可以简单地(递归地)遍历注释外观的资源,并使用子类型 Image 收集 XObjects:
public void extractAnnotationImages(PDDocument document, String fileNameFormat) throws IOException
{
List<PDPage> pages = document.getDocumentCatalog().getAllPages();
if (pages == null)
return;
for (int i = 0; i < pages.size(); i++)
{
String pageFormat = String.format(fileNameFormat, "-" + i + "%s", "%s");
extractAnnotationImages(pages.get(i), pageFormat);
}
}
public void extractAnnotationImages(PDPage page, String pageFormat) throws IOException
{
List<PDAnnotation> annotations = page.getAnnotations();
if (annotations == null)
return;
for (int i = 0; i < annotations.size(); i++)
{
PDAnnotation annotation = annotations.get(i);
String annotationFormat = annotation.getAnnotationName() != null && annotation.getAnnotationName().length() > 0
? String.format(pageFormat, "-" + annotation.getAnnotationName() + "%s", "%s")
: String.format(pageFormat, "-" + i + "%s", "%s");
extractAnnotationImages(annotation, annotationFormat);
}
}
public void extractAnnotationImages(PDAnnotation annotation, String annotationFormat) throws IOException
{
PDAppearanceDictionary appearance = annotation.getAppearance();
extractAnnotationImages(appearance.getDownAppearance(), String.format(annotationFormat, "-Down%s", "%s"));
extractAnnotationImages(appearance.getNormalAppearance(), String.format(annotationFormat, "-Normal%s", "%s"));
extractAnnotationImages(appearance.getRolloverAppearance(), String.format(annotationFormat, "-Rollover%s", "%s"));
}
public void extractAnnotationImages(Map<String, PDAppearanceStream> stateAppearances, String stateFormat) throws IOException
{
if (stateAppearances == null)
return;
for (Map.Entry<String, PDAppearanceStream> entry: stateAppearances.entrySet())
{
String appearanceFormat = String.format(stateFormat, "-" + entry.getKey() + "%s", "%s");
extractAnnotationImages(entry.getValue(), appearanceFormat);
}
}
public void extractAnnotationImages(PDAppearanceStream appearance, String appearanceFormat) throws IOException
{
PDResources resources = appearance.getResources();
if (resources == null)
return;
Map<String, PDXObject> xObjects = resources.getXObjects();
if (xObjects == null)
return;
for (Map.Entry<String, PDXObject> entry : xObjects.entrySet())
{
PDXObject xObject = entry.getValue();
String xObjectFormat = String.format(appearanceFormat, "-" + entry.getKey() + "%s", "%s");
if (xObject instanceof PDXObjectForm)
extractAnnotationImages((PDXObjectForm)xObject, xObjectFormat);
else if (xObject instanceof PDXObjectImage)
extractAnnotationImages((PDXObjectImage)xObject, xObjectFormat);
}
}
public void extractAnnotationImages(PDXObjectForm form, String imageFormat) throws IOException
{
PDResources resources = form.getResources();
if (resources == null)
return;
Map<String, PDXObject> xObjects = resources.getXObjects();
if (xObjects == null)
return;
for (Map.Entry<String, PDXObject> entry : xObjects.entrySet())
{
PDXObject xObject = entry.getValue();
String xObjectFormat = String.format(imageFormat, "-" + entry.getKey() + "%s", "%s");
if (xObject instanceof PDXObjectForm)
extractAnnotationImages((PDXObjectForm)xObject, xObjectFormat);
else if (xObject instanceof PDXObjectImage)
extractAnnotationImages((PDXObjectImage)xObject, xObjectFormat);
}
}
public void extractAnnotationImages(PDXObjectImage image, String imageFormat) throws IOException
{
image.write2OutputStream(new FileOutputStream(String.format(imageFormat, "", image.getSuffix())));
}
(来自ExtractAnnotationImageTest.java)
不幸的是,OP没有提供示例PDF,所以我将代码应用到这个示例文件中
(存储为资源)如下:
/**
* Test using <a href="http://examples.itextpdf.com/results/part2/chapter08/buttons.pdf">buttons.pdf</a>
* created by <a href="http://itextpdf.com/examples/iia.php?id=154">part2.chapter08.Buttons</a>
* from ITEXT IN ACTION — SECOND EDITION.
*/
@Test
public void testButtonsPdf() throws IOException
{
try (InputStream resource = getClass().getResourceAsStream("buttons.pdf"))
{
PDDocument document = PDDocument.load(resource);
extractAnnotationImages(document, new File(RESULT_FOLDER, "buttons%s.%s").toString());;
}
}
(来自ExtractAnnotationImageTest.java)
得到了这些图像:
和
这里有两个问题:
因此,请在PDF中检查此代码。如果需要,可以改进。
同时,OP提供了一个示例文件imageicon.pdf
像这样调用上面的方法
/**
* Test using <a href="http://www.docdroid.net/TDGVQzg/imageicon.pdf.html">imageicon.pdf</a>
* created by the OP.
*/
@Test
public void testImageiconPdf() throws IOException
{
try (InputStream resource = getClass().getResourceAsStream("imageicon.pdf"))
{
PDDocument document = PDDocument.load(resource);
extractAnnotationImages(document, new File(RESULT_FOLDER, "imageicon%s.%s").toString());;
}
}
(来自ExtractAnnotationImageTest.java)
输出此图像:
因此,它工作得很好!
在注释中指出的操作是
仍然混淆使用jUnit测试方法,但是当我尝试将其调用到我的主程序中时,它总是返回“流关闭”错误。我已经将文件作为与我的jar相同的目录,也试图手动给出路径,但仍然是相同的错误。
因此,我向该类添加了一个< code>main方法,以允许它
在代码中:
public static void main(String[] args) throws IOException
{
ExtractAnnotationImageTest extractor = new ExtractAnnotationImageTest();
for (String arg : args)
{
try (PDDocument document = PDDocument.load(arg))
{
extractor.extractAnnotationImages(document, arg+"%s.%s");;
}
}
}
(来自ExtractAnnotationImageTest.java)
有可能吗?如果是,那么它可以怎么做。
问题内容: 我需要从服务器上的PDF文件中提取所有图像。我不想要PDF页面,只想要原始尺寸和分辨率的图像。 如何使用Perl,PHP或任何其他基于UNIX的应用程序(我将使用PHP的exec函数调用它)来做到这一点? 问题答案: pdfimages就是这样做的。它是poppler- utils和xpdf-utils软件包的一部分。 从联机帮助页: Pdfimages将可移植文档格式(PDF)文件中
我更喜欢使用PDFBox来完成这个任务。 非常感谢任何帮助。
我想从现有的pdf中获取图像字段,并用其他图像填充它,以使用java中的pdfbox库创建新的pdf文件
假设我的用户去了他们办公室的扫描仪。扫描仪能够生成扫描文档的PDF。这基本上就是我拥有的文件类型。 我想做的是从这个PDF中提取文本。这不是“第一代”pdf,因为文本没有嵌入到pdf中。文本嵌入在PDF中的图像中。 PDFBox的iText中是否有允许检索此数据的功能?如果可能的话,我正在尝试避免对图像进行OCR。我希望IText或PDFBox中有一些内置的东西可以做到这一点。 请注意,我不是在谈
我知道以前也有人问过类似的问题,但是这些问题已经过时了(有些问题可以追溯到2006年)。 我有一个. net 3.5应用程序(w/iTextSharp 5),我正在转换为. net核心(iText 7),它从联邦快递跟踪文档中提取签名,通过SOAP服务以字节[]数组发送。这段代码多年来一直运行良好,只是略有更新。从联邦快递返回的PDF文档中有几个图像,但签名块不是110x46图像(这是pdf文件中