번호는 압축 된 콘텐츠 스트림의 일부이기 때문에 일반 텍스트로 사용할 수 없습니다.
"Hello World!" 예. 당신이 진 부분을 압축 해제하면
2 0 obj
<</Length 65/Filter/FlateDecode>>stream
xœ+är
á26S°00SIá2PÐ5´ 1ôÝBÒ¸4<RsròÂó‹rR5C²€[email protected]*\C¸¹ Çq°
endstream
endobj
, 당신이 찾을 수 있습니다 :
q
BT
36 806 Td
0 -18 Td
/F1 12 Tf
(Hello World!) Tj
0 0 Td
ET
Q
그러나, 다음 구문도 올바른 것 : 텍스트 수를 나타냅니다 컨텐츠 스트림은 다음과 같습니다
BT
/F1 12 Tf
88.66 806 Td
(ld!) Tj
-22 0 Td
(Wor) Tj
-15.33 0 Td
(llo) Tj
-15.33 0 Td
(He) Tj
ET
이 구문은 읽기가 훨씬 어렵지만 텍스트 행렬의 변경 사항을 기반으로 모든 수학을 수행하고 다른 텍스트 조각을 재구성하면 출력은 이전에 가지고 있던 구문의 출력과 동일합니다.
PDF가 압축되지 않은 구문으로 쉽게 인식 될 수 있음을 의미하는 간단한 방법으로 PDF를 만들면 페이지의 콘텐츠 스트림을 가져 와서 압축을 풀고 변경하고 압축 한 다음 PDF로 돌아갑니다.
이렇게하면 찾고있는 문자열이 외부 콘텐츠 스트림이 아닌 페이지의 콘텐츠 스트림에 있다고 가정합니다. 즉, 양식 XObject입니다. 모든 가정이 충족되면
,이 같은 iText를 사용할 수 :
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
int total = reader.getNumberOfPages() + 1;
for (int i = 1; i < total; i++) {
byte[] content = reader.getPageContent(i);
byte[] alteredBytes = doSomethingWith(content);
reader.setPageContent(i, alteredBytes);
}
stamper.close();
reader.close();
당신은 doSomethingWith()
방법을 구현해야 당신이 필요로 교체 이진 검색 &을 수행하도록.
중요 : 짧은 & 더러운 방법을 물었고, 이것은 매우 빠른 & 더러운 방법입니다. 내 직원 중 한 명이이 코드를 제출하는 것을 보게되면이 코드를 사용하는 데 괜찮은 인수를 제공 할 수 없다면 그 사람을 그 자리에서 해고 할 것입니다. 이 코드는 많은 PDF에서 실패하지만 매우 구체적인 사용 사례에서 필요한 것일 수 있습니다.
당신은 또한 읽을 수 있습니다 iText or iTextSharp rudimentary text edit
하는 방법 빌드 번호를 검색 할 수 있어야? 그것은 정상적인 PDF 뷰어에서 볼 수 있어야합니까? 아니면 숨겨진 장소에 포함시켜야합니까? – mkl
바닥 글이나 부록 같은 텍스트에 표시되어야합니다. –
그럴 경우 @ Bruno의 답은 가장 빠르고 더러운 해결책이 무엇인지를 보여줍니다. – mkl