[Java] iText XMLWorker에서 Helvetica를 제거하는 방법은 무엇입니까?


Answers

Question

우리는 iText를 사용하여 대부분의 경우에 잘 작동하는 Java 코드에서 PDF 파일을 생성합니다. 며칠 전에 모든 글꼴을 포함해야하는 일반 PDF 파일 대신 PDF / A를 생성하기 시작했습니다. iText Document 는 주로 사용자 정의 PdfPTable 및 글꼴을 직접 제어하는 ​​기타 클래스의 빌드입니다. 사용 된 모든 글꼴은 다음 코드를 통해로드 된 TTF 파일에서 생성됩니다.

    private BaseFont load(String path) {
        try {
            URL fontResource = PrintSettings.class.getResource(path);
            if (fontResource == null) {
                return null;
            }
            String fontPath = fontResource.toExternalForm();
            BaseFont baseFont = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            baseFont.setSubset(true);
            return baseFont;
        }
        catch (DocumentException ex) {
            Logger.getLogger(PrintSettings.class).warn("...");
        }
        catch (IOException ex) {
            Logger.getLogger(PrintSettings.class).warn("...");
        }
        return FontFactory.getFont(PrintSettings.FONT, "UTF-8", true, 8f, Font.NORMAL, PrintSettings.COLOR_TEXT).getBaseFont();
    }

이제는 HTML 코드에서 생성되는 PDF에서 하나의 특정 내용 유형을 사용합니다. XMLWorker 를 사용하여 해당 부분을 처리합니다. 글꼴을 포함하지 않는 한 제대로 작동했습니다. 그러나 PDF / A를 사용 하면 모든 글꼴을 포함 해야 하며 이제는 알 수없는 Helvetica 사용 소스로 인해 어려움을 겪고 있습니다.

우리는이 같은 자체 FontProvider 클래스를 사용하여이 문제를 해결하려고했습니다.

public class PrintFontProvider extends FontFactoryImp {

    @Override
    public Font getFont(String fontName, String encoding, boolean embedded, float size, int style, BaseColor color, boolean cached) {

        // LiberationSans – http://de.wikipedia.org/wiki/Liberation_(Schriftart) – http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web
        if (style == Font.NORMAL)     return new Font(this.load("fonts/Liberation/LiberationSans-Regular.ttf"),    size, Font.NORMAL, color);
        if (style == Font.BOLD)       return new Font(this.load("fonts/Liberation/LiberationSans-Bold.ttf"),       size, Font.NORMAL, color);
        if (style == Font.BOLDITALIC) return new Font(this.load("fonts/Liberation/LiberationSans-BoldItalic.ttf"), size, Font.NORMAL, color);
        if (style == Font.ITALIC)     return new Font(this.load("fonts/Liberation/LiberationSans-Italic.ttf"),     size, Font.NORMAL, color);
        return new Font(this.load("fonts/Liberation/LiberationSans-Regular.ttf"), size, style, color);
    }

    private BaseFont load(String path) { ... }
}

다음 코드를 사용하여 XMLWorker 와 연결됩니다.

HtmlPipelineContext html = new HtmlPipelineContext(null);
html.setTagFactory(Tags.getHtmlTagProcessorFactory());
CSSResolver css = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);

// We need to control the FontProdiver!
html.setCssAppliers(new CssAppliersImpl(new PrintFontProvider()));

Pipeline<?> pipeline = new CssResolverPipeline(css, new HtmlPipeline(html, new PdfWriterPipeline(this.document, writer)));
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser p = new XMLParser(worker);
p.parse(new ByteArrayInputStream(StringUtils.iTextHTML(string).getBytes()));

대부분의 간단한 HTML 요소는 이런 방식으로 작동하지만 FontProvider를 무시하고 PDF / A에 포함되지 않는 Helvetica 를 계속 사용하는 것 (글꼴이 없습니다)이 있습니다. 예를 들어 <ol><li>...</li></ol> 을 활용하십시오.

Caused by: com.itextpdf.text.pdf.PdfXConformanceException: All the fonts must be embedded. This one isn't: Helvetica
at com.itextpdf.text.pdf.internal.PdfXConformanceImp.checkPDFXConformance(PdfXConformanceImp.java:225)
at com.itextpdf.text.pdf.PdfWriter.addSimple(PdfWriter.java:2192)
at com.itextpdf.text.pdf.PdfContentByte.setFontAndSize(PdfContentByte.java:1444)
at com.itextpdf.text.pdf.PdfDocument.writeLineToContent(PdfDocument.java:1463)
at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:968)
at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:841)
at com.itextpdf.text.pdf.ColumnText.showTextAligned(ColumnText.java:1189)
at com.itextpdf.text.pdf.ColumnText.showTextAligned(ColumnText.java:1208)
at com.itextpdf.text.pdf.PdfDocument.flushLines(PdfDocument.java:1193)
at com.itextpdf.text.pdf.PdfDocument.newPage(PdfDocument.java:830)
at com.itextpdf.text.Document.newPage(Document.java:367)

나는 지금 Helvetica를 제거하는 아이디어를 다 써 버렸습니다 ... 지금 8 시간 이상 이것을 해결하려고 노력하고 있습니다 ... 더 이상 아이디어가 없습니까?