如何使用带有JPanel中引入的嵌入字体的iText7将JPanel导出为pdf,非对称纸张边距和点定位

时间:2016-12-12 16:52:59

标签: itext7

我之前没有iText 5经验,但仅在不到一个月前开始阅读有关iText 7的内容。我有一个相当复杂的任务,即将主JTabbedPane中的JPanel显示转换为具有多个同时要求的pdf。我使用Swing指定字体并需要在pdf中嵌入字体。我需要指定不对称的pdf边距并分配顶部与底部,以及左右边距均匀分布,每个JPanel动态地在美国风景纸上打开。我的通用Java程序使用所有JComponents的每像素x和y定位,并且程序根据每个JPanel上多个堆叠的JTable的数据内容动态地知道每个完成的JPanel显示的x和y范围。使用每英寸100像素,我的JPanels不需要缩放以使用我指定的边距来适应美国大小写的横向纸张。

我在developers.itextpdf.com上进行了三次单独的搜索,查询“export JTable to pdf”,“export JPanel to pdf”,“export JFrame to pdf”但是没有找到结果我是否使用iText 5或7进行过滤在常规互联网浏览器搜索框中输入的相同查询显示Stack Overflow(例如How2: Add a JPanel to a Document then export to PDF)和其他来源的多个结果。但是,所有解决方案都依赖于iText 5,因为它们都使用了iText 7中不存在的PdfTemplate和PdfContentByte,以及带有getInstance方法的不同版本的PdfWriter。但是,iText7导出JPanel到pdf在Stackoverflow上没有显示任何结果。自从我开始介绍iText 7以来,我更倾向于使用iText 7将我的JPanel编码为pdf转换,如果有人能指出我该怎么做的话。

即使使用iText 5解决方案,我如何确保将我的JComponents中指定的单个Java字体转移到中间Graphics2D(如果iText 7也使用它)并正确链接到iText字体嵌入调用。我需要修改的其他内容是将JPanel中每英寸100像素转换为pdf上每英寸72磅,以及pdf媒体盒的放置以获得适当的边距。我希望简单的数学具有一些特殊的四舍五入的注意力,这些都是修补部分所需要的。请允许我提前感谢任何即将到来的帮助。

1 个答案:

答案 0 :(得分:1)

我有类似的问题,但是寻求一个更简单的解决方案。将Swing组件转换为Java Image非常容易,就像截取正在运行的应用程序的截图一样。在您拥有包含JPanel内容的大JTabbedPane后,您可以将其直接写入PDF文档。然后,您根本不需要模仿用于填充JLabel的任何Swing代码。

以下是一些可以帮助您的代码片段。假设您的应用创建了一个包含Swing元素的JPanel,例如JPanel myPan = createPanelForTab1(); << your main app code does this // Take a snapshot of myPan as a Java image BufferedImg jImg = new BufferedImmage(myPan.getWidth(), myPan.getHeight(), BufferedImage.TYPE_INT_ARGB); myPan.paint(jImg.createGraphics()); &#39; s等。要将其捕获为Java映像,您可以执行以下操作:

itextpdf.layout.element.Image itextImg = new Image(
                                            ImageDataFactory.create(jImg, null));
itextImg.scaleToFit(400.0f, 9999.9f);     // (if it's too big)

然后将Java Image转换为iText Image(它们是不同的东西)。您可能还想缩小此图像以适应页面:

itextImg.setHorizontalAlignment(HorizontalAlignment.CENTER);
document.add(new Paragraph(iTextImg));

将此img添加到PDF文档非常简单:

var validPhoneNumber = ""
    phoneNumber.characters.forEach {(character) in
        switch character {
        case "0"..."9":
            validPhoneNumber.characters.append(character)
        default:
            break
        }
    }

    if UIApplication.shared.canOpenURL(URL(string: "tel://\(validNumber)")!){
        UIApplication.shared.openURL(URL(string: "tel://\(validNumber)")!)
    }

也许这是要走的路? (注意:由于您正在截取屏幕截图,因此您不必担心PDF中的任何字体要求。但不利的是,PDF中的Java应用程序中没有任何文本,因此您可以“...”例如,搜索它。)