- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
虽然有几个此类问题,而且是一个常见问题,但我想更新最新的库以获得更好的结果。
我有 html 代码(div 的内容),它有几个 svg,并使用外部 css 和 js,包含在 html header 中。我正在寻找如何将它导出为 pdf,它可以是 PHP 或 javascript。
尝试这些替代方案,但效果不佳:
Html2Pdf (php): 不支持svg标签。
mPDF (php):mpdf\classes\svg.php 中的转换错误
您还推荐哪些其他替代方案?
感谢您的贡献。
[编辑 03-06]
为了继续使用mpdf,我尝试将svg标签转为img。我可以使用两种不同类型的图形,而且质量很好。
在第三种情况下,它不生成图像。一些代码来理解所使用的方法:
HTML
<span id="graf_capitanias_ct"></span>
图形D3代
<script type="text/javascript">
var margin = {top: 20, right: 160, bottom: 35, left: 30};
var width = 300 - margin.left - margin.right,
height = 150 - margin.top - margin.bottom;
var svg = d3.select("#graf_capitanias_ct")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
/* Data in strings like it would be if imported from a csv */
var data = [
{ year: "2018", ct: "4", capitanias: "2"},
{ year: "2017", ct: "1", capitanias: "1"},
{ year: "2016", ct: "3", capitanias: "0"},
];
var parse = d3.time.format("%Y").parse;
// Transpose the data into layers
var dataset = d3.layout.stack()(["ct", "capitanias"].map(function(valor) {
return data.map(function(d) {
return {x: parse(d.year), y: +d[valor]};
});
}));
// Set x, y and colors
var x = d3.scale.ordinal()
.domain(dataset[0].map(function(d) { return d.x; }))
.rangeRoundBands([10, width-10], 0.02);
var y = d3.scale.linear()
.domain([0, d3.max(dataset, function(d) { return d3.max(d, function(d) { return d.y0 + d.y; }); })])
.range([height, 0]);
var colors = ["#d25c4d", "#f2b447"];
// Define and draw axes
var yAxis = d3.svg.axis()
.scale(y)
.orient("left")
.tickFormat(d3.format(",d"))
.tickSize(-width, 0, 0)
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom")
.tickFormat(d3.time.format("%Y"));
svg.append("g")
.attr("class", "y cap_ct_axis")
.call(yAxis);
svg.append("g")
.attr("class", "x cap_ct_axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.selectAll("text")
.style("text-anchor", "end")
.attr("dx", "-.8em")
.attr("dy", ".15em")
.attr("transform", "rotate(-65)");
// Create groups for each series, rects for each segment
var groups = svg.selectAll("g.cost")
.data(dataset)
.enter().append("g")
.attr("class", "cost")
.style("fill", function(d, i) { return colors[i]; });
var rect = groups.selectAll("rect")
.data(function(d) { return d; })
.enter()
.append("rect")
.attr("x", function(d) { return x(d.x); })
.attr("y", function(d) { return y(d.y0 + d.y); })
.attr("height", function(d) { return y(d.y0) - y(d.y0 + d.y); })
.attr("width", x.rangeBand())
.on("mouseover", function() { tooltip.style("display", null); })
.on("mouseout", function() { tooltip.style("display", "none"); })
.on("mousemove", function(d) {
var xPosition = d3.mouse(this)[0] - 15;
var yPosition = d3.mouse(this)[1] - 25;
tooltip.attr("transform", "translate(" + xPosition + "," + yPosition + ")");
tooltip.select("text").text(d.y);
});
// Draw legend
var legend = svg.selectAll(".legend")
.data(colors)
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(30," + i * 19 + ")"; });
legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", function(d, i) {return colors.slice().reverse()[i];});
legend.append("text")
.attr("x", width + 5)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "start")
.text(function(d, i) {
switch (i) {
case 0: return "Capitan\u00edas";
case 1: return "Cuerpos t\u00e9cnicos";
}
});
// Prep the tooltip bits, initial display is hidden
var tooltip = svg.append("g")
.attr("class", "tooltip")
.style("display", "none");
tooltip.append("rect")
.attr("width", 30)
.attr("height", 20)
.attr("fill", "white")
.style("opacity", 0.5);
tooltip.append("text")
.attr("x", 15)
.attr("dy", "1.2em")
.style("text-anchor", "middle")
.attr("font-size", "12px")
.attr("font-weight", "bold");
</script>
svg转img
<script type="text/javascript">
function convierte_graficos_cap_ct() {
var html = '';
var imgscr = '';
var img = '';
var attributes = '';
// css manual
d3.selectAll('#graf_capitanias_ct svg')
.style({
"font": "10px sans-serif",
"shape-rendering": "crispEdges"
});
d3.selectAll('.cap_ct_axis path, .cap_ct_axis line')
.style({
"fill": "none",
"stroke": "#000"
});
d3.selectAll('.cap_ct_axis path.domain')
.style({
"stroke": "none"
});
d3.selectAll('.cap_ct_axis.y .tick line')
.style({
"stroke": "#ddd"
});
html = $('#graf_capitanias_ct').html();
imgsrc = 'data:image/svg+xml;base64,'+ btoa(html);
img = '<img src="'+imgsrc+'"';
attributes = $('svg').prop("attributes");
$.each(attributes, function() {
img += ' '+this.name+'="'+this.value+'"';
});
img += '>';
$('#graf_capitanias_ct').html(img);
}
</script>
注意再次转换前必须添加css样式。它最初从外部 CSS 中获取它们。
因此,显示“损坏”的标签 img 不会转换 svg。它中断是因为图中有 UTF-8 文本(图例)。在转换之前应该如何更改该文本?谢谢
最佳答案
对于 PDF 生成,我们目前使用 Snappy ,它是 WKHTMLTOPDF 的包装器.
我们使用 SVG 将图表嵌入到 HTML 中并进行渲染。
尽管我们在尺寸和位置方面确实存在一些问题。
我们最终将 SVG 转换为图像,然后将其编码为 base64。
然后将 Base64 添加到 <img src="[Base64String]">
Composer可以很好地降低这些依赖性。
{
"require":{
"knplabs/knp-snappy": "^0.4.3",
"h4cc/wkhtmltopdf-amd64": "0.12.x",
"h4cc/wkhtmltoimage-amd64": "0.12.x",
"h4cc/wkhtmltopdf-i386": "0.12.x",
"h4cc/wkhtmltoimage-i386": "0.12.x",
"wemersonjanuario/wkhtmltopdf-windows": "0.12.x"
}
}
其他一些选项是:
关于javascript - 当前用于将 html + svg + css 转换为 pdf 的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55014458/
Java 库和 android 库有什么区别,各自有什么优点/缺点? 最佳答案 您可以在 Android 应用程序中包含标准 Java .jar 文件库。它们在 .apk 构建时被翻译成 Dalvik
所以,我现在的代码就像从 Java 层加载库(比如 liba.so),并在内部 liba.so 加载 libb.so。因此,如果我必须将所有库打包到 APK 中并将其安装在没有 root 访问权限的设
我想在我的系统中设置 LEDA 库。 我已经从以下链接下载了 LEDA 库 http://www.algorithmic-solutions.info/free/d5.php Instruct
我想用 autoconf 创建一个共享库。但是,我希望共享库具有“.so”扩展名,而不是以“lib”开头。基本上,我想制作一个加载 dlopen 的插件。 .是否有捷径可寻? 当我尝试使用 autoc
我需要在 Apps 脚本应用程序上修改 PDF。为此,我想使用 JS 库:PDF-LIB 我的代码: eval(UrlFetchApp.fetch("https://unpkg.com/pdf-lib
我正在构建一个使用以下 Boost header 的程序(我使用的是 Microsoft Visual C++ 10), #include #include #include #include
当我通过 cygwin 在 hadoop 上运行此命令时: $bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 我
我已经通过 vcpgk 成功安装了一个 C++ 库,名为:lmdb:x64-windows 我还安装了lmdb通过 Cabal 安装的 Haskell 绑定(bind)包 在尝试测试 lmdb 包时:
我该如何解决这个问题? 我刚刚将 javacv jar 文件复制到我的项目 Lib 文件夹下,但出现了这个错误! 我可以找到这个thread来自谷歌,但不幸的是,由于我国的谷歌限制政策,该页面无法打开
我有一个 Android 库项目 FooLib。 FooLib 引用 Android Context 之类的东西,但不需要任何资源文件(res/ 中的东西)所以我目前将其打包为供我的应用使用的 JAR
我正在开发一个 Android 应用程序(使用 Android Studio),它能够通过手势识别算法了解您正在进行的 Activity 。对于我使用 nickgillian ithub 帐户上可用的
关于从 .NET Framework 项目中引用 .NET Standard 类库的问题有很多类似的问题,其中 netstandard 库中的 NuGet 包依赖项不会流向 netframework
我已经从互联网上下载了 jna-4.2.2.jar,现在想将这个 jar 导入到我的项目中。但是当我试图将这个 jar 导入我的项目时,出现以下错误。 [2016-06-20 09:35:01 - F
我正在尝试通过编译在 Mac 上安装 rsync 3.2.3。但是,我想安装所有功能。为此,它需要一些库,此处 ( https://download.samba.org/pub/rsync/INSTA
进入 Web 开发有点困难。过去 5 年我一直致力于 winforms 工作。所以我正在努力从一种切换到另一种。前段时间,我使用过 JavaScript,但现在还没有大量的 JavaScript 库
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在寻找一个用Python编写的与logstash(ruby + java)类似的工具/库。 我的目标是: 从 syslog 中解析所有系统日志 解析应用程序特定日志(apache、django、m
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我花了几天时间试图寻找用于 JavaPOS 实现的 .jar 库,但我找不到任何可以工作的东西。我找到了很多像这样的文档:http://jpos.1045706.n5.nabble.com/file/
这个问题在这里已经有了答案: Merge multiple .so shared libraries (2 个答案) 关闭 9 年前。 我有我在代码中使用的第三方库的源代码和对象。该库附带有关如何使
我是一名优秀的程序员,十分优秀!