我有以下课程:
public class PDFValues {
private String value;
private int xPos;
private int yPos;
public PDFValues(){
}
public PDFValues(String value, int x, int y){
this.setValue(value);
this.setX(x);
this.setY(y);
}
public void setValue(String value){
this.value = value;
}
public void setX(int x){
this.xPos = x;
}
public void setY(int y){
this.yPos = y;
}
public String getValue(){
return this.value;
}
public int getX(){
return this.xPos;
}
public int getY(){
return this.yPos;
}
}
然后我想这样做:
public class PDFtoJSONTest {
public static void main(String[] args) {
List<PDFValues> listaElementos = new ArrayList<PDFValues>();
listaElementos.add(new PDFValues("Anubis Lockward Botello",
new Integer(100), new Integer(633)));
....more code
}
}
我想要做的是将所有PDF值保存在ArrayList中,作为JSON文件,但我不知道如何使其自动化,我想到序列化对象或其他东西,但我可以&# 39;找到解决方案,我不确定如何使PDFValues对象可序列化。
我想这样做是为了将这些值保存在JSON文件中,然后将它们用作属性来生成PDF文件,我使用PDFBox生成PDF文件,使用SimpleJSON生成.json文件。
我正在开展一个项目,我必须从一些已处理的数据中生成数千个pdf文件。我已经设法解析了包含大约500多MB文本的数据,并保存了大约5000个需要生成为PDF的帐户报表。
问题是,看到文本数据是在PDF中生成的,需要在字符串中指示起始字符到PDFValues的位置,生成PDFTextInfo对象然后将其添加到PDF中,文件将需要包含图像和文字等内容。
注意:如果有更好的方法来完成我想要做的事情,我可以接受建议,但我也想回答一下我所做的事情。我试图做,并知道它是否会起作用,以及为什么两种情况。
我想尽可能快地编写代码,现在我能够在2分钟内处理RAW中的整个TXT文件到大部分清理数据,我知道它可能会被优化但是现在,这不是重点:D
我希望尽可能快地生成PDF文件,但是我已经在Java中使用该项目了一个半月,而且我只是了解了过去一周内生成了JSON和PDF文件......在JSON文件上工作了三天,我有点迷失了。
这是我尝试完成的JSON文件的文件输出示例,这是我手动生成的,我设法读取并处理文件,现在我是试图自动生成它:
{ &#34;标题&#34;:{ &#34;全名&#34 ;: { &#34;姓名&#34;:&#34; Anubis Lockward Botello&#34;, &#34;水平&#34;:180, &#34;垂直&#34; 633 }, .....更多元素..... } }
正如你所看到的,我试图将pdf文件中的元素划分为像面板一样,如HEADER,BALANCES,TRANSACTIONS和东西,并将PDF文件构建为好像它们是拼图的一部分,但是现在我正试图建立&#34;标题上的name元素。
答案 0 :(得分:1)
我猜想有一种更好的方法来构建PDF文件而不是写入然后重新读取文件,但我可以为你的JSON问题提供一个答案。
使用Apache commons-lang3库并查看ToStringBuilder
。然后,您可以在对象上定义toString()
方法,并使用内置的ToStringStyle.JSON_STYLE
格式。然后,您必须将PDFValues列表包装在可以为Header,FullName等存储PDFValue的其他对象中。
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
.append("Name", value)
.append("Horizontal", xPos)
.append("Vertical", yPos)
.toString();
}
我应该注意,您可以引入Jackson或类似的库,使用所需的JsonProperty
注释注释您的对象,并使用该库将您的对象序列化为JSON,就像使用REST或类似的一样。但是,对于像您这样的简单用例,ToStringBuilder
简单而有效。
答案 1 :(得分:0)
好吧,我得到了这么多,感谢JudgingNotJudging,我做的是采取他的答案并将一个装饰器模式应用于对象,这样我就有一个PDFValue,它在PDFElement中,这是PDFContainer的一部分,所以它是这样的:
Header: (this is our PDFContainer)
FullName: (so, Header HAS-A FullName element)
PDFValue: (and FullName HAS-A a PDFValue, that has the Name or value to be shown, and the X and Y coordinates inside the PDF)
以下是代码:
PDFValue类仍然相同,我根据JudgingNotJudging的答案添加了重写的toString()方法。
public class PDFValuesDecorator extends PDFValues{
}
在PDFValuesDecorator中我们什么都不做,我们只是扩展PDFValues,以便我们有正确类型的类我们想要添加行为,并且仍然可以获得我们可能的所有不同类的通用类型以这种方式创造。
public class PDFElement extends PDFValuesDecorator {
private PDFValues pdfValue;
private String elementID;
public PDFElement(PDFValues pdfValue, String elementID){
this.pdfValue = pdfValue;
this.elementID = elementID;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
.append(elementID, pdfValue.toString())
.toString();
}
}
在构造函数中,我们保存了我们试图“包装”的对象的实例,以便我们可以“添加”它。在这种情况下,我们正在为元素添加一个ID,我们正在修改元素的toString()方法,以包含PDFValue的toString()方法,这样它们都会在适当的位置显示它们的值。顺序。
最后,这是我的主要方法:
public class PDFtoJSONTest {
public static void main(String[] args) {
List<PDFValues> listaElementos = new ArrayList<PDFValues>();
PDFValues name =
new PDFValues(
"Anubis Lockward Botello",
new Integer(100),
new Integer(633)
);
PDFElement fullName = new PDFElement(name, "FullName");
PDFElement header = new PDFElement(fullName, "Header");
listaElementos.add(header);
for(PDFValues value : listaElementos){
System.out.println("Valor: " + value.toJSONString());
}
}
}
正如您所看到的,我要做的第一件事就是创建一个PDFValues的ArrayList,然后我为name值创建一个单独的对象,然后将该名称包装在FullName元素中,然后将其存储在Header元素中。正如您所看到的,我可以传递List对象并随意使用它。
而且,我可以创建其他PDFElements,如图像和东西,我可以将它们全部保存在ArrayList中并传递它们然后当我想保存它们时,我只需要调用toString方法一次,然后我会得到正确的输出,顺便说一句,这是JSON字符串的结果值:
Valor: {"Header":"{"FullName":"{"Name":"Anubis Lockward Botello","Horizontal":100,"Vertical":633}"}"}