이전에 읽은 문서의 요소 (https://www.dropbox.com/s/ttxiv0dq3abh5kj/Test.pdf?dl=0)에서 pdf 문서를 작성하는 데 문제가 있습니다. 모든 것은 잘 작동합니다. 이전에 out.setFont(textState.getFont(), textState.getFontSize())
(INFORMATION LOG 참조)으로 글꼴을 설정 한 PDPageContentStream에서 showText
을 호출하고 글꼴이 ComicSansMS 또는 ArialBlack 인 경우는 예외입니다. textState
은 이전에 읽은 문서의 상태 (에서 복제본)입니다. Helvetica 또는 Times-Roman으로 텍스트를 작성하는 것이 좋습니다.pdfbox : ...이 글꼴의 인코딩에서는 사용할 수 없습니다.
INFORMATION: set font PDTrueTypeFont RXNQOL+ComicSansMS,Bold/18.0 embedded
SEVERE: error writing <w>U+0077 is not available in this font's encoding: built-in (TTF)
문제는 글꼴 이름에 하이픈 또는 공백이 누락되어서 발생하지만 문제를 해결할 방법이 없다고 생각됩니다.
여기에 전체 코드는
import java.awt.Point;
import java.awt.geom.Point2D;
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.graphics.image.PDImage;
import org.apache.pdfbox.pdmodel.graphics.state.PDTextState;
import org.apache.pdfbox.util.Matrix;
import org.apache.pdfbox.util.Vector;
public class Test extends PDFGraphicsStreamEngine {
public static void main(String[] args) throws IOException {
test();
}
public static void test() throws IOException {
PDDocument document = PDDocument.load(new File("Test.pdf"));
PDPage pageIn = document.getPage(0);
PDDocument saveDoc = new PDDocument();
PDPage savePage = new PDPage(pageIn.getMediaBox());
saveDoc.addPage(savePage);
try (PDPageContentStream out = new PDPageContentStream(saveDoc, savePage)) {
Test test = new Test(pageIn, out);
test.processPage(pageIn);
}
}
private final PDPageContentStream out;
public Test(PDPage pageIn, PDPageContentStream out) {
super(pageIn);
this.out = out;
}
@Override
public void appendRectangle(Point2D p0, Point2D p1, Point2D p2, Point2D p3) throws IOException {
}
@Override
public void clip(int windingRule) throws IOException {
}
@Override
public void closePath() throws IOException {
}
@Override
public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3) throws IOException {
}
@Override
public void drawImage(PDImage pdImage) throws IOException {
}
@Override
public void endPath() throws IOException {
}
@Override
public void fillAndStrokePath(int windingRule) throws IOException {
}
@Override
public void fillPath(int windingRule) throws IOException {
}
@Override
public Point2D getCurrentPoint() {
return new Point(0, 0);
}
@Override
public void lineTo(float x, float y) throws IOException {
}
@Override
public void moveTo(float x, float y) throws IOException {
}
@Override
public void shadingFill(COSName shadingName) throws IOException {
}
@Override
protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, Vector displacement) throws IOException {
super.showGlyph(textRenderingMatrix, font, code, unicode, displacement);
PDTextState textState = getGraphicsState().getTextState();
out.beginText();
out.setTextMatrix(getTextMatrix());
out.setFont(textState.getFont(), textState.getFontSize());
out.showText(unicode);
out.endText();
}
@Override
public void strokePath() throws IOException {
}
}
어떤 제안입니까?
감사 겐
문제를 재현 할 수 있도록 중추적 인 코드를 표시하고 샘플 출처의 PDF에 링크하십시오. – mkl