从PDF签章文件中提取印章以及印章图片

目录

1.SM2签章

2.RSA签章


1.SM2签章

国密签章是有签章结构的,遵循一定的标准,可以从签章结构中解析出印章,然后再从印章中保存图片

代码如下:

  public void getSealFromPDFStamp() throws Exception {
        String pdfStampPath = "F:/Netseal_Work/签章项目和主线总结/离职证明/适配子公司UKEY/上海信旋/安印工具签章.pdf";

        byte[] pdfData = FileUtil.getFile(pdfStampPath);

        PdfReader reader = null;
        try {
            reader = new PdfReader(pdfData);
            AcroFields af = reader.getAcroFields();

            ArrayList<String> names = af.getSignatureNames();
            // 获取每一个签名域的 Contents
            for (String name : names) {
                PdfDictionary dictionary = af.getSignatureDictionary(name);
                byte[] bytes = dictionary.getAsString(PdfName.CONTENTS).getBytes();
                String hexContents = HexUtil.byte2Hex(bytes);
                while (hexContents.endsWith("00"))
                    hexContents = hexContents.substring(0, hexContents.length() - 2);

                StampData sd = new StampData(bytes);
                byte[] stampData = sd.getEseal().getEncoded();

                FileUtil.storeFile("E:/1.asn1",stampData);
            }


        } catch (Exception e) {
            throw e;
        } finally {
            try {
                if (reader != null)
                    reader.close();
            } catch (Exception e) {
            }
        }
    }

解析保存下来的文件用asn1工具打开

 将图片数据保存成文件,就可以把印章图片提取出来了

2.RSA签章

RSA签章没有签章结构,笼统意义来说就是加盖图片进行签名,所以不能再用上面的方式进行提取印章图片,使用PDF源码进行提取

	public PdfImageObject extractImage(String signatureName) throws Exception {
		MyImageRenderListener listener = new MyImageRenderListener();

		PdfDictionary sigFieldDic = reader.getAcroFields().getFieldItem(signatureName).getMerged(0);
		PdfDictionary appearancesDic = sigFieldDic.getAsDict(PdfName.AP);
		PdfStream normalAppearance = appearancesDic.getAsStream(PdfName.N);

		PdfDictionary resourcesDic = normalAppearance.getAsDict(PdfName.RESOURCES);

		PdfContentStreamProcessor processor = new PdfContentStreamProcessor(listener);
		processor.processContent(ContentByteUtils.getContentBytesFromContentObject(normalAppearance), resourcesDic);

		return listener.image;
	}

	public static void main(String[] args) throws Exception {
		byte[] pdfData = FileUtil.getFile("F:/Netseal_Work/签章项目和主线总结/离职证明/适配子公司UKEY/上海信旋/安印工具签章.pdf");
		PdfReader reader = new PdfReader(pdfData);
		AcroFields acroFields = reader.getAcroFields();
		List<String> names = acroFields.getSignatureNames();

		ExtractPhoto ep = new ExtractPhoto(reader);
		for (String name : names) {
			PdfImageObject image = ep.extractImage(name);
			FileUtil.storeFile("f:/temp/pdf/" + name + ".png", image.getImageAsBytes());
		}

		reader.close();
	}
}

注意:解析出来的图片带背景,一般都是白色背景,然后再进行一次去背景的操作

	public static byte[] cleanBGColor(byte[] bs) throws Exception {
		ByteArrayInputStream bais = new ByteArrayInputStream(bs);
		BufferedImage bi = ImageIO.read(bais);
		BufferedImage tmp = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
		for (int i = 0, width = bi.getWidth(); i < width; i++) {
			for (int j = 0, height = bi.getHeight(); j < height; j++) {
				int rgb = bi.getRGB(i, j);
				// if (((rgb & 0xff000000) >> 24 & 0xff) > 0x80)
				// tmp.setRGB(i, j, rgb);
				// else
				// tmp.setRGB(i, j, Color.WHITE.getRGB());

				byte[] d = HexUtil.int2Byte(rgb);
				int a = d[0] & 0xff;
				int r = d[1] & 0xff;
				int g = d[2] & 0xff;
				int b = d[3] & 0xff;
				if (r == 255 && g == 255 && b == 255) {
					d[0] = 0;
					rgb = HexUtil.byte2Int(d);
				}

				tmp.setRGB(i, j, rgb);
			}
		}

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ImageIO.write(tmp, "png", baos);

		return baos.toByteArray();
	}

以上步骤就可以获取RSA签章文件的印章图片了

<think>好的,我现在需要解决用户关于如何去除PDF文件中电子印章的问题。首先,用户提到了两种方法:使用软件工具或编写代码。我需要结合提供的引用内容,尤其是引用[3]提到的PyMuPDF库来处理PDF图片,可能涉及到提取和删除图片中的印章。 首先,用户可能希望手动操作,所以推荐Adobe Acrobat DC这类专业工具,因为它支持编辑PDF内容,比如删除图片或水印。引用[1]和[2]提到了Adobe Acrobat用于创建表单和处理电子签章,所以删除印章应该可行。但需要注意,直接编辑可能受权限限制,比如文档加密的话需要先解锁。 其次,对于编程方法,引用[3]提到使用PyMuPDF提取和删除图片。电子印章可能是图片或矢量图形,需要遍历PDF中的元素,识别并移除相关对象。这里可能需要判断每个元素的类型,如果是图片,检查其位置或属性是否匹配印章。但识别特定印章可能需要更复杂的图像识别技术,这可能超出简单删除的范围,用户可能需要额外处理。 另外,用户可能遇到印章作为水印的情况,这时候可能需要处理水印层。PyMuPDF可以访问页面的内容,但水印可能属于不同的层或XObject,需要具体分析。此外,替换或覆盖印章也是一种方法,比如用白色矩形覆盖,但可能影响文档的原始布局。 还需要考虑PDF的结构复杂性,比如多层、加密或动态内容。这时候工具如iText或PDFBox可能更强大,但用户需要一定的编程知识。同时,用户需要注意法律问题,未经授权修改PDF可能违法,必须确保有权进行操作。 总结步骤:首先尝试使用Adobe Acrobat手动编辑,若不行则用PyMuPDF编程处理,或者使用其他库如PyPDF2。需要详细说明每种方法的操作流程,并提醒注意事项。</think>### 如何去除PDF文件中的电子印章? #### 方法1:使用Adobe Acrobat DC(手动操作) 1. **解锁PDF权限** 如果PDF文件受密码保护或限制编辑,需先使用“文档属性→安全→无安全性”解除限制[^1]。 2. **删除印章图片** - 打开PDF文件,点击右侧“编辑PDF”工具。 - 选中印章(可能为图片或矢量图形),按`Delete`键删除。 - 若印章是水印,选择“编辑水印→删除”[^2]。 3. **覆盖印章(替代方案)** - 使用“添加矩形”工具,用白色填充覆盖印章区域。 - 调整图层顺序确保覆盖效果。 #### 方法2:使用Python代码(PyMuPDF库) ```python import fitz # PyMuPDF def remove_stamp(pdf_path, output_path): doc = fitz.open(pdf_path) for page in doc: # 遍历页面中的所有图片和绘图对象 image_list = page.get_images() for img in image_list: # 根据图片位置或属性判断是否为印章(需自定义条件) if is_stamp(img): # 需用户自行实现判断逻辑 page.delete_image(img) # 删除矢量图形(如线条、矩形) for draw in page.get_drawings(): if is_stamp_graphic(draw): # 自定义判断逻辑 page.delete_draw(draw) doc.save(output_path) ``` **注意事项**: - 需通过坐标、颜色或内容特征识别印章(例如红色矩形或特定文字)。 - 复杂印章可能由多图层叠加,需逐层处理[^3]。 #### 方法3:使用PyPDF2(处理特定元素) ```python from PyPDF2 import PdfReader, PdfWriter def remove_stamp_pypdf2(input_path, output_path): reader = PdfReader(input_path) writer = PdfWriter() for page in reader.pages: # 遍历页面内容流,过滤包含印章的指令(如绘制命令) content = page.get_contents() filtered_content = filter_stamp_commands(content) # 需自定义过滤规则 page[PageAttributes.CONTENTS] = filtered_content writer.add_page(page) with open(output_path, "wb") as f: writer.write(f) ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值