Не используйте файлы. Принимайте ссылки на базовый поток в качестве входных / выходных данных, чтобы вы могли вводить данные из любого места и записывать их где угодно (файлы, базы данных, сетевые подключения, память и т. Д.).
Если вы ожидаете, что есть шанс, что вы когда-нибудь захотите выполнить более одного преобразования формата (и, по моему опыту, большая часть программного обеспечения расширяется, как правило, до его выпуска, но часто вскоре после выпуска), спроектировать расширяемое внутреннее представление, которое поддерживает все функции других форматов, которые в настоящее время важны / актуальны для вас, и использовать конвейерный подход, который применяет двойное преобразование (PDF -> MyFormat и затем MyFormat -> HTML ). Таким образом, когда вы решите, что вы также хотите конвертировать из Word, вам нужно только написать конверсию Word -> MyFormat, чтобы достичь Word -> HTML. Во-первых, это может стоить очень мало для реализации и может дать огромный выигрыш в надежности и стоимости реализации для каждого последующего формата, для которого вы добавляете поддержку.
Попробуйте написать гибкий код (подумайте, как могут измениться форматы в будущем). Когда выйдет следующий формат PDF, Word или HTML, как легко вы сможете обновить код для поддержки любых внесенных изменений? (Под этим, я имею в виду, старайтесь не устанавливать произвольные ограничения в преобразовании, например, предполагая, что, поскольку текущий формат допускает использование только 256 шрифтов, вы можете использовать байт для хранения индекса шрифта - оставьте немного места для расширение)
Внедрите систему отчетов о прогрессе в проект с первого дня, чтобы было легко показать индикатор выполнения во время конверсии. И убедитесь, что ваш дизайн не исключает пакетной обработки сотен файлов за один раз, даже если это все, что вам сейчас нужно.
Храните код преобразования полностью отдельно от приложения, которое его использует; убедитесь, что бизнес-логика (преобразование) полностью отделена от любого пользовательского интерфейса. Преобразование (я) должно быть полностью отдельным модулем (ами) многократного использования и способным работать в режиме пакетной обработки, где нет взаимодействия с пользователем.