Java 将模糊图表保存为pdf格式时,请将其删除

Java 将模糊图表保存为pdf格式时,请将其删除,java,image,javafx,pdfbox,blurry,Java,Image,Javafx,Pdfbox,Blurry,因此,我在互联网上找到了一个如何将javafx图表保存为pdf的示例,因此我尝试了一下: final AreaChart<Number, Number> arechart = new AreaChart<>(new NumberAxis(0, 3, 0.5), new NumberAxis(0, 3, 0.5)); xAxis.setLabel("average quality"); yAxis.setLabel("average quantity"); sc.setTi

因此,我在互联网上找到了一个如何将javafx图表保存为pdf的示例,因此我尝试了一下:

final AreaChart<Number, Number> arechart = new AreaChart<>(new NumberAxis(0, 3, 0.5), new NumberAxis(0, 3, 0.5));
xAxis.setLabel("average quality");
yAxis.setLabel("average quantity");
sc.setTitle("Producerdata");

XYChart.Series series1 = new XYChart.Series();
series1.setName("Water 11");

producer.getProducts().forEach((pr) -> {
    if (pr.getName().equals("Water 11")) {
        series1.getData().add(new XYChart.Data(pr.getPercentQual(), pr.getAmount()));
    }
});

XYChart.Series series2 = new XYChart.Series();
series2.setName("Water E40");
producer.getProducts().forEach((pr) -> {
    if (pr.getName().equals("Water E40")) {
        series2.getData().add(new XYChart.Data(pr.getPercentQual(), pr.getAmount()));
    }
});
arechart.getData().addAll(series1, series2);
PDDocument newPDF=new PDDocument();
PDPage chartPage = new PDPage();
newPDF.addPage(chartPage);
WritableImage image = arechart.snapshot(new SnapshotParameters(), null);
BufferedImage bf= SwingFXUtils.fromFXImage(image, null);
PDImageXObject pdImageXObject = LosslessFactory.createFromImage(newPDF, bf);
PDPageContentStream contentStream = new PDPageContentStream(newPDF, chartPage);
contentStream.drawImage(pdImageXObject, 150, 500, pdImageXObject.getWidth()  , pdImageXObject.getHeight() );
contentStream.close();
newPDF.close();
newPDF.save(new File("C:\\Users\\chelsfan\\Desktop\\TestingNetbeans\\PDFS\\chart.pdf"));
final AreaChart arechart=新的区域图(新的数字轴(0,3,0.5),新的数字轴(0,3,0.5));
xAxis.setLabel(“平均质量”);
yAxis.setLabel(“平均数量”);
sc.setTitle(“生产数据”);
XYChart.Series系列1=新的XYChart.Series();
系列1.设置名称(“水11”);
producer.getProducts().forEach((pr)->{
if(pr.getName().equals(“Water 11”)){
series1.getData().add(新的XYChart.Data(pr.getPercentQual(),pr.getAmount());
}
});
XYChart.Series系列2=新的XYChart.Series();
系列2.设置名称(“水E40”);
producer.getProducts().forEach((pr)->{
if(pr.getName().equals(“水E40”)){
series2.getData().add(新的XYChart.Data(pr.getPercentQual(),pr.getAmount());
}
});
arechart.getData().addAll(系列1、系列2);
PDDocument newPDF=新PDDocument();
PDPage chartPage=新PDPage();
新增PDF.addPage(图表页);
WritableImage image=arechart.snapshot(新的SnapshotParameters(),null);
BuffereImage bf=SwingFXUtils.fromFXImage(图像,null);
PDImageXObject PDImageXObject=LosslessFactory.createFromImage(新PDF,bf);
PDPageContentStream contentStream=新的PDPageContentStream(newPDF,chartPage);
contentStream.drawImage(pdImageXObject,150500,pdImageXObject.getWidth(),pdImageXObject.getHeight());
contentStream.close();
newPDF.close();
newPDF.save(新文件(“C:\\Users\\chelsfan\\Desktop\\TestingNetbeans\\PDFS\\chart.pdf”);
现在我遇到的问题是,当我将javafx区域图表保存到pdf时,图表看起来有点模糊

例如:

如果我100%缩放到pdf,图表“消失”: 如果缩小到75%或放大到125%,图表看起来很模糊:


现在我的问题是,是否有办法使pdf中的图表看起来更清晰,因为在程序中,图表看起来正常(不模糊,看起来很清晰)?

通过在JavaFX中应用比例变换创建更大的图像:

SnapshotParameters sp = new SnapshotParameters();
Transform transform = Transform.scale(5, 5); // increase for larger image
sp.setTransform(transform);
WritableImage image = arechart.snapshot(sp, null);
BufferedImage bf= SwingFXUtils.fromFXImage(image, null);
ImageIO.write(bf, "png", new File("JavaFXTest.png")); // remove this line in production, this is just for you to see that the image is larger but not blurry
稍后创建PDF反向缩放以使其看起来更小时:

contentStream.drawImage(pdImageXObject, 150, 500, pdImageXObject.getWidth() / 5, pdImageXObject.getHeight() / 5);

你没有输入完整的代码。。。最有可能的答案是将原始图表放大,然后再放大。完美的解决方案是使用矢量图形,这当然需要更多的工作。@TilmanHausherr我在上面添加了arechart代码。在哪里可以设置大小/比例?最简单的方法是将
pdImageXObject.getWidth(),pdImageXObject.getHeight()
除以一个数字。如果是原始图像的大小,我不知道如何增加该大小。我以为这与现场有关,但事实并非如此。可能是
快照中的某个参数。当我划分imageobject的宽度和长度并放大到100%时,图表不会消失,但看起来仍然有点模糊,效果会好一点。现在,如果我有正常的缩放(100%),它看起来有点模糊,但好的方面是,如果缩放得越多,它就会变得越干净/越不模糊。我必须更改哪个参数,使其在默认情况下看起来越来越清晰缩放在4处增加“5”。我无法测试自己,因为你的代码不工作。缺少xAxis、yAxis、sc和producer的声明。