Так как mkl предположительно предлагается, PDFClown относится к библиотекам Java, которые обеспечивают явную поддержку для встраивания страниц (так называемые Form XObjects (см. PDF Reference 1.7, § 4.9) ).
Чтобы дать вам понять, как работает PDFClown, следующий код представляет собой эквивалент решения mbox в формате PDFBox (ПРИМЕЧАНИЕ: как было указано позже в mkl, его образец кода никоим образом не оптимизирован, поэтому это сравнение может не соответствовать фактическому статусу PDFBox - комментарии могут быть прояснены):
Document source = new File(SOURCE).getDocument();
Pages sourcePages = source.getPages();
Document target = new File().getDocument();
Page targetPage = new Page(target);
target.getPages().add(targetPage);
XObject xobject = sourcePages.get(0).toXObject(target);
PrimitiveComposer composer = new PrimitiveComposer(targetPage);
Dimension2D targetSize = targetPage.getSize();
Dimension2D sourceSize = xobject.getSize();
composer.showXObject(xobject, new Point2D.Double(targetSize.getWidth() * .5, targetSize.getHeight() * .35), new Dimension(sourceSize.getWidth() * .6, sourceSize.getHeight() * .6), XAlignmentEnum.Center, YAlignmentEnum.Middle, 45);
composer.showXObject(xobject, new Point2D.Double(targetSize.getWidth() * .35, targetSize.getHeight()), new Dimension(sourceSize.getWidth() * .4, sourceSize.getHeight() * .4), XAlignmentEnum.Left, YAlignmentEnum.Top, 90);
composer.flush();
target.getFile().save(TARGET, SerializationModeEnum.Standard);
source.getFile().close();
Сравнивая этот код с эквивалентом PDFBox, вы можете заметить некоторые существенные различия, которые показывают стиль стиля PDFClown. если какой-нибудь эксперт по PDFBox может проверить мои утверждения):
Все дело в том, что PDFClown имеет богатую архитектуру, состоящую из нескольких слоев абстракции : в соответствии с вашими требованиями вы можете выбрать наиболее подходящий стиль кодирования (либо вникать в низкоуровневые PDF- либо использовать удобную и элегантную модель высокого уровня). PDFClown позволяет вам настраивать каждый байт и решать сложные задачи с помощью смехотворно простого вызова метода по вашему желанию.
РАСКРЫТИЕ: Я являюсь ведущим разработчиком PDFClown.
Это происходит потому, что я использую CSS-модули для загрузки своего CSS-файла. В следующем примере кода вы можете ясно видеть, что происходит.
https://codesandbox.io/s/1z2lnox5rq?fontsize=14
Поэтому в качестве решения я добавил добавление методов ниже к объекту настроек.
const settings = {
dots: true,
infinite: true,
speed: 1000,
slidesToShow: 1,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 3000,
className: slickMain,
dotsClass: button__bar,
arrows: false,
beforeChange: (prev, next) => {
this.setState({ currentSlide: next });
},
// afterChange: (index) => this.setState({ currentSlide: index }),
appendDots: dots => {
return (
<div>
<ul>
{dots.map((item, index) => {
return (
<li key={index}>{item.props.children}</li>
);
})}
</ul>
</div>
)
},
customPaging: index => {
return (
<button style={index === this.state.currentSlide ? testSettings : null}>
{index + 1}
</button>
)
}
};
Чтобы решить мою проблему, я использовал beforeChange
, чтобы получить индекс следующего слайда и сохранить его в состоянии. Затем, используя appendDots
a div
с ul
, li
вводится в секцию точечной панели, которая. Внутри li
a button
передается в качестве детской опоры по методу customPaging
. Когда текущий слайд равен индексу customPaging
, который находится в состоянии, тогда класс вводится с цветом фона.
const testSettings = {
backgroundColor: 'rgba(255, 255, 255, 0.8)',
outline: '0'
}