SpringBoot的java打印票据-3

配置打印xml文件并解析

打印东西,先设置纸张大小,各种参数。若把数字直接填写到打印过程,之后的更改比较麻烦,这里配置一个xml文件,所有的参数都从这里取出打印。

1.构建printSettings.xml文件,放置于resources中。

<print>
    <!-- 打印机设置 -->
    <choosePrint>3</choosePrint>
    <!-- 打印任务名称 -->
    <printName>PDF</printName>
    <!-- 打印机选择,为空时选择默认打印机 -->
    <defPrintName></defPrintName>
    <!-- true:配置生效,false:配置不生效 -->
    <isPrint>true</isPrint>
    <!-- 二维码尺寸90*90 -->
    <qrcodeSize>70</qrcodeSize>
    <!--存放二维码的基本地址-->
    <basePath>G:\JavaPrintQRCode\</basePath>
    <!-- 纸张设置 -->
    <paper>
        <!-- 打印纸张设置paperWidth,paperHeight -->
        <paperWidth>595</paperWidth>
        <paperHeight>842</paperHeight>
        <!-- 打印区域设置x,y,width,height -->
        <x>10</x>
        <y>15</y>
        <width>580</width>
        <height>840</height>
    </paper>
    <!--条形码参数-->
    <tmParameters>
        <paperWidth>200</paperWidth>
        <paperHeight>150</paperHeight>
        <useWidth>180</useWidth>
        <useHeight>100</useHeight>
        <useX>5</useX>
        <useY>10</useY>
        <x>20</x>
        <y>40</y>
        <width>170</width>
        <height>50</height>
        <path>D:\JavaPrintTmCode\</path>
        <titleFontName>宋体</titleFontName>
        <titleSize>10</titleSize>
        <addressSize>20</addressSize>
        <numberSize>10</numberSize>
        <companyName>玖陆物流</companyName>
        <tmPrintName>Xprinter XP-365B</tmPrintName>
        <!--<tmPrintName>360</tmPrintName>-->
    </tmParameters>
    <!-- 打印数据参数设置 -->
    <dataset>
        <data x="5" y="30" name="startAddress" cellWidth="" cellHeight="" font="宋体" size="16"/>
        <datas name="appGoodsOrder" type="">
            <data x="110" y="110" name="goodsName" />
            <data x="205" y="110" name="goodsPkgs" />
            <data x="295" y="110" name="goodsPackage" />
        </datas>

        <!--费用格式-->
        <datas name="appFeeOrder" type="">
            <data x="70" y="230" name="feeText" />
        </datas>

        <table x="" y="" width="" height="">
            <tr width="" height="">
                <td width="" height="" colspan="" rowspan="" ></td>
                <td width="" height=""></td>
            </tr>
        </table>

    </dataset>
</print>

设置好之后,到pom文件中按下alt + insert 引入maven依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
</dependency>

让节点构成实体。这样方便我们在打印过程中取值。下面是我的实体结构,从最上层逐步往下。
avator
其中PrintSettings类是最上层。在加入注解时,可能会有重复的名称,我们需要加入 @XmlTransient注解,这样只在@XmlRootElement注解的实体中找寻有无重复,不管其他类的变量。展示一下最上层和其次顺序的类。

package com.cargo.order.settings;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.*;

/**
 *打印设置POJO
 * @since 2020/3/25 8:46
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name = "print")
@XmlAccessorType(XmlAccessType.FIELD)
public class PrintSettings {
    @XmlElement(name = "choosePrint")
    private String choosePrint;
    @XmlElement(name = "printName")
    private String printName;
    @XmlElement(name = "isPrint")
    private Boolean isPrint;
    @XmlElement(name = "qrcodeSize")
    private Integer qrcodeSize;
    @XmlElement(name = "basePath")
    private String basePath;
    @XmlElement(name = "paper")
    private Paper paper;
    @XmlElement(name = "dataset")
    private DataSet dataSet;
    @XmlElement(name = "tmParameters")
    private TmParameters tmParameters;

    public TmParameters getTmParameters() {
        return tmParameters;
    }

    public void setTmParameters(TmParameters tmParameters) {
        this.tmParameters = tmParameters;
    }

    public String getChoosePrint() {
        return choosePrint;
    }

    public void setChoosePrint(String choosePrint) {
        this.choosePrint = choosePrint;
    }

    public String getPrintName() {
        return printName;
    }

    public void setPrintName(String printName) {
        this.printName = printName;
    }

    public Boolean getPrint() {
        return isPrint;
    }

    public void setPrint(Boolean print) {
        isPrint = print;
    }

    public Integer getQrcodeSize() {
        return qrcodeSize;
    }

    public void setQrcodeSize(Integer qrcodeSize) {
        this.qrcodeSize = qrcodeSize;
    }

    public Paper getPaper() {
        return paper;
    }

    public void setPaper(Paper paper) {
        this.paper = paper;
    }

    public DataSet getDataSet() {
        return dataSet;
    }

    public void setDataSet(DataSet dataSet) {
        this.dataSet = dataSet;
    }

    public String getBasePath() {
        return basePath;
    }

    public void setBasePath(String basePath) {
        this.basePath = basePath;
    }
}

然后展示一下Paper实体.

package com.cargo.order.settings;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name = "paper")
public class Paper {
    @XmlElement(name = "paperWidth")
    private Integer paperWidth;
    @XmlElement(name = "paperHeight")
    private Integer paperHeight;
    @XmlElement(name = "x")
    private Integer x;
    @XmlElement(name = "y")
    private Integer y;
    @XmlElement(name = "width")
    private Integer width;
    @XmlElement(name = "height")
    private Integer height;
    @XmlTransient
    public Integer getPaperWidth() {
        return paperWidth;
    }

    public void setPaperWidth(Integer paperWidth) {
        this.paperWidth = paperWidth;
    }
    @XmlTransient
    public Integer getPaperHeight() {
        return paperHeight;
    }

    public void setPaperHeight(Integer paperHeight) {
        this.paperHeight = paperHeight;
    }
    @XmlTransient
    public Integer getX() {
        return x;
    }

    public void setX(Integer x) {
        this.x = x;
    }
    @XmlTransient
    public Integer getY() {
        return y;
    }

    public void setY(Integer y) {
        this.y = y;
    }
    @XmlTransient
    public Integer getWidth() {
        return width;
    }

    public void setWidth(Integer width) {
        this.width = width;
    }
    @XmlTransient
    public Integer getHeight() {
        return height;
    }

    public void setHeight(Integer height) {
        this.height = height;
    }
}

在要用的地方直接静态代码块,加载一次,使用,比如:

 private static  PrintSettings printSettings;
    static {
        try {
            //读取Resource目录下的XML文件
            Resource resource = new ClassPathResource("printSettings.xml");
            //利用输入流获取XML文件内容
            BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream(), "UTF-8"));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = br.readLine()) != null) {
                buffer.append(line);
            }
            br.close();
            //XML转为JAVA对象
            PrintSettings settings = (PrintSettings) XmlBuilder.xmlStrToObject(PrintSettings.class, buffer.toString());
            printSettings = settings;
        }catch (Exception e){
            logger.error("异常",e);
        }
    }

到此xml文件配置好了,也可以使用。
代码已上传到gitee

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用Spring Security CAS扩展来实现。在pom.xml文件中添加以下依赖项: ``` <dependency> <groupId>org.springframework.security.extensions</groupId> <artifactId>spring-security-cas</artifactId> <version>1.0.7.RELEASE</version> </dependency> ``` 然后在application.properties文件中添加以下配置: ``` # CAS server URL cas.server.url=https://cas.example.com/cas # CAS server login URL cas.server.login.url=https://cas.example.com/cas/login # CAS server logout URL cas.server.logout.url=https://cas.example.com/cas/logout # CAS service URL cas.service.url=http://localhost:8080/login/cas # CAS service name cas.service.name=MyApp # CAS service login URL cas.service.login.url=http://localhost:8080/login # CAS service logout URL cas.service.logout.url=http://localhost:8080/logout # CAS service validate URL cas.service.validate.url=https://cas.example.com/cas/serviceValidate # CAS service ticket parameter name cas.service.ticket.parameterName=ticket # CAS service renew parameter name cas.service.renew.parameterName=renew # CAS service gateway parameter name cas.service.gateway.parameterName=gateway # CAS service artifact parameter name cas.service.artifact.parameterName=artifact # CAS service proxy callback URL cas.service.proxy.callbackUrl=http://localhost:8080/proxyCallback # CAS service proxy callback parameter name cas.service.proxy.callbackParameterName=pgtIou # CAS service proxy granting ticket parameter name cas.service.proxy.grantingTicket.parameterName=pgtIou # CAS service proxy granting ticket storage class cas.service.proxy.grantingTicket.storageClass=org.jasig.cas.client.proxy.ProxyGrantingTicketStorageImpl # CAS service proxy granting ticket storage file cas.service.proxy.grantingTicket.storageFile=/tmp/cas-proxy-granting-tickets # CAS service proxy granting ticket storage clean interval cas.service.proxy.grantingTicket.storageCleanInterval=3600000 # CAS service proxy granting ticket storage clean up cas.service.proxy.grantingTicket.storageCleanUp=true # CAS service proxy granting ticket storage clean up interval cas.service.proxy.grantingTicket.storageCleanUpInterval=3600000 # CAS service proxy granting ticket storage clean up max age cas.service.proxy.grantingTicket.storageCleanUpMaxAge=7200000 ``` 然后在Spring Boot应用程序中添加以下配置类: ``` @Configuration @EnableWebSecurity @EnableCasSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CasAuthenticationEntryPoint casAuthenticationEntryPoint; @Autowired private CasAuthenticationProvider casAuthenticationProvider; @Autowired private SingleSignOutFilter singleSignOutFilter; @Autowired private CasAuthenticationFilter casAuthenticationFilter; @Autowired private CasProperties casProperties; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .exceptionHandling() .authenticationEntryPoint(casAuthenticationEntryPoint) .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/") .addLogoutHandler(new SingleSignOutHandler(casProperties.getServer().getLogoutUrl())) .and() .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class) .addFilter(casAuthenticationFilter); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(casAuthenticationProvider); } @Bean public ServiceProperties serviceProperties() { ServiceProperties serviceProperties = new ServiceProperties(); serviceProperties.setService(casProperties.getService().getUrl()); serviceProperties.setSendRenew(false); return serviceProperties; } @Bean public CasAuthenticationEntryPoint casAuthenticationEntryPoint() { CasAuthenticationEntryPoint casAuthenticationEntryPoint = new CasAuthenticationEntryPoint(); casAuthenticationEntryPoint.setLoginUrl(casProperties.getServer().getLoginUrl()); casAuthenticationEntryPoint.setServiceProperties(serviceProperties()); return casAuthenticationEntryPoint; } @Bean public CasAuthenticationProvider casAuthenticationProvider() { CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider(); casAuthenticationProvider.setAuthenticationUserDetailsService(new UserDetailsServiceImpl()); casAuthenticationProvider.setServiceProperties(serviceProperties()); casAuthenticationProvider.setTicketValidator(new Cas30ServiceTicketValidator(casProperties.getServer().getUrl())); casAuthenticationProvider.setKey("casAuthenticationProviderKey"); return casAuthenticationProvider; } @Bean public SingleSignOutFilter singleSignOutFilter() { SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter(); singleSignOutFilter.setCasServerUrlPrefix(casProperties.getServer().getUrl()); singleSignOutFilter.setIgnoreInitConfiguration(true); return singleSignOutFilter; } @Bean public CasAuthenticationFilter casAuthenticationFilter() { CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter(); casAuthenticationFilter.setAuthenticationManager(authenticationManager()); casAuthenticationFilter.setFilterProcessesUrl("/login/cas"); return casAuthenticationFilter; } } ``` 最后,在Spring Boot应用程序中添加以下服务类: ``` @Service public class UserDetailsServiceImpl implements AuthenticationUserDetailsService<CasAssertionAuthenticationToken> { @Override public UserDetails loadUserDetails(CasAssertionAuthenticationToken token) throws UsernameNotFoundException { String username = token.getName(); List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER"); return new User(username, "", authorities); } } ``` 现在,您可以使用Spring Boot应用程序调用CAS客户端自动配置支持来解析票据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值