0

FileOutputStream我使用 java 实用程序合并了三个 AFP 文件,该实用程序从文件中读取字节并使用Java 类写入输出流。合并的 AFP 文件看起来不错,但是AFPViewer在打开 AFP 文件后在强制代码(在 TLE 浏览器中)中检查 TLE(标记逻辑元素)信息时,所有合并文件的组号保持不变到 GRP:PGP00001

请让我知道如何合并文件,以便在 AFP 合并后 GRP 编号应开始按顺序增加。结果应为 GRP:PGP00001、GRP:PGP00002 和 GRP:PGP00003

使用以下代码合并使用 Apache FOP XSL-FO 生成的每个 AFP 文件:

public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);

// Get the size of the file
long length = file.length();

// Create the byte array to hold the data
byte[] bytes = new byte[(int)length];

// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
       && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
    offset += numRead;
}

// Ensure all the bytes have been read in
if (offset < bytes.length) {
    throw new IOException("Could not completely read file "+file.getName());
}

// Close the input stream and return bytes
is.close();
return bytes;
}

主功能:

public static void main(String[] args) {
try {
    FileOutputStream fos = new FileOutputStream("C:\\dev\\harry\\ETCC_data\\output.afp");
    byte[] bytes1 = getBytesFromFile(new File(filePath1));
    byte[] bytes2 = getBytesFromFile(new File(filePath2));
    fos.write(bytes1);
    fos.write(bytes2);
    fos.flush(); 
    fos.close(); 
}
catch(FileNotFoundException ex) { System.out.println("FileNotFoundException : " + ex); }
catch(IOException ioe) { System.out.println("IOException : " + ioe); }
}
4

3 回答 3

2

afplib 确实有一些关于如何正确地将多个 AFP 文件合并为一个的示例代码:

https://github.com/yan74/afplib/wiki/Samples#afpcombinejava https://github.com/yan74/afplib/blob/master/org.afplib.samples/src/main/java/org/afplib/samples /AfpCombine.java

package org.afplib.samples;

import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;

import org.junit.Test;

public class AfpCombineTest {

    @Test
    public void testRun() throws IOException {
        new File("tmp").mkdirs();
        AfpCombine combine = new AfpCombine("tmp/out.afp", new String[] { "testdata/start.afp", "testdata/start.afp" , "testdata/ende.afp" , "testdata/ende.afp"});
        combine.run();
    }

}
于 2016-06-21T13:15:15.637 回答
1

二进制合并不适用于 AFP/MO:DCA 文件。

除了资源名称之外,还有很多问题。
仅举一个例子,共享资源(BRG...<code>ERG),通常在文档之前(例如,它们位于BDT...<code>EDT 之前)必须始终保留在之前。
此外,映射的颜色标识符、图像格式等之间可能存在冲突。

事实上,普通二进制合并似乎只适用于最简单的文档。换句话说,几乎从来没有。

为了正确合并多个文档,必须深入研究文档结构并调整所有必要的结构化字段。

AFP 有几个 Java 库,例如afplib

我还看到那些为此目的使用 Apache FOP 的AFP 模块的人,尽管它主要针对创建文档,而不是编辑这些文档。

于 2016-06-14T13:02:37.560 回答
0

合并 AFP 文件不只是 cat afp1 afp2 > out 这样简单 我们需要确保,合并两个文件后遵循 MODCA 结构。您在一个 BRG-ERG 组中的第一个 afp 文件和第二个 afp 文件中的所有资源以及您的所有数据页都应该在一个 BDT-EDT 组中。下面是流程。

合并法新社文件

像上面那样合并后,会出现重复资源的问题。假设 AFP 1 使用代码字体 CO10001,即 Arial 10 AFP 2 使用代码字体 CO10001(同名),即 Helvetica 10

打印机将选择第一个可用的字体,因此您不会得到预期的打印。

确保在合并时,任何资源都不应具有相同的名称和不同的属性,如果有重复资源,则删除重复资源,这是一个很好的做法。

回答你是,你可以在你的程序中有计数器变量,当你遇到 BNG 记录时,你可以通过更新它来更新现有记录,或者你可以编写你自己的 BNG 记录。

于 2018-05-14T05:59:25.893 回答