You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:13:36