2010-09-01 20 views
11

मुझे पोस्टस्क्रिप्ट में एक स्ट्रिंग (दिए गए पैमाने और फ़ॉन्ट में) की ऊंचाई निर्धारित करने की आवश्यकता है।पोस्टस्क्रिप्ट में स्ट्रिंग ऊंचाई निर्धारित करने के लिए कैसे?

/Helvetic-Oblique findfont 
10 scalefont 
setfont 
10 10 1 0 360 arc fill 
10 10 moveto (test) dup stringwidth pop 2 div neg 0 rmoveto show 

क्षैतिज (लेकिन अभी तक लंबवत नहीं) परीक्षण (10,10) पर परीक्षण मुद्रित करेगा। (इसे देखने के लिए, मैं 10,10 पर एक छोटा सर्कल भी दिखाता हूं)। मुझे पाठ को लंबवत रूप से केंद्रित करने के लिए स्ट्रिंग ऊंचाई निर्धारित करने की भी आवश्यकता है, लेकिन मुझे इसके लिए कोई फ़ंक्शन नहीं मिल रहा है।

उत्तर

9

क्या आप पोस्टस्क्रिप्ट कोड से परिचित हैं? या क्या यह सिर्फ अंधेरे से कॉपी और चिपकाया गया है? यदि आप इसे समझना चाहते हैं, तो आपको "पोस्टस्क्रिप्ट भाषा संदर्भ" या "लाल पुस्तक" या "पीएलआरएम" के लिए Google होना चाहिए। ये संसाधन एडोब से पीडीएफ के रूप में उपलब्ध हैं।

आपका पोस्टस्क्रिप्ट टुकड़ा निम्नलिखित चरणों का उपयोग करता है: ढेर के शीर्ष पर

  1. (test) स्थानों स्ट्रिंग "परीक्षण"।
  2. dup ढेर पर सबसे ऊपर आइटम डुप्लिकेट करता है। (अब आपके पास स्टैक पर दो बार स्ट्रिंग होगी।)
  3. stringwidth। इस ऑपरेटर को निष्पादित करने के बाद, शीर्ष "परीक्षण" स्ट्रिंग का उपभोग किया जाएगा, और इसके बजाय दो मानों को स्टैक में जोड़ा जाएगा: स्ट्रिंग की ऊंचाई (शीर्ष) और स्ट्रिंग की चौड़ाई (शीर्ष से दूसरी)। [अद्यतन:वास्तव में, "स्ट्रिंग की ऊंचाई" नहीं पूरी तरह से सही है - यह बजाय खड़ी वर्तमान बिंदु के ऑफसेट स्ट्रिंग आकर्षित करने के लिए खत्म करने के बाद है ...]
  4. इसके बाद, आप pop का उपयोग करें। यह बस ढेर पर सबसे ऊपर मूल्य हटा देता है। अब केवल स्ट्रिंग की चौड़ाई स्टैक के शीर्ष पर बनी हुई है।
  5. 2 div उस मान को 2 से विभाजित करता है और परिणाम (आधा स्ट्रिंगविड्थ) छोड़ देता है।
  6. neg ढेर पर सबसे ऊपर मूल्य को अस्वीकार करता है। अब वह नकारात्मक मूल्य ढेर पर सबसे ऊपर है।
  7. 0 स्टैक के शीर्ष पर "0" मान रखता है।
  8. rmoveto तब ढेर पर दो शीर्ष मूल्यों का उपभोग करता है और उस बिंदु से वर्तमान बिंदु (आधा स्ट्रिंग की चौड़ाई) को बाईं ओर ले जाता है।
  9. show पहली "टेस्ट" स्ट्रिंग का उपभोग करता है जो ढेर के नीचे हर समय बना रहता है और इसे "दिखाता है"।

तो स्ट्रिंग की ऊंचाई को ध्यान में रखने के लिए क्या काम करेगा? अपने अंतिम पंक्ति के रूप का प्रयास करें:

200 700 moveto (test) dup true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 200 700 moveto rmoveto show" 

को समझने के लिए मेरे परिवर्तन में लाल किताब charpath, div, exch, pathbbox, roll और sub ऑपरेटरों के अर्थ को देखने।

यह आदेश (आसान देख सकते हैं और परिणामों की जांच करने के लिए) कोड से विंडोज पर एक पीडीएफ फाइल बनाने के लिए Ghostscript का उपयोग करता है:

gs \ 
     -o my.pdf \ 
     -sDEVICE=pdfwrite \ 
     -c "/Helvetic-Oblique findfont 10 scalefont setfont 200 700 1 0 360 arc fill 0 0 moveto (test test) dup true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 200 700 moveto rmoveto show" 

बेहतर पठनीय प्रकार हैं:

gswin32c.exe^
     -o my.pdf^
     -sDEVICE=pdfwrite^
     -c "/Helvetic-Oblique findfont 10 scalefont setfont 200 700 1 0 360 arc fill 0 0 moveto (test test) dup true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 200 700 moveto rmoveto show" 

लिनक्स उपयोग पर:

gswin32c^
    -o my.pdf^
    -sDEVICE=pdfwrite^
    -c "/Helvetic-Oblique findfont 10 scalefont setfont"^
    -c "200 700 1 0 360 arc fill 0 0 moveto (test test) dup"^
    -c "true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll"^
    -c "sub 2 div exch 200 700 moveto rmoveto show" 

और

+०१२३५१६४१०६
gs \ 
    -o my.pdf \ 
    -sDEVICE=pdfwrite \ 
    -c "/Helvetic-Oblique findfont 10 scalefont setfont" \ 
    -c "200 700 1 0 360 arc fill 0 0 moveto (test test) dup" \ 
    -c "true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll" \ 
    -c "sub 2 div exch 200 700 moveto rmoveto show" 
+1

+1 पोस्टस्क्रिप्ट के आपके अच्छे स्पष्टीकरण के लिए +1। – DaveB

6

बस जोड़ने को pipitas जवाब:

/textheight { 
    gsave         % save graphic context 
    {        
     100 100 moveto      % move to some point 
     (HÍpg) true charpath pathbbox  % gets text path bounding box (LLx LLy URx URy) 
     exch pop 3 -1 roll pop    % keeps LLy and URy 
     exch sub       % URy - LLy 
    } 
    stopped        % did the last block fail? 
    { 
     pop pop       % get rid of "stopped" junk 
     currentfont /FontMatrix get 3 get % gets alternative text height 
    } 
    if 
    grestore        % restore graphic context 
} bind def 

/jumpTextLine { 
    textheight 1.25 mul     % gets textheight and adds 1/4 
    0 exch neg rmoveto      % move down only in Y axis 
} bind def 

विधि को उम्मीद है कि कुछ फॉन्ट पहले से ही निर्धारित है। यह चयनित फ़ॉन्ट (setfont) और इसके आकार (scalefont) पर काम करता है।

मैं एक्स्टेंटेड अपरकेस वर्णों और "नीचे पंक्ति" वर्णों का उपयोग करके सबसे बड़ा बाध्यकारी बॉक्स संभव बनाने के लिए (HÍpg) का उपयोग करता हूं। नतीजा काफी अच्छा है।

वैकल्पिक दृष्टिकोण सपनेलैक्स के उत्तर से चुराता है - कुछ फ़ॉन्ट charpath ऑपरेटर का समर्थन नहीं करते हैं। (How can you get the height metric of a string in PostScript? देखें)

ग्राफिक संदर्भ को सहेजना और पुनर्स्थापित करना वर्तमान बिंदु को जगह में रखता है, इसलिए इसका आपके दस्तावेज़ के "प्रवाह" पर कोई प्रभाव नहीं पड़ता है।

आशा है कि मैंने मदद की है।

+0

इसके अतिरिक्त, आप इसे प्राप्त करने के लिए 'charpath pathbbox' का उपयोग करने के बजाय, बाउंडिंग बॉक्स के लिए 'currentfont/FontBBox get' का उपयोग कर सकते हैं ... मेरे मामले में, यह GhostScript के तहत पूरी तरह से काम करता है; हालांकि, प्रिंटर द्वारा व्याख्या किए जाने पर परिणाम अच्छा नहीं था। –

3

यहां पाइपिटस की गहराई से स्पष्टीकरण के पूरक के लिए एक कट-टू-द-चेस उत्तर है।

यह प्रक्रिया स्थिति और निर्दिष्ट बिंदु पर केंद्रित एक स्ट्रिंग दिखाती है।

/ceshow { % (string) fontsize fontname x y 
    gsave 
     moveto findfont exch scalefont setfont % s 
     gsave 
      dup false charpath flattenpath pathbbox % s x0 y0 x1 y1 
     grestore 
     3 -1 roll sub % s x0 x1 dy 
     3 1 roll sub % s dy -dx 
     2 div exch % s -dx/2 dy 
     -2 div % s -dx/2 -dy/2 
     rmoveto show 
    grestore 
} bind def 
1

मैं एक dingbat फ़ॉन्ट के साथ उपरोक्त प्रक्रिया का उपयोग कर भयानक परिणाम हो रही थी, तो मैं महसूस किया कि वे मान पाठ वास्तव में वर्तमान बिंदु, जो कुछ मामलों में बेतहाशा गलत है पर शुरू हो जाएगा।

मेरा समाधान चौड़ाई और ऊंचाई की गणना करने के लिए pathbbox पर भी निर्भर करता है लेकिन फिर यह मूल स्थान पर जाने के लिए X0 और Y0 का भी उपयोग करता है।

%-- to make things nicer 
/hmoveto { 0 rmoveto } def 
/vmoveto { 0 exch rmoveto } def 
%-- cshow means something else... 
/ccshow { 
    dup %-- charpath consumes the string 
    gsave 
    newpath %-- else there's a strange line somewhere 
    0 0 moveto 
    true charpath flattenpath pathbbox 
    grestore 
    2 index sub -2 div vmoveto 
    2 index sub -2 div hmoveto 
    neg vmoveto 
    neg hmoveto 
    show 
} def