【发布时间】:2018-07-11 12:42:01
【问题描述】:
我创建了这个方法来签署一个 pdf 文件:
public File sign7(File pdfOriginal,
String diretorioSalvar,
String nomeArquivo,
String motivo, String local,
LocalDateTime data,
String textoAssinatura,
boolean visible,
PDFService.DisposicaoPagina dispPagina,
File arquivoOriginal
) throws IOException, DocumentException, GeneralSecurityException {
log.debug("comecou assinar");
File diretorioSaida = new File(diretorioSalvar);
diretorioSaida.mkdirs();
File pdfAssinado = new File(diretorioSalvar+File.separator+nomeArquivo);
String keystore_password = KEYSTORE_PASSWORD;
String key_password = KEYSTORE_PASSWORD;
keystore.load(KEYSTORE.getInputStream(), keystore_password.toCharArray());
PrivateKey key = (PrivateKey) keystore.getKey(alias, key_password.toCharArray());
Certificate[] chain = keystore.getCertificateChain(alias);
log.debug("keystore provider : {}", keystore.getProvider().getName());
log.debug("Assinando com alias :{}", alias);
log.debug("chain size: " + chain.length);
PdfReader reader = new PdfReader(new RandomAccessBufferedFileInputStream(pdfOriginal));
PdfWriter writer = new PdfWriter(pdfAssinado);
PdfDocument doc = new PdfDocument(reader,writer);
FileOutputStream os = new FileOutputStream(pdfAssinado);
PdfSigner signer = new PdfSigner(doc.getReader(),os,true);
signer.setCertificationLevel(PdfSigner.NOT_CERTIFIED);
//TEXTO DO CARIMBO
String texto;
ImageData imgCarimbo;
PdfPage moldPage = doc.getLastPage();
PageSize pSize = new PageSize(moldPage.getPageSize());
PdfCanvas cPage = new PdfCanvas(moldPage);
PdfFont font = null;
try {
font = PdfFontFactory.createFont(FONT.getFile().getPath(), PdfEncodings.WINANSI, true);
} catch (IOException e) {
e.printStackTrace();
}
cPage.setFillColor(Color.BLACK);
Rectangle rect = new Rectangle(
(float) (pSize.getWidth()*0.653), //0.725 Y
(float) (pSize.getHeight()*0.9), //0.90 X
(float) (pSize.getWidth()*0.32), //0.25 Largura
(float) (pSize.getHeight()*0.068)); //0.07 Altura
cPage.fillStroke();
PdfFormXObject xObject = new PdfFormXObject(rect);
Image rectImg = new Image(xObject);
ImageData imgLogoCarimboOval = ImageDataFactory.create(LOGO_CARIMBO_DIGITAL.getFile().getPath());
ImageData imgLogoCarimboBg = ImageDataFactory.create(LOGO_CARIMBO_BG.getFile().getPath());
int paginaAparencia = (dispPagina == PDFService.DisposicaoPagina.ULTIMA_PAGINA?doc.getNumberOfPages():1);
String arqOriginalHash = "";
if (arquivoOriginal != null) {
arqOriginalHash = pdfService.gerarHash(arquivoOriginal);
}
PdfSignatureAppearance appearance = signer
.getSignatureAppearance()
.setReason(motivo + " - Hash: " + arqOriginalHash)
.setLocation(local)
.setReuseAppearance(false)
.setImage(imgLogoCarimboBg)
.setSignatureGraphic(imgLogoCarimboOval)
.setImageScale(100)
.setRenderingMode(RenderingMode.GRAPHIC_AND_DESCRIPTION)
.setPageRect(rect)
.setLayer2Font(font)
.setLayer2FontSize(6)
.setLayer2Text(textoAssinatura)
.setPageNumber(paginaAparencia);
signer.setFieldName(signer.getNewSigFieldName());
// Creating the signature
IExternalSignature pks = new PrivateKeySignature(key, DigestAlgorithms.SHA1, "BC");
IExternalDigest digest = new ProviderDigest("BC");
Collection<ICrlClient> crlList=null; IOcspClient ocspClient = null; ITSAClient tsaClient=null;
writer.close();
signer.signDetached(digest, pks, chain, crlList, ocspClient, tsaClient, 0, PdfSigner.CryptoStandard.CMS);
reader.close();
os.close();
log.debug("acabou assinar");
return pdfAssinado;
}
(此方法在我的最后一页创建一个图章并签署 pdf)但是当我尝试签署一个 500MB 的文件时,我得到了一个 java 堆空间:
signer.signDetached(digest, pks, chain, crlList, ocspClient, tsaClient, 0, PdfSigner.CryptoStandard.CMS);
如果我尝试签署较小的文件有效(我只尝试了一个,不知道我是否同时尝试多个我会得到相同的错误)
我已经尝试从我的应用程序中更改内存,但没有成功。
【问题讨论】:
-
“我已经尝试从我的应用程序中更改内存,但没有成功。” - 你为该进程分配了多少内存?
标签: pdf itext digital-signature itext7