Но перед преобразованием в PDF aspose должен загрузить несколько шрифтов Arial из папки ресурсов.
Этого не произошло из-за способа, которым мы пытались получить доступ к шрифтам. Это вызывало проблемы с выравниванием.
Мы поработали над этим и исправили способ загрузки шрифтов. Это решило проблему.
Текущая проблема:
Теперь мы хотим создать тестовый пример JUnit, который будет проверять, загружен ли шрифт.
Я написал приведенный ниже тестовый пример, в конце он дает успех, но также выдает ошибку.
Ошибка: После этой ошибки он все равно печатает загруженные шрифты и успешно завершает работу.
Ошибка возникает в коде ниже в методе getAllLoadedFonts, упомянутом ниже.
Код: Выделить всё
fontSource.getAvailableFonts()
Код: Выделить всё
java.util.ServiceConfigurationError: javax.print.PrintServiceLookup: P r o v i d e r s u n . p r i n t . P r i n t S e r v i c e L o o k u p P r o v i d e r n o t a s u b t y p e < b r / > a t j a v a . u t i l . S e r v i c e L o a d e r . f a i l ( S e r v i c e L o a d e r . j a v a : 2 3 9 ) < b r / > a t j a v a . u t i l . S e r v i c e L o a d e r . a c c e s s $ 3 0 0 ( S e r v i c e L o a d e r . j a v a : 1 8 5 ) < b r / > a t j a v a . u t i l . S e r v i c e L o a d e r $ L a z y I t e r a t o r . n e x t S e r v i c e ( S e r v i c e L o a d e r . j a v a : 3 7 6 ) < b r / > a t j a v a . u t i l . S e r v i c e L o a d e r $ L a z y I t e r a t o r . n e x t ( S e r v i c e L o a d e r . j a v a : 4 0 4 ) < b r / > a t j a v a . u t i l . S e r v i c e L o a d e r $ 1 . n e x t ( S e r v i c e L o a d e r . j a v a : 4 8 0 ) < b r / > a t j a v a x . p r i n t . P r i n t S e r v i c e L o o k u p $ 1 . r u n ( P r i n t S e r v i c e L o o k u p . j a v a : 3 4 7 ) < b r / > a t j a v a . s e c u r i t y . A c c e s s C o n t r o l l e r . d o P r i v i l e g e d ( N a t i v e M e t h o d ) < b r / > a t j a v a x . p r i n t . P r i n t S e r v i c e L o o k u p . g e t AllLookupServices(PrintServiceLookup.java:338)
at javax.print.PrintServiceLookup.lookupDefaultPrintService(PrintServiceLookup.java:180)
at com.aspose.words.WindowsNativeCall.(Unknown Source)
at com.aspose.words.internal.zz9H.(Unknown Source)
at com.aspose.words.internal.zzBI.zzU(Unknown Source)
at com.aspose.words.internal.zzBJ.zzQX(Unknown Source)
at com.aspose.words.internal.zzR9.zzZ(Unknown Source)
at com.aspose.words.FontSourceBase.getAvailableFonts(Unknown Source)
at mypackage.getAllLoadedFonts(WordBuilderServiceTest.java:214)
at mypackage.testIfAllFontsAreLoadedProperly(WordBuilderServiceTest.java:207)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner$2.call(DelegatingPowerMockRunner.java:149)
at org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner$2.call(DelegatingPowerMockRunner.java:141)
at org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner.withContextClassLoader(DelegatingPowerMockRunner.java:132)
at org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner.run(DelegatingPowerMockRunner.java:141)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Код: Выделить всё
private WordBuilderService wordBuilderService;
@Before
public void setUp() {
initMocks(this);
wordBuilderService = spy(new WordBuilderService(//some other variables))
}
@Test
public void testIfAllFontsAreLoadedProperly () throws DtException {
FontSettings fontSettings = new FontSettings();
wordBuilderService.addFontsFromClasspathViaStream(fontSettings);
assertTrue(getAllLoadedFonts(fontSettings).contains("Arial"));
}
private String getAllLoadedFonts(FontSettings fontSettings) {
FontSourceBase[] fontSources = fontSettings.getFontsSources();
StringBuilder fontNames= new StringBuilder();
for (FontSourceBase fontSource : fontSources) {
try {
ArrayList
availableFonts = fontSource.getAvailableFonts();
for (PhysicalFontInfo font : availableFonts) {
fontNames.append( font.getFullFontName());
fontNames.append(", ");
}
} catch (Exception e) {
System.err.println("Error retrieving available fonts: " + e.getMessage());
}
}
log.info(fontNames.toString());
return fontNames.toString();
}
Код: Выделить всё
public void addFontsFromClasspathViaStream(FontSettings fontSettings) throws DtException {
List fontStreams = new ArrayList();
List fontFileNames = Arrays.asList("ARIAL.TTF","ARIALBD.TTF","ARIALBI.TTF","ARIALI.TTF","ARIALN.TTF","ARIALNB.TTF","ARIALNBI.TTF"
,"ARIALNI.TTF","ARIBLK.TTF");
try {
for (String fontFilePath : fontFileNames) {
log.info("{}: trying to get this file via Stream",fontFilePath);
InputStream fontStream = new ClassPathResource("fonts/"+fontFilePath).getInputStream();
if (fontStream != null) {
log.info("{}: got this file via Stream",fontFilePath);
byte[] fontData = IOUtils.toByteArray(fontStream);
MemoryFontSource memoryFontSource = new MemoryFontSource(fontData);
FontSourceBase[] existingSources = fontSettings.getFontsSources();
FontSourceBase[] newSources = new FontSourceBase[existingSources.length + 1];
System.arraycopy(existingSources, 0, newSources, 0, existingSources.length);
newSources[newSources.length - 1] = memoryFontSource;
fontSettings.setFontsSources(newSources);
fontStreams.add(fontStream);
} else {
log.error("Font stream is null for: " + fontFilePath);
}
}
} catch(IOException e){
log.error("Error Loading the Fonts, pdf will be misaligned.");
} finally {
// Close all streams
for (InputStream fontStream : fontStreams) {
try{
if (fontStream != null) {
fontStream.close();
}
} catch (IOException e) {
//Nothing needed
}
}
}
}
Код: Выделить всё
com.aspose
aspose-words
18.11
jdk16
Я пробовал проверять различные онлайн-форумы, пробовал задавать вопросы в ChatGPT, пытался перехватить исключение и просто войти в систему. , но все равно выдает полную ошибку.
Подробнее здесь: https://stackoverflow.com/questions/786 ... -a-subtype
Мобильная версия