Sự cố với Văn bản động trong SVG khi phông chữ không phải là SVG


7

Vì vậy, tôi có một chuỗi tự động hóa đồ họa đang hoạt động vui vẻ trên môi trường linux không đầu bằng cách sử dụng các chương trình SVG và PhantomJS được tạo ra / thay đổi theo chương trình (hiện là 1.9.0) như một công cụ kết xuất cuối cùng. Tôi có một số yêu cầu thay thế văn bản động và dẫn đến nhu cầu điều chỉnh và điều chỉnh phông chữ động ... Tôi đã sử dụng các phông chữ SVG nhúng và một số javascript nhúng nhúng, hoạt động tốt, ngoại trừ hai điều:

1) Máy khách có một số yêu cầu về phông chữ có chữ ghép (định dạng phông chữ SVG không hỗ trợ)

2) Chúng tôi đang thực hiện một tùy chọn xem trước trực tiếp và rất thích có thể phục vụ SVG lên trang web mà không cần hiển thị png / jpeg / bất cứ thứ gì trên máy chủ của chúng tôi trước khi sử dụng. giữ tải xuống, làm cho CPU của khách hàng thực hiện công việc nặng nhọc, tất cả chỉ có thế.

Vì những vấn đề này mà tôi đã giải quyết với các phông chữ WOFF, vì sự hỗ trợ cho các phông chữ SVG không bao giờ RẤT tốt, và bây giờ Chrome không hỗ trợ chúng nữa bằng cách chuyển sang công cụ Blink, nếu tôi muốn ứng dụng khách làm công việc của tôi Tôi cần một cái gì đó tương thích với càng nhiều trình duyệt phổ biến càng tốt ...

Vì vậy, đây là vấn đề: Tỷ lệ tự động của tôi thất bại thảm hại khi tôi sử dụng phông chữ WOFF (hoặc OFT hoặc TTF) và chức năng @ font-face.

những gì tôi đã làm chỉ là nhúng phông chữ SVG vào đồ họa của tôi trong defs và tham chiếu với DOM giống như bất kỳ phần tử SVG nào khác. Điều này thực hiện những điều tôi mong đợi và cần khi kết hợp với tập lệnh java như thế này:

<script id="multiscaler1" type="text/javascript">
    var texta = document.getElementById(&quot;text8093&quot;);
    var textb = document.getElementById(&quot;text8100&quot;);
    var textpatha = document.getElementById(&quot;textPath8097&quot;);
    var textpathb = document.getElementById(&quot;textPath8104&quot;);
    var patha = document.getElementById(&quot;path8091&quot;);
    var pathb = document.getElementById(&quot;path8089&quot;);
    var charcounta = textpatha.getNumberOfChars();
    var charcountb = textpathb.getNumberOfChars();
    var fontsizea = 10;
    var fontsizeb = 10;
    var offseta = -13;
    var offsetb = -13;
    var spacing = 0;
    while ( ((textpatha.getComputedTextLength() + (spacing * charcounta)) &lt; patha.getTotalLength()) &amp;&amp; (fontsizea &lt; 43) )
    {
        fontsizea += .5;
        offseta += 0.2
        textpatha.setAttribute(&quot;font-size&quot;, fontsizea);
        texta.setAttribute(&quot;transform&quot;, &quot;translate(&quot; + offseta + &quot;,0)&quot;);
    }
    while ( ((textpathb.getComputedTextLength() + (spacing * charcountb)) &lt; pathb.getTotalLength()) &amp;&amp; (fontsizeb &lt; 43) )
    {
        fontsizeb += .5;
        offsetb += 0.2
        textpathb.setAttribute(&quot;font-size&quot;, fontsizeb);
        textb.setAttribute(&quot;transform&quot;, &quot;translate(&quot; + offsetb + &quot;,0)&quot;);
    } 
</script>

Khá là tào lao, tôi biết, nhưng tôi là một giám đốc sản xuất và nghệ sĩ đồ họa, không phải là một lập trình viên: P và nó trông như thế này:

nhập mô tả hình ảnh ở đây

Đó là những gì tôi muốn ... (nhưng tất nhiên chỉ hoạt động trên các trình duyệt hỗ trợ phông chữ SVG ...)

Bây giờ, khi tôi thêm vẻ đẹp nhỏ bé này vào deffs của tôi

<style type="text/css">
@font-face {
  font-family: Narrow-Bold;
  src: url('WOFFFONTS/Narrow-Bold.woff');
}
</style>

và xóa dữ liệu phông chữ SVG tôi nhận được điều này:

nhập mô tả hình ảnh ở đây

Trời ơi. Điều đó không đúng chút nào. Tôi đã loay hoay với các giá trị khoảng cách của mình (có để xử lý tình huống khác khi tôi thay đổi khoảng cách ký tự để tối đa hóa kích thước phông chữ dựa trên độ dài chuỗi ...) và có thể khiến nó thực hiện điều này:

nhập mô tả hình ảnh ở đây

cũng khá sai: /

Những gì cho ở đây? Có ai giúp đỡ không? Thành thật mà nói, thật đáng yêu khi chuyển tất cả sang phông chữ WFFF (hoặc phông chữ OTF hoặc TTF được liên kết với khuôn mặt, phông chữ BTW, làm điều tương tự) vì tôi có ít hơn 20.000 dòng SVG mà không nhúng phông chữ nơi chết tiệt ...

Tôi đã thử các công cụ chuyển đổi phông chữ khác nhau và thậm chí một mẹo tôi tìm thấy trong một số kết quả tìm kiếm của google trong đó bạn xây dựng WOFF từ SVG, chứ không phải TTF hoặc OTF ... cùng kết quả.

??

Dưới đây là một ví dụ đơn giản về một SVG độc lập đang hoạt động với phông chữ SVG được nhúng bằng phông chữ Delicious Bold miễn phí . Rõ ràng điều này sẽ chỉ hoạt động trên một trình duyệt hỗ trợ phông chữ SVG. Phông chữ nhúng được tạo từ bản tải xuống mới của OTF với FontForge For Windows Release 2015-06-12 . Tôi cũng đã tạo một phiên bản WOFF có cùng phông chữtheo cùng một cách (tất cả các cài đặt mặc định, bỏ qua cảnh báo về "tiến bộ không theo tiêu chuẩn" trong định nghĩa TTF) và thêm một liên kết mặt chữ @ với một tên khác sẽ trỏ đến WOFF khi nó nằm trong cùng thư mục như SVG. Bằng cách chỉnh sửa font-face = "xxxxxx" trong phần tử text / textpath của SVG, bạn có thể nhanh chóng chuyển đổi giữa phông chữ SVG được nhúng, (hoạt động tốt) phông chữ WOFF được liên kết (tỷ lệ không chính xác) và phiên bản hệ thống của phông chữ gia đình, nếu được cài đặt (có lẽ cần lưu ý, biểu hiện hơi khác so với phông chữ SVG được nhúng, nhưng cũng có tỷ lệ chính xác)

Hành vi này phù hợp trên tất cả các trình duyệt đã được thử nghiệm (Opera mới nhất cho Windows 7 64bit, Mozilla-Ubuntu Linux mới nhất, Windows 7/8 64bit mới nhất, Safari 5.1.7 cho Windows (hỗ trợ phông chữ SVG) và PhantomJS 1.9.7 Linux CentOS 6.4 cuối cùng (hỗ trợ phông chữ SVG). Nó cũng nhất quán trên tất cả các phông chữ được thử nghiệm (nhiều ...) và các công cụ chuyển đổi phông chữ (phông chữ sóc, FontForge, Birdfont ...)

Vì SVG tự chứa quá lớn để dán vào cơ thể, đây là một liên kết đến nó được dán vào một dự án JSfiddle .

Vâng, tôi nhận ra rằng tôi có thể giải quyết điều này bằng cách kết xuất với batik Apache, nhưng: 1) Batik là slooooooooooooow. Sooooo sloooooooooooooooooooooooooow ... OMG là nó chậm. 2) Tôi muốn có thể giảm tải càng nhiều CPU từ máy chủ của mình càng tốt, REVERSE chính xác của những gì batik sẽ làm 3) Đó không phải là vấn đề, chết tiệt!


Xin chào JawzX, nếu bạn không nhận được câu trả lời ở đây. Bạn có thể muốn thử đăng bài tại stackoverflow.com
AndrewH

Cảm ơn, tôi là thành viên Stack Overflow và đã đăng chéo này. cho đến nay nó đã được chú ý nhiều hơn ở đây, nhưng không có câu trả lời nào cả ...
JawzX

1
Bạn nên xem xét việc đặt tiền thưởng trong 2 ngày nhưng trên SO chứ không phải ở đây. Bạn cũng nên xem xét sửa đổi câu hỏi của mình để làm cho nó gọn hơn và thẳng hơn, có thể kết hợp 3 hình ảnh thành một. Bạn có thể nhận được nhiều độc giả hơn.
Alin

1
Rất nhiều TL; DR
Zach Saucier

1
không biết TL; DR là một lời chỉ trích hợp lệ bên ngoài redit.
JawzX

Câu trả lời:


1

Tôi làm việc với các SVG rất nhiều, vì tôi là một nhà thiết kế web. Nếu tôi muốn duy trì hình dạng (kiểu phông chữ) của văn bản của mình, tôi mở Adobe Illustrator, viết những gì tôi muốn và 'Tạo Đề cương' từ đó. Việc này không tốn thời gian, chỉ cần đảm bảo bạn sao chép văn bản trước khi phác thảo để giữ phiên bản có thể chỉnh sửa.


Tôi đang làm việc trong một môi trường sản xuất đầy đủ với hàng trăm đơn đặt hàng của khách hàng mỗi ngày, tôi không đủ thời gian để xuất khẩu sang các đường dẫn trong họa sĩ minh họa. Tôi vẫn đang chạy một hệ thống lỗi thời vì nó là
NHANH NHẤT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.