불행히도 PDFBox는 적어도 내가 볼 수있는 한 임의의 XObjects (유형 3 글꼴 char procs와 같은)의 내용을 렌더링하는 클래스를 제공하지 않습니다.
그러나 완전한 PDF 페이지를 렌더링하기위한 클래스를 제공합니다. 따라서, 주어진 타입 3 폰트 글리프를 렌더링하기 위해, 단순히 그 글리프만을 포함하는 페이지를 생성하고이 임시 페이지를 렌더링 할 수있다! 예를 들어, 타입 3 폰트가 PDDocument document
의 첫 페이지에 정의 된 이름 F1
을 갖고, 가정
는 모든 문자 발동은 다음과 같이 표현 될 수있다 :
PDPage page = document.getPage(0);
PDResources pageResources = page.getResources();
COSName f1Name = COSName.getPDFName("F1");
PDType3Font fontF1 = (PDType3Font) pageResources.getFont(f1Name);
Map<String, Integer> f1NameToCode = fontF1.getEncoding().getNameToCodeMap();
COSDictionary charProcsDictionary = fontF1.getCharProcs();
for (COSName key : charProcsDictionary.keySet())
{
COSStream stream = (COSStream) charProcsDictionary.getDictionaryObject(key);
PDType3CharProc charProc = new PDType3CharProc(fontF1, stream);
PDRectangle bbox = charProc.getGlyphBBox();
if (bbox == null)
bbox = charProc.getBBox();
Integer code = f1NameToCode.get(key.getName());
if (code != null)
{
PDDocument charDocument = new PDDocument();
PDPage charPage = new PDPage(bbox);
charDocument.addPage(charPage);
charPage.setResources(pageResources);
PDPageContentStream charContentStream = new PDPageContentStream(charDocument, charPage);
charContentStream.beginText();
charContentStream.setFont(fontF1, bbox.getHeight());
charContentStream.getOutput().write(String.format("<%2X> Tj\n", code).getBytes());
charContentStream.endText();
charContentStream.close();
File result = new File(RESULT_FOLDER, String.format("4700198773-%s-%s.png", key.getName(), code));
PDFRenderer renderer = new PDFRenderer(charDocument);
BufferedImage image = renderer.renderImageWithDPI(0, 96);
ImageIO.write(image, "PNG", result);
charDocument.close();
}
}
(RenderType3Character.java 시험 방법 testRender4700198773
)
영업의 코드에서 textPosition
변수를 고려, 텍스트 추출에서 그는 매우 가능성이 시도이 이온 사용 사례. 따라서 그는 위와 같이 비트 맵을 미리 생성하고 이름을 사용하여 해당 비트 맵을 찾거나 자신의 유스 케이스에서 사용 가능한 정보와 일치하도록 코드를 조정해야합니다 (예 : 원래 페이지가 준비되어 있지 않을 수도 있고 글꼴 이 경우 그는 원래 페이지의 자원을 복사 할 수 없지만 대신 새 자원 객체를 만들고 글꼴 객체를 추가 할 수 있습니다.
불행히도 OP는 샘플 PDF를 제공하지 않았습니다. 따라서 다른 스택 오버플로 질문 중 하나 인 4700198773.pdf을 내 테스트 용으로 extract text with custom font result non readble에서 사용했습니다. 분명히 OP 자신의 파일에 문제가 남아있을 수 있습니다.
출처
2017-02-06 12:22:51
mkl
내 대답이 도움이됩니까? 그렇지 않은 경우 유형 3 글꼴에 대한 샘플 PDF 담당자를 공유하십시오. 이미 내 답변에서 언급 한 바와 같이 주석에 @Tilman과 논의한 바와 같이 다르게 처리 할 유형 3 글꼴 변형이있을 수 있습니다 ... – mkl