我知道以前也有人问过类似的问题,但是它们已经过时了(有些可以追溯到 2006 年)。
我有一个 .net 3.5 应用程序(带有 iTextSharp 5),我正在转换为 .net core(iText 7),它从 FedEx 跟踪文档中提取签名,并通过 SOAP 服务以 byte[] 数组形式发送。该代码多年来一直运行良好,仅进行了少量更新。从 Fedex 返回的 PDF 文档中有几个图像,但签名块不是 110x46 图像(这是 pdf 文件中的 fedex 徽标,因此我跳过它。)
PdfReader pdf = new PdfReader(FedexData);
for(Int32 iPage = 1; iPage <= pdfReader.NumberOfPages; iPage++)
{
PdfDictionary pg = pdf.GetPageN(iPage);
PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
PdfDictionary xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
foreach(PdfName name in xobj.Keys)
{
PdfObject obj = xobj.Get(name);
if(obj.IsIndirect())
{
PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
String width = tg.Get(PdfName.WIDTH).ToString();
String height = tg.Get(PdfName.HEIGHT).ToString();
String decode = tg.Contains(PdfName.DECODEPARMS) ? tg.Get(PdfName.DECODEPARMS).ToString() : "";
String bitspercomponent = tg.Contains(PdfName.BITSPERCOMPONENT) ? tg.Get(PdfName.BITSPERCOMPONENT).ToString() : "";
String colorspace = tg.Contains(PdfName.COLORSPACE) ? tg.Get(PdfName.COLORSPACE).ToString() : "";
if(width != "110" && height != "46" && bitspercomponent != "1")
{
ImageRenderInfo imgRI = ImageRenderInfo.CreateForXObject(new GraphicsState(), (PRIndirectReference)obj, tg);
PdfImageObject image = imgRI.GetImage();
Image dotnetImg = image.GetDrawingImage();
if(dotnetImg != null)
{
// process image and update database
可以说这段代码不适用于 iText7。我试图移植其中的一些,但我似乎没有得到图像......所以我显然做了一些不正确的事情,而且我自己对 iText7 函数的无知,这些函数似乎不提供与旧库的向下兼容性。
有人能给我指点 iText7 的教程吗?该教程涉及提取 PDF 文件中存储的图像?我找到了有关如何将 PDF 提取为图像(不是我想要的)、如何将图像存储在 PDF 文档中(与我想要的相反)的教程,以及类似问题的答案基于不再起作用的旧库。
谢谢,
文号
这是一个 Java 实现IEventListener
您可以使用它来访问特定页面的所有图像:
public class MyImageRenderListener implements IEventListener {
protected String path;
protected String extension;
public MyImageRenderListener(String path) {
this.path = path;
}
public void eventOccurred(IEventData data, EventType type) {
switch (type) {
case RENDER_IMAGE:
try {
String filename;
FileOutputStream os;
ImageRenderInfo renderInfo = (ImageRenderInfo) data;
PdfImageXObject image = renderInfo.getImage();
if (image == null) {
return;
}
// You can access various value from dictionary here:
PdfString decodeParamsPdfStr = image.getPdfObject().getAsString(PdfName.DecodeParms);
String decodeParams = decodeParamsPdfStr != null ? decodeParamsPdfStr.toUnicodeString() : null;
byte[] imageByte = image.getImageBytes(true);
extension = image.identifyImageFileExtension();
// You can use raw image bytes directly, or write image to disk
filename = String.format(path, image.getPdfObject().getIndirectReference().getObjNumber(), extension);
os = new FileOutputStream(filename);
os.write(imageByte);
os.flush();
os.close();
} catch (com.itextpdf.io.IOException | IOException e) {
System.out.println(e.getMessage());
}
break;
default:
break;
}
}
public Set<EventType> getSupportedEvents() {
return null;
}
}
我已经评论了您可能感兴趣的一些部分。
以下是实际为所有页面或任何感兴趣的页面调用处理器的代码:
PdfDocument pdfDoc = new PdfDocument(new PdfReader(src));
IEventListener listener = new MyImageRenderListener(outPath);
PdfCanvasProcessor parser = new PdfCanvasProcessor(listener);
for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
parser.processPageContent(pdfDoc.getPage(i));
}
pdfDoc.close();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)