探索要打印的Java对象内容

时间:2016-05-31 09:53:46

标签: java pdf

第一个问题,请善待!

我有以下情况:

我有几个不同数据的类,不是很复杂但也不简单。

我需要从这些类的对象中获取数据,并以特定格式打印,我仍然不确切知道。

例如:

public class A{
    public int data1;
    public String data2;
}

public class B{
    public Map<String, A> map1;
} 

B obj;

我需要以预定义的格式在pdf上打印obj,就像在表格中一样。

我现在的想法是喜欢派生pdf的xml描述并阅读xml以指导关于文本放置位置和使用哪种字体的pdf文字。

例如:

<document>
    <text id="val1.data1" x="10" y="10" />
    <text id="val1.data2" x="100" y ="10" />
    <text id="val2.data1" x="10" y="100" />
    <text id="val2.data2" x="100" y ="100" />
</document>

这个解决方案,即使它允许我将文档格式与代码分离,也不允许我解除对象中的数据检索,我仍然需要获取ID并手动执行像<的那样的切换/ p>

if(id=="data1"){
    A.getData1();
}else if(id=="data2"){
    A.getData2();
}

我宁愿避免的事情。

关于我如何设计它的任何建议?我已经能够在任何位置绘制pdf任何我想要的东西并在需要时回溯数据,我只是想让所有内容更加分离,因为文档模板及其中的数据可能随时改变我知道。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

当您尝试打印toString()时,将调用java class中的

object方法。所以override method class return String格式@override public String toString() { return "<text id=" +this.data1 + " x= " +this.x+ " y=" +this.y +"/>"; } 例如: -

 public static String[] convertFileToParagraph(String fileContent) {

//        String pattern = "(?<=(rn|r|n))([ \t]*$)+";
        String pattern = "([ \\t\\r]*\\n[ \\t\\r]*)+";
        return Pattern.compile(pattern, Pattern.MULTILINE).split(fileContent);
    }

/**
     * Divides files in to paragraphs
     */
    private void divideFileToChunks() {
        try {
            currentFileChunks = convertFileToParagraph(fileContent);
            currentFileChunks = makeSmallChunks(currentFileChunks);
            addChunksToTTS();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Divides file paragraphs into sentences of 200 characters
     *
     * @param currentFileChunks : list of paragraphs
     * @return : list of divided file
     */
    private String[] makeSmallChunks(String[] currentFileChunks) {
        try {
            ArrayList<String> smallChunks = new ArrayList<>();
            for (int i = 0; i < currentFileChunks.length; i++) {
                String chunk = currentFileChunks[i];
                if (chunk != null && chunk.length() > 200) {
                    int length = chunk.length();
                    int count = length / 200;
                    int modulo = length % 200;
                    for (int j = 0; j < count; j++) {
                        smallChunks.add(chunk.substring(200 * j, (200 * j) + 199));
                    }
                    if (modulo > 0) {
                        smallChunks.add(chunk.substring(chunk.length() - 1 - modulo, chunk.length() - 1));
                    }
                } else {
                    smallChunks.add(chunk);
                }
            }
            return smallChunks.toArray(new String[smallChunks.size()]);
        } catch (Exception e) {
            e.printStackTrace();
            return currentFileChunks;
        }
    }

    /**
     * Add all chunks to TTS(Text to Speech) Engine
     */
    private void addChunksToTTS() {
        try {
            String[] chunks = getCurrentFileChunks();
            if (chunks != null && chunks.length > 0) {
                for (int i = currentChunk; i < chunks.length; i++) {
                    utterParam.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.valueOf(i));
                    textToSpeech.speak(chunks[i], TextToSpeech.QUEUE_ADD, utterParam);
                    imgBtnT2SPlay.setImageResource(R.drawable.icon_pause_white);
                    edtT2SFileContents.setEnabled(false);
                    isPlaying = true;
                }
            }

            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

答案 1 :(得分:0)

如果你不介意使用一些额外的内存,那么这样做的方法是从id =&gt; A中的值得到一张地图。

在A的构造函数中,将值分配给地图。获得所需的值后,您可以执行map.get(id),可能会转换为所需的格式。