Cắt bản vẽ SVG thành kích thước canvas trong dòng lệnh


9

Tôi có hình ảnh SVG được sản xuất bởi PlantUML, có một số phần vẽ bên ngoài khung vẽ. Nó gây khó khăn cho việc sử dụng những hình ảnh như vậy và tôi cần cắt bản vẽ theo kích thước canvas. Khi tôi tạo các sơ đồ UML bằng các tập lệnh, nó sẽ thực sự hiệu quả khi thực hiện cắt xén ở đó.

Cho đến nay tôi đã thử hai điều: a) thay đổi kích thước canvas để vẽ bằng Inkscape

inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg

Điều này hoạt động tốt, nhưng tôi cần cắt bản vẽ theo kích thước canvas và thao tác này dường như không có.

b) thay đổi kích thước với rsvg-convert

rsvg-convert image.svg -w 1870 -h 1195 -f svg -o image.svg

Điều này thực sự chính xác đến kích thước mong muốn, nhưng kích thước hình ảnh tăng ~ 10 lần vì hiện tại có một số hình ảnh nhị phân được nhúng vào SVG. Điều này không được chấp nhận đối với tôi.


Không phải là một câu trả lời, chỉ là một gợi ý (Tôi không tìm kiếm thông số kỹ thuật ngay bây giờ). svgđịnh dạng là định dạng ascii dựa trên xml, vì vậy cách dễ nhất chỉ là sử dụng sedhoặc công cụ thao tác văn bản yêu thích của bạn để chèn hoặc sửa đổi một dòng đặt hộp giới hạn. Điều này thậm chí sẽ không chạm vào các nội dung khác của tập tin. Hãy thử thực hiện thủ công một lần trên tệp svg ví dụ (trong trình soạn thảo văn bản) và sau đó dịch hành động của bạn thành tập lệnh.
orion

Kích thước vải là tốt. Tôi phải cắt tất cả các văn bản, dòng và hình chữ nhật, có các phần bên ngoài một khung vẽ. Điều đó đòi hỏi so sánh các hộp giới hạn của họ và với hộp vải. Đây là cách nhiều cho chỉ một kịch bản shell.
divanov

1
Ồ ... tôi nhớ rằng tôi đã tức giận vì inkscape tại sao nó không làm điều đó. Thậm chí còn có một báo cáo lỗi liên quan. Lúc đó họ không làm gì cả. Ngoài ra, không có công cụ tiêu chuẩn nào để loại bỏ những thứ vô hình ra khỏi tệp pdf (tất nhiên Acrobat Pro là một trong những điều tồi tệ nhất ở đây). Tuy nhiên, nếu bạn chỉ muốn cắt các phần có thể nhìn thấy một phần, bạn có thể nhóm toàn bộ nội dung và đặt một clip có kích thước hộp giới hạn trên tất cả mọi thứ. Họ vẫn còn trong tập tin, và họ vẫn chiếm không gian.
orion

Cảm ơn vì đã góp ý. Thay đổi xml với sed hơi nguy hiểm, nhưng vẫn tốt hơn so với chỉnh sửa thủ công.
divanov

Câu trả lời:


5

Tôi tìm thấy một cách không phù hợp để làm điều đó bằng cách sử dụng đề xuất của orion. Giả sử $svg_file_namelà một biến chứa đường dẫn tệp đến hình ảnh SVG.

Đầu tiên chúng ta cần chiều rộng và chiều cao hình ảnh

width=$(exiftool -ImageWidth $svg_file_name | sed "s/.*: //;s/pt//g")
height=$(exiftool -ImageHeight $svg_file_name | sed "s/.*: //;s/pt//g")

PlantUML tạo sơ đồ dưới dạng một nhóm (thẻ <g>), hãy đặt hình chữ nhật có kích thước canvas lên trên nhóm đó

sed -i "s|</g>|</g><polygon fill=\"#FFFFFF\" points=\"0,0,0,$height,$width,$height,$width,0\" style=\"stroke: #000000; stroke-width: 1.0;\"/>|" $svg_file_name

Bây giờ mở hình ảnh với inkscape, chọn tất cả và cắt nhóm với hình chữ nhật

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileClose $svg_file_name

Với Inkscape mới nhất, người ta cần thoát Inkscape thay vì đóng tệp

inkscape --verb=EditSelectAll --verb=ObjectSetClipPath --verb=FileSave --verb=FileQuit $svg_file_name

Lưu ý rằng một số svss có thể sử dụng đơn vị "mm" và viewBox. Sau đó, chiều cao và chiều rộng cần được điều chỉnh theo tỷ lệ. Thêm thông tin ở đây .
jmiserez
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.