Search in sources :

Example 1 with TrueTypeFont

use of org.apache.fontbox.ttf.TrueTypeFont in project tika by apache.

the class TrueTypeParser method parse.

public void parse(InputStream stream, ContentHandler handler, Metadata metadata, ParseContext context) throws IOException, SAXException, TikaException {
    TikaInputStream tis = TikaInputStream.cast(stream);
    // Ask FontBox to parse the file for us
    TrueTypeFont font = null;
    try {
        TTFParser parser = new TTFParser();
        if (tis != null && tis.hasFile()) {
            font = parser.parse(tis.getFile());
        } else {
            font = parser.parse(stream);
        }
        // Report the details of the font
        metadata.set(Metadata.CONTENT_TYPE, TYPE.toString());
        metadata.set(TikaCoreProperties.CREATED, font.getHeader().getCreated());
        metadata.set(TikaCoreProperties.MODIFIED, font.getHeader().getModified());
        metadata.set(AdobeFontMetricParser.MET_DOC_VERSION, Float.toString(font.getHeader().getVersion()));
        // Pull out the naming info
        NamingTable fontNaming = font.getNaming();
        for (NameRecord nr : fontNaming.getNameRecords()) {
            if (nr.getNameId() == NameRecord.NAME_FONT_FAMILY_NAME) {
                metadata.set(AdobeFontMetricParser.MET_FONT_FAMILY_NAME, nr.getString());
            }
            if (nr.getNameId() == NameRecord.NAME_FONT_SUB_FAMILY_NAME) {
                metadata.set(AdobeFontMetricParser.MET_FONT_SUB_FAMILY_NAME, nr.getString());
            }
            if (nr.getNameId() == NameRecord.NAME_FULL_FONT_NAME) {
                metadata.set(AdobeFontMetricParser.MET_FONT_NAME, nr.getString());
                metadata.set(TikaCoreProperties.TITLE, nr.getString());
            }
            if (nr.getNameId() == NameRecord.NAME_POSTSCRIPT_NAME) {
                metadata.set(AdobeFontMetricParser.MET_PS_NAME, nr.getString());
            }
            if (nr.getNameId() == NameRecord.NAME_COPYRIGHT) {
                metadata.set("Copyright", nr.getString());
            }
            if (nr.getNameId() == NameRecord.NAME_TRADEMARK) {
                metadata.set("Trademark", nr.getString());
            }
        }
    } finally {
        if (font != null) {
            font.close();
        }
    }
    // For now, we only output metadata, no textual contents
    XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
    xhtml.startDocument();
    xhtml.endDocument();
}
Also used : TrueTypeFont(org.apache.fontbox.ttf.TrueTypeFont) NameRecord(org.apache.fontbox.ttf.NameRecord) NamingTable(org.apache.fontbox.ttf.NamingTable) TikaInputStream(org.apache.tika.io.TikaInputStream) XHTMLContentHandler(org.apache.tika.sax.XHTMLContentHandler) TTFParser(org.apache.fontbox.ttf.TTFParser)

Example 2 with TrueTypeFont

use of org.apache.fontbox.ttf.TrueTypeFont in project pdfbox by apache.

the class PDCIDFontType2 method findFontOrSubstitute.

private TrueTypeFont findFontOrSubstitute() throws IOException {
    TrueTypeFont ttfFont;
    CIDFontMapping mapping = FontMappers.instance().getCIDFont(getBaseFont(), getFontDescriptor(), getCIDSystemInfo());
    if (mapping.isCIDFont()) {
        ttfFont = mapping.getFont();
    } else {
        ttfFont = (TrueTypeFont) mapping.getTrueTypeFont();
    }
    if (mapping.isFallback()) {
        LOG.warn("Using fallback font " + ttfFont.getName() + " for CID-keyed TrueType font " + getBaseFont());
    }
    return ttfFont;
}
Also used : TrueTypeFont(org.apache.fontbox.ttf.TrueTypeFont)

Example 3 with TrueTypeFont

use of org.apache.fontbox.ttf.TrueTypeFont in project pdfbox by apache.

the class LegacyPDFStreamEngine method showGlyph.

/**
 * This method was originally written by Ben Litchfield for PDFStreamEngine.
 */
@Override
protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, Vector displacement) throws IOException {
    // 
    // legacy calculations which were previously in PDFStreamEngine
    // 
    // DO NOT USE THIS CODE UNLESS YOU ARE WORKING WITH PDFTextStripper.
    // THIS CODE IS DELIBERATELY INCORRECT
    // 
    PDGraphicsState state = getGraphicsState();
    Matrix ctm = state.getCurrentTransformationMatrix();
    float fontSize = state.getTextState().getFontSize();
    float horizontalScaling = state.getTextState().getHorizontalScaling() / 100f;
    Matrix textMatrix = getTextMatrix();
    BoundingBox bbox = font.getBoundingBox();
    if (bbox.getLowerLeftY() < Short.MIN_VALUE) {
        // PDFBOX-2158 and PDFBOX-3130
        // files by Salmat eSolutions / ClibPDF Library
        bbox.setLowerLeftY(-(bbox.getLowerLeftY() + 65536));
    }
    // 1/2 the bbox is used as the height todo: why?
    float glyphHeight = bbox.getHeight() / 2;
    // sometimes the bbox has very high values, but CapHeight is OK
    PDFontDescriptor fontDescriptor = font.getFontDescriptor();
    if (fontDescriptor != null) {
        float capHeight = fontDescriptor.getCapHeight();
        if (Float.compare(capHeight, 0) != 0 && (capHeight < glyphHeight || Float.compare(glyphHeight, 0) == 0)) {
            glyphHeight = capHeight;
        }
    }
    // transformPoint from glyph space -> text space
    float height;
    if (font instanceof PDType3Font) {
        height = font.getFontMatrix().transformPoint(0, glyphHeight).y;
    } else {
        height = glyphHeight / 1000;
    }
    float displacementX = displacement.getX();
    // calculate our own
    if (font.isVertical()) {
        displacementX = font.getWidth(code) / 1000;
        // there may be an additional scaling factor for true type fonts
        TrueTypeFont ttf = null;
        if (font instanceof PDTrueTypeFont) {
            ttf = ((PDTrueTypeFont) font).getTrueTypeFont();
        } else if (font instanceof PDType0Font) {
            PDCIDFont cidFont = ((PDType0Font) font).getDescendantFont();
            if (cidFont instanceof PDCIDFontType2) {
                ttf = ((PDCIDFontType2) cidFont).getTrueTypeFont();
            }
        }
        if (ttf != null && ttf.getUnitsPerEm() != 1000) {
            displacementX *= 1000f / ttf.getUnitsPerEm();
        }
    }
    // 
    // legacy calculations which were previously in PDFStreamEngine
    // 
    // DO NOT USE THIS CODE UNLESS YOU ARE WORKING WITH PDFTextStripper.
    // THIS CODE IS DELIBERATELY INCORRECT
    // 
    // (modified) combined displacement, this is calculated *without* taking the character
    // spacing and word spacing into account, due to legacy code in TextStripper
    float tx = displacementX * fontSize * horizontalScaling;
    float ty = displacement.getY() * fontSize;
    // (modified) combined displacement matrix
    Matrix td = Matrix.getTranslateInstance(tx, ty);
    // (modified) text rendering matrix
    // text space -> device space
    Matrix nextTextRenderingMatrix = td.multiply(textMatrix).multiply(ctm);
    float nextX = nextTextRenderingMatrix.getTranslateX();
    float nextY = nextTextRenderingMatrix.getTranslateY();
    // (modified) width and height calculations
    float dxDisplay = nextX - textRenderingMatrix.getTranslateX();
    float dyDisplay = height * textRenderingMatrix.getScalingFactorY();
    // 
    // start of the original method
    // 
    // Note on variable names. There are three different units being used in this code.
    // Character sizes are given in glyph units, text locations are initially given in text
    // units, and we want to save the data in display units. The variable names should end with
    // Text or Disp to represent if the values are in text or disp units (no glyph units are
    // saved).
    float glyphSpaceToTextSpaceFactor = 1 / 1000f;
    if (font instanceof PDType3Font) {
        glyphSpaceToTextSpaceFactor = font.getFontMatrix().getScaleX();
    }
    float spaceWidthText = 0;
    try {
        // to avoid crash as described in PDFBOX-614, see what the space displacement should be
        spaceWidthText = font.getSpaceWidth() * glyphSpaceToTextSpaceFactor;
    } catch (Exception exception) {
        LOG.warn(exception, exception);
    }
    if (Float.compare(spaceWidthText, 0) == 0) {
        spaceWidthText = font.getAverageFontWidth() * glyphSpaceToTextSpaceFactor;
        // the average space width appears to be higher than necessary so make it smaller
        spaceWidthText *= .80f;
    }
    if (Float.compare(spaceWidthText, 0) == 0) {
        // if could not find font, use a generic value
        spaceWidthText = 1.0f;
    }
    // the space width has to be transformed into display units
    float spaceWidthDisplay = spaceWidthText * textRenderingMatrix.getScalingFactorX();
    // use our additional glyph list for Unicode mapping
    unicode = font.toUnicode(code, glyphList);
    // this, which is why we leave it until this point in PDFTextStreamEngine.
    if (unicode == null) {
        if (font instanceof PDSimpleFont) {
            char c = (char) code;
            unicode = new String(new char[] { c });
        } else {
            // skips them. See the "allah2.pdf" TestTextStripper file.
            return;
        }
    }
    // adjust for cropbox if needed
    Matrix translatedTextRenderingMatrix;
    if (translateMatrix == null) {
        translatedTextRenderingMatrix = textRenderingMatrix;
    } else {
        translatedTextRenderingMatrix = Matrix.concatenate(translateMatrix, textRenderingMatrix);
        nextX -= pageSize.getLowerLeftX();
        nextY -= pageSize.getLowerLeftY();
    }
    processTextPosition(new TextPosition(pageRotation, pageSize.getWidth(), pageSize.getHeight(), translatedTextRenderingMatrix, nextX, nextY, Math.abs(dyDisplay), dxDisplay, Math.abs(spaceWidthDisplay), unicode, new int[] { code }, font, fontSize, (int) (fontSize * textMatrix.getScalingFactorX())));
}
Also used : PDTrueTypeFont(org.apache.pdfbox.pdmodel.font.PDTrueTypeFont) TrueTypeFont(org.apache.fontbox.ttf.TrueTypeFont) PDType0Font(org.apache.pdfbox.pdmodel.font.PDType0Font) PDFontDescriptor(org.apache.pdfbox.pdmodel.font.PDFontDescriptor) IOException(java.io.IOException) PDSimpleFont(org.apache.pdfbox.pdmodel.font.PDSimpleFont) SetMatrix(org.apache.pdfbox.contentstream.operator.state.SetMatrix) Matrix(org.apache.pdfbox.util.Matrix) PDType3Font(org.apache.pdfbox.pdmodel.font.PDType3Font) BoundingBox(org.apache.fontbox.util.BoundingBox) PDTrueTypeFont(org.apache.pdfbox.pdmodel.font.PDTrueTypeFont) PDCIDFontType2(org.apache.pdfbox.pdmodel.font.PDCIDFontType2) PDCIDFont(org.apache.pdfbox.pdmodel.font.PDCIDFont) PDGraphicsState(org.apache.pdfbox.pdmodel.graphics.state.PDGraphicsState)

Example 4 with TrueTypeFont

use of org.apache.fontbox.ttf.TrueTypeFont in project pdfbox by apache.

the class EmbeddedVerticalFonts method main.

public static void main(String[] args) throws IOException {
    PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page);
    // The actual font file
    // Download: https://ipafont.ipa.go.jp/old/ipafont/ipag00303.php
    // (free license: https://www.gnu.org/licenses/license-list.html#IPAFONT)
    File ipafont = new File("ipag.ttf");
    // You can also use a Windows 7 TrueType font collection, e.g. MingLiU:
    // TrueTypeFont ttf = new TrueTypeCollection(new File("C:/windows/fonts/mingliu.ttc")).getFontByName("MingLiU")
    // PDType0Font.loadVertical(document, ttf, true)
    // Load as horizontal
    PDType0Font hfont = PDType0Font.load(document, ipafont);
    // Load as vertical
    PDType0Font vfont = PDType0Font.loadVertical(document, ipafont);
    // Load as vertical, but disable vertical glyph substitution
    // (You will usually not want this because it doesn't look good!)
    TrueTypeFont ttf = new TTFParser().parse(ipafont);
    PDType0Font vfont2 = PDType0Font.loadVertical(document, ttf, true);
    ttf.disableGsubFeature("vrt2");
    ttf.disableGsubFeature("vert");
    try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
        contentStream.beginText();
        contentStream.setFont(hfont, 20);
        contentStream.setLeading(25);
        contentStream.newLineAtOffset(20, 300);
        contentStream.showText("Key:");
        contentStream.newLine();
        contentStream.showText("① Horizontal");
        contentStream.newLine();
        contentStream.showText("② Vertical with substitution");
        contentStream.newLine();
        contentStream.showText("③ Vertical without substitution");
        contentStream.endText();
        contentStream.beginText();
        contentStream.setFont(hfont, 20);
        contentStream.newLineAtOffset(20, 650);
        contentStream.showText("①「あーだこーだ」");
        contentStream.endText();
        contentStream.beginText();
        contentStream.setFont(vfont, 20);
        contentStream.newLineAtOffset(50, 600);
        contentStream.showText("②「あーだこーだ」");
        contentStream.endText();
        contentStream.beginText();
        contentStream.setFont(vfont2, 20);
        contentStream.newLineAtOffset(100, 600);
        contentStream.showText("③「あーだこーだ」");
        contentStream.endText();
    }
    // result file should look like the one attached to JIRA issue PDFBOX-4106
    document.save("vertical.pdf");
}
Also used : TrueTypeFont(org.apache.fontbox.ttf.TrueTypeFont) PDPage(org.apache.pdfbox.pdmodel.PDPage) PDType0Font(org.apache.pdfbox.pdmodel.font.PDType0Font) PDDocument(org.apache.pdfbox.pdmodel.PDDocument) PDPageContentStream(org.apache.pdfbox.pdmodel.PDPageContentStream) File(java.io.File) TTFParser(org.apache.fontbox.ttf.TTFParser)

Example 5 with TrueTypeFont

use of org.apache.fontbox.ttf.TrueTypeFont in project pdfbox by apache.

the class TestCMap method testPDFBox3997.

/**
 * PDFBOX-3997: test unicode that is above the basic multilingual plane, here: helicopter
 * symbol, or D83D DE81 in the Noto Emoji font.
 *
 * @throws IOException
 */
public void testPDFBox3997() throws IOException {
    try (TrueTypeFont ttf = new TTFParser().parse("target/pdfs/NotoEmoji-Regular.ttf")) {
        CmapLookup cmap = ttf.getUnicodeCmapLookup(false);
        assertEquals(886, cmap.getGlyphId(0x1F681));
    }
}
Also used : TrueTypeFont(org.apache.fontbox.ttf.TrueTypeFont) CmapLookup(org.apache.fontbox.ttf.CmapLookup) TTFParser(org.apache.fontbox.ttf.TTFParser)

Aggregations

TrueTypeFont (org.apache.fontbox.ttf.TrueTypeFont)13 TTFParser (org.apache.fontbox.ttf.TTFParser)7 IOException (java.io.IOException)3 OpenTypeFont (org.apache.fontbox.ttf.OpenTypeFont)3 PDType0Font (org.apache.pdfbox.pdmodel.font.PDType0Font)3 File (java.io.File)2 TrueTypeCollection (org.apache.fontbox.ttf.TrueTypeCollection)2 Test (org.junit.Test)2 FileInputStream (java.io.FileInputStream)1 InputStream (java.io.InputStream)1 URL (java.net.URL)1 FontBoxFont (org.apache.fontbox.FontBoxFont)1 CmapLookup (org.apache.fontbox.ttf.CmapLookup)1 CmapSubtable (org.apache.fontbox.ttf.CmapSubtable)1 CmapTable (org.apache.fontbox.ttf.CmapTable)1 NameRecord (org.apache.fontbox.ttf.NameRecord)1 NamingTable (org.apache.fontbox.ttf.NamingTable)1 OTFParser (org.apache.fontbox.ttf.OTFParser)1 PostScriptTable (org.apache.fontbox.ttf.PostScriptTable)1 Type1Font (org.apache.fontbox.type1.Type1Font)1