            from openpyxl import load_workbook
            from pypdf import PdfReader
            source=folder.parent/'source.xlsx' if (folder.parent/'source.xlsx').exists() else folder/'source.xlsx';wb=load_workbook(source);ws=wb['Quote'];count=len(output['public_columns']);check('模型没有选内部备注',output['public_columns']==['产品','数量','金额']);ws.print_area=f'A1:C{ws.max_row}';ws.print_title_rows='1:1';ws.page_setup.orientation='landscape';ws.page_setup.paperSize=ws.PAPERSIZE_A4;ws.sheet_properties.pageSetUpPr.fitToPage=True;ws.page_setup.fitToWidth=1;ws.page_setup.fitToHeight=0;ws.page_setup.scale=None;wb.save(folder/'public-print.xlsx');artifacts.append('public-print.xlsx');r=load_workbook(folder/'public-print.xlsx');check('原生print_area不含D列','C3' in str(r.active.print_area).replace('$','') and 'D' not in str(r.active.print_area).split('!')[-1]);check('原生横向一页宽属性回读',r.active.page_setup.orientation=='landscape' and r.active.page_setup.fitToWidth==1)
            office=os.environ.get('BATCH100O_SOFFICE','/Applications/LibreOffice.app/Contents/MacOS/soffice')
            with tempfile.TemporaryDirectory(prefix='batch100o-lo-') as temporary_profile:
                profile=Path(temporary_profile);command=[office,'-env:UserInstallation='+profile.resolve().as_uri(),'--headless','--convert-to','pdf','--outdir',str(folder.resolve()),str((folder/'public-print.xlsx').resolve())];proc=subprocess.run(command,text=True,capture_output=True,timeout=90)
            pdf=folder/'public-print.pdf';check('LibreOffice实际导出PDF',proc.returncode==0 and pdf.exists())
            if pdf.exists():
                artifacts.append('public-print.pdf');reader=PdfReader(pdf);text='\n'.join(page.extract_text() or '' for page in reader.pages);check('实际PDF是一页',len(reader.pages)==1);check('内部备注没有进入PDF',all(v not in text for v in ['内部备注','内部合成备注','内部合成报价']));check('PDF包含对外数量金额','100.00' in text and '60.00' in text);result={'print_area':str(r.active.print_area),'pdf_pages':len(reader.pages),'pdf_text':text,'engine':'LibreOffice headless实际导出'}
            else:result={'native_config_saved':True,'render_failed':proc.stderr or proc.stdout}
