type1font.java
来自「有关对pdf操作的代码」· Java 代码 · 共 826 行 · 第 1/3 页
JAVA
826 行
fontSpecific = false; } if (!encoding.startsWith("#")) PdfEncodings.convertToBytes(" ", enc); // check if the encoding exists createEncoding(); } /** Gets the width from the font according to the <CODE>name</CODE> or, * if the <CODE>name</CODE> is null, meaning it is a symbolic font, * the char <CODE>c</CODE>. * @param c the char if the font is symbolic * @param name the glyph name * @return the width of the char */ int getRawWidth(int c, String name) { Object metrics[]; if (name == null) { // font specific metrics = (Object[])CharMetrics.get(new Integer(c)); } else { if (name.equals(".notdef")) return 0; metrics = (Object[])CharMetrics.get(name); } if (metrics != null) return ((Integer)(metrics[1])).intValue(); return 0; } /** Gets the kerning between two Unicode characters. The characters * are converted to names and this names are used to find the kerning * pairs in the <CODE>HashMap</CODE> <CODE>KernPairs</CODE>. * @param char1 the first char * @param char2 the second char * @return the kerning to be applied */ public int getKerning(char char1, char char2) { String first = GlyphList.unicodeToName((int)char1); if (first == null) return 0; String second = GlyphList.unicodeToName((int)char2); if (second == null) return 0; Object obj[] = (Object[])KernPairs.get(first); if (obj == null) return 0; for (int k = 0; k < obj.length; k += 2) { if (second.equals(obj[k])) return ((Integer)obj[k + 1]).intValue(); } return 0; } /** Reads the font metrics * @param rf the AFM file * @throws DocumentException the AFM file is invalid * @throws IOException the AFM file could not be read */ public void process(RandomAccessFileOrArray rf) throws DocumentException, IOException { String line; boolean isMetrics = false; while ((line = rf.readLine()) != null) { StringTokenizer tok = new StringTokenizer(line, " ,\n\r\t\f"); if (!tok.hasMoreTokens()) continue; String ident = tok.nextToken(); if (ident.equals("FontName")) FontName = tok.nextToken("\u00ff").substring(1); else if (ident.equals("FullName")) FullName = tok.nextToken("\u00ff").substring(1); else if (ident.equals("FamilyName")) FamilyName = tok.nextToken("\u00ff").substring(1); else if (ident.equals("Weight")) Weight = tok.nextToken("\u00ff").substring(1); else if (ident.equals("ItalicAngle")) ItalicAngle = Float.parseFloat(tok.nextToken()); else if (ident.equals("IsFixedPitch")) IsFixedPitch = tok.nextToken().equals("true"); else if (ident.equals("CharacterSet")) CharacterSet = tok.nextToken("\u00ff").substring(1); else if (ident.equals("FontBBox")) { llx = (int)Float.parseFloat(tok.nextToken()); lly = (int)Float.parseFloat(tok.nextToken()); urx = (int)Float.parseFloat(tok.nextToken()); ury = (int)Float.parseFloat(tok.nextToken()); } else if (ident.equals("UnderlinePosition")) UnderlinePosition = (int)Float.parseFloat(tok.nextToken()); else if (ident.equals("UnderlineThickness")) UnderlineThickness = (int)Float.parseFloat(tok.nextToken()); else if (ident.equals("EncodingScheme")) EncodingScheme = tok.nextToken("\u00ff").substring(1); else if (ident.equals("CapHeight")) CapHeight = (int)Float.parseFloat(tok.nextToken()); else if (ident.equals("XHeight")) XHeight = (int)Float.parseFloat(tok.nextToken()); else if (ident.equals("Ascender")) Ascender = (int)Float.parseFloat(tok.nextToken()); else if (ident.equals("Descender")) Descender = (int)Float.parseFloat(tok.nextToken()); else if (ident.equals("StdHW")) StdHW = (int)Float.parseFloat(tok.nextToken()); else if (ident.equals("StdVW")) StdVW = (int)Float.parseFloat(tok.nextToken()); else if (ident.equals("StartCharMetrics")) { isMetrics = true; break; } } if (!isMetrics) throw new DocumentException("Missing StartCharMetrics in " + fileName); while ((line = rf.readLine()) != null) { StringTokenizer tok = new StringTokenizer(line); if (!tok.hasMoreTokens()) continue; String ident = tok.nextToken(); if (ident.equals("EndCharMetrics")) { isMetrics = false; break; } Integer C = new Integer(-1); Integer WX = new Integer(250); String N = ""; int B[] = null; tok = new StringTokenizer(line, ";"); while (tok.hasMoreTokens()) { StringTokenizer tokc = new StringTokenizer(tok.nextToken()); if (!tokc.hasMoreTokens()) continue; ident = tokc.nextToken(); if (ident.equals("C")) C = Integer.valueOf(tokc.nextToken()); else if (ident.equals("WX")) WX = new Integer((int)Float.parseFloat(tokc.nextToken())); else if (ident.equals("N")) N = tokc.nextToken(); else if (ident.equals("B")) { B = new int[]{Integer.parseInt(tokc.nextToken()), Integer.parseInt(tokc.nextToken()), Integer.parseInt(tokc.nextToken()), Integer.parseInt(tokc.nextToken())}; } } Object metrics[] = new Object[]{C, WX, N, B}; if (C.intValue() >= 0) CharMetrics.put(C, metrics); CharMetrics.put(N, metrics); } if (isMetrics) throw new DocumentException("Missing EndCharMetrics in " + fileName); if (!CharMetrics.containsKey("nonbreakingspace")) { Object[] space = (Object[])CharMetrics.get("space"); if (space != null) CharMetrics.put("nonbreakingspace", space); } while ((line = rf.readLine()) != null) { StringTokenizer tok = new StringTokenizer(line); if (!tok.hasMoreTokens()) continue; String ident = tok.nextToken(); if (ident.equals("EndFontMetrics")) return; if (ident.equals("StartKernPairs")) { isMetrics = true; break; } } if (!isMetrics) throw new DocumentException("Missing EndFontMetrics in " + fileName); while ((line = rf.readLine()) != null) { StringTokenizer tok = new StringTokenizer(line); if (!tok.hasMoreTokens()) continue; String ident = tok.nextToken(); if (ident.equals("KPX")) { String first = tok.nextToken(); String second = tok.nextToken(); Integer width = new Integer((int)Float.parseFloat(tok.nextToken())); Object relates[] = (Object[])KernPairs.get(first); if (relates == null) KernPairs.put(first, new Object[]{second, width}); else { int n = relates.length; Object relates2[] = new Object[n + 2]; System.arraycopy(relates, 0, relates2, 0, n); relates2[n] = second; relates2[n + 1] = width; KernPairs.put(first, relates2); } } else if (ident.equals("EndKernPairs")) { isMetrics = false; break; } } if (isMetrics) throw new DocumentException("Missing EndKernPairs in " + fileName); rf.close(); } /** If the embedded flag is <CODE>false</CODE> or if the font is * one of the 14 built in types, it returns <CODE>null</CODE>, * otherwise the font is read and output in a PdfStream object. * @return the PdfStream containing the font or <CODE>null</CODE> * @throws DocumentException if there is an error reading the font */ private PdfStream getFontStream() throws DocumentException { if (builtinFont || !embedded) return null; RandomAccessFileOrArray rf = null; try { String filePfb = fileName.substring(0, fileName.length() - 3) + "pfb"; if (pfb == null) rf = new RandomAccessFileOrArray(filePfb); else rf = new RandomAccessFileOrArray(pfb); int fileLength = rf.length(); byte st[] = new byte[fileLength - 18]; int lengths[] = new int[3]; int bytePtr = 0; for (int k = 0; k < 3; ++k) { if (rf.read() != 0x80) throw new DocumentException("Start marker missing in " + filePfb); if (rf.read() != PFB_TYPES[k]) throw new DocumentException("Incorrect segment type in " + filePfb); int size = rf.read(); size += rf.read() << 8; size += rf.read() << 16; size += rf.read() << 24; lengths[k] = size; while (size != 0) { int got = rf.read(st, bytePtr, size); if (got < 0) throw new DocumentException("Premature end in " + filePfb); bytePtr += got; size -= got; } } return new StreamFont(st, lengths); } catch (Exception e) { throw new DocumentException(e); } finally { if (rf != null) { try { rf.close(); } catch (Exception e) { // empty on purpose } } } } /** Generates the font descriptor for this font or <CODE>null</CODE> if it is * one of the 14 built in fonts. * @param fontStream the indirect reference to a PdfStream containing the font or <CODE>null</CODE> * @return the PdfDictionary containing the font descriptor or <CODE>null</CODE>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?