通过TCP实现C#命令行程序向Python返回PDF文本
解决方案:C#与Python间的PDF文本传输问题
方案一:修复控制台编码问题(优先推荐,无需TCP)
控制台默认编码不是UTF-8,这是导致项目符号等特殊字符乱码/丢失的核心原因,只需调整编码即可解决:
修改后的C#代码
static void Main(string[] args) { // 强制控制台输出使用UTF-8编码 Console.OutputEncoding = System.Text.Encoding.UTF8; string outputText = ReadPdf(args[0]); Console.WriteLine(outputText); }
修改后的Python代码
output = subprocess.check_output([self.PATH_TO_EXE, input_file_name], encoding='utf-8') print(output)
方案二:TCP传输方案(适合大文本或特殊场景)
如果必须使用TCP,以下是C#作为TCP服务器、Python作为客户端的实现:
C# TCP服务器代码
using System; using System.Net; using System.Net.Sockets; using System.Text; class PdfTextServer { static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("用法: PdfTextServer.exe <PDF路径> <端口号>"); return; } string pdfPath = args[0]; int port = int.Parse(args[1]); string pdfText = ReadPdf(pdfPath); // 启动本地TCP监听器 TcpListener listener = new TcpListener(IPAddress.Loopback, port); listener.Start(); // 等待Python客户端连接 using (TcpClient client = listener.AcceptTcpClient()) using (NetworkStream stream = client.GetStream()) { // 先发送数据长度(避免粘包) byte[] lengthBytes = BitConverter.GetBytes(Encoding.UTF8.GetByteCount(pdfText)); stream.Write(lengthBytes, 0, lengthBytes.Length); // 发送PDF文本数据 byte[] textBytes = Encoding.UTF8.GetBytes(pdfText); stream.Write(textBytes, 0, textBytes.Length); } listener.Stop(); } // 你的iText7 PDF读取方法 private static string ReadPdf(string path) { // 原有PDF读取逻辑 // 示例:return "• 第一行项目\n• 第二行项目"; } }
Python TCP客户端代码
import socket import subprocess def get_pdf_text_via_tcp(exe_path, pdf_path, port=12345): # 启动C# TCP服务器进程 proc = subprocess.Popen([exe_path, pdf_path, str(port)]) # 连接TCP服务器 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('localhost', port)) # 接收数据长度 length_data = s.recv(4) data_length = int.from_bytes(length_data, byteorder='little') # 接收完整文本数据 received = b'' while len(received) < data_length: chunk = s.recv(min(4096, data_length - len(received))) if not chunk: break received += chunk pdf_text = received.decode('utf-8') proc.wait() return pdf_text # 使用示例 pdf_content = get_pdf_text_via_tcp(self.PATH_TO_EXE, input_file_name) print(pdf_content)
TCP方案注意事项
- 确保端口未被占用,可选择固定端口或动态分配端口
- 先发送数据长度是为了避免TCP粘包问题,保证数据完整接收
- 全程使用UTF-8编码,确保特殊字符正确传输
内容的提问来源于stack exchange,提问作者futium
相关产品推荐
相关产品推荐

