Я не думаю, что есть способ сделать это, но вы можете установить свои измерения на мм / см / дюймы или другие и основывать свое форматирование вокруг этого.
Вы можете добавить вертикальную линейку включив его: настройки: -> tools -> options -> LibreOffice Writer -> View -> Вертикальная линейка
Если цель состоит в том, чтобы выход был совместим с pkzip и winzip, я не знаю о каких-либо библиотеках с открытым исходным кодом, которые это делают. У нас было аналогичное требование для одного из наших приложений, и я закончил писать свою собственную реализацию (совместимую со стандартом zip). Если я помню, самое сложное для нас было то, что нам приходилось генерировать отдельные файлы «на лету» (так, как работают большинство zip-утилит, они создают большой zip-файл, а затем возвращаются и разбивают его позже), это намного проще
Стандарт zip объясняет, как выглядит формат файла. Если вы не боитесь немного свернуть свои рукава, это определенно выполнимо. Вам нужно самому реализовать генератор zip-файлов, но вы можете использовать класс Deflator Java для генерации потоков сегментов для сжатых данных. Вам придется сами создавать заголовки файлов и разделов, но они просто байты - не слишком тяжело, когда вы погружаетесь.
Вот спецификация zip - раздел K содержит информацию, которую вы ищете специально, но вам также нужно прочитать A, B, C и F. Если вы имеют дело с действительно большими файлами (мы были), вам также придется попасть в материал Zip64, но для 24 МБ вы в порядке.
I f вы хотите погрузиться и попробовать - если вы столкнетесь с вопросами, отправьте сообщение назад, и я увижу, могу ли я предоставить некоторые указатели.
Ниже код - это мое решение разбить zip-файл в структуре каталогов на куски на основе желаемого размера. Я нашел, что предыдущие ответы были полезными, поэтому хотел внести свой вклад с помощью подобного, но немного более аккуратного подхода. Этот код работает для меня для моих конкретных потребностей, и я считаю, что есть возможности для улучшения.
private final static long MAX_FILE_SIZE = 1000 * 1000 * 1024; // around 1GB
private final static String zipCopyDest = "C:\\zip2split\\copy";
public static void splitZip(String zipFileName, String zippedPath, String coreId) throws IOException{
System.out.println("process whole zip file..");
FileInputStream fis = new FileInputStream(zippedPath);
ZipInputStream zipInputStream = new ZipInputStream(fis);
ZipEntry entry = null;
int currentChunkIndex = 0;
//using just to get the uncompressed size of the zipentries
long entrySize = 0;
ZipFile zipFile = new ZipFile(zippedPath);
Enumeration enumeration = zipFile.entries();
String copDest = zipCopyDest + "\\" + coreId + "_" + currentChunkIndex +".zip";
FileOutputStream fos = new FileOutputStream(new File(copDest));
BufferedOutputStream bos = new BufferedOutputStream(fos);
ZipOutputStream zos = new ZipOutputStream(bos);
long currentSize = 0;
try {
while ((entry = zipInputStream.getNextEntry()) != null && enumeration.hasMoreElements()) {
ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();
System.out.println(zipEntry.getName());
System.out.println(zipEntry.getSize());
entrySize = zipEntry.getSize();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//long entrySize = entry.getCompressedSize();
//entrySize = entry.getSize(); //gives -1
if((currentSize + entrySize) > MAX_FILE_SIZE) {
zos.close();
//construct a new stream
//zos = new ZipOutputStream(new FileOutputStream(new File(zippedPath, constructCurrentPartName(coreId))));
currentChunkIndex++;
zos = getOutputStream(currentChunkIndex, coreId);
currentSize = 0;
}else{
currentSize += entrySize;
zos.putNextEntry(new ZipEntry(entry.getName()));
byte[] buffer = new byte[8192];
int length = 0;
while ((length = zipInputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
byte[] unzippedFile = outputStream.toByteArray();
zos.write(unzippedFile);
unzippedFile = null;
outputStream.close();
zos.closeEntry();
}
//zos.close();
}
} finally {
zos.close();
}
}
public static ZipOutputStream getOutputStream(int i, String coreId) throws IOException {
System.out.println("inside of getOutputStream()..");
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipCopyDest + "\\" + coreId + "_" + i +".zip"));
// out.setLevel(Deflater.DEFAULT_COMPRESSION);
return out;
}
public static void main(String args[]) throws IOException{
String zipFileName = "Large_files _for_testing.zip";
String zippedPath= "C:\\zip2split\\Large_files _for_testing.zip";
String coreId = "Large_files _for_testing";
splitZip(zipFileName, zippedPath, coreId);
}