如何以编程方式编辑 AutoCAD PC3 文件

How to edit an AutoCAD PC3 file programmatically

我希望能够在 AutoCAD 中向用户的 "DWG to PDF" PC3 文件添加更多 default/custom 纸张尺寸,(或者至少能够阅读它)但唯一的方法似乎是使用 AutoCAD 提供的界面。我知道 PC3 文件的位置,但是当我使用记事本之类的工具打开其中一个文件时,它似乎被压缩了。我希望能够使用 Visual Studio/VB.NET 向它们添加内容。必须有一种以编程方式执行此操作的方法。

文件的 header 表示:PIAFILEVERSION_2.0,PC3VER1,compress

遗憾的是我们没有publicAPI修改PC3文件。

这似乎是不可能的,所以我研究了 "printing" 到 PDF 文件的其他选项。 Microsoft 在打印机选择下拉列表中有一个名为 Microsoft Print to PDF 的选项,它也可用于完成自定义纸张尺寸,而无需修改 PC3 文件。可以通过编程方式将自定义纸张尺寸添加到基础文件中,但这有点复杂,涉及读取注册表,以及 reading/writing 到系统假脱机文件夹,其中一个文件(XML 文件)需要保存为UTF8 No BOM格式。

我不想剽窃别人的作品,也不想重新创建如此复杂的内容 answer/solution,因此我会将此 link 提供给 Microsoft 答案论坛以防其他人对解决方案感兴趣:

Microsoft Print to PDF - Custom Paper Sizes

有一个很好的解决方案,可以更改打印机配置路径的首选项,并让 cad 像那样搜索您的文件。不要忘记在您的新 pc3 文件中取消附加 pm 文件并在同一文件夹中创建一个新文件

Public Sub Plot()
    Dim Ov As String, Nv As String
    Ov = CdApp.Preferences.Files.PrinterConfigPath '' this is the old location
    Nv = Application.StartupPath
    CdApp.Preferences.Files.PrinterConfigPath = Nv '' this is the new location
    Dim Lw(0 To 1) As Double, Up(0 To 1) As Double
    Lw(0) = -0.5 : Lw(1) = -0.5 : Up(0) = 1 : Up(1) = 1
    CdDoc.ActiveLayout.SetWindowToPlot(Lw, Up)
    CdDoc.ActiveLayout.CenterPlot = True
    'CdDoc.ActiveLayout.RefreshPlotDeviceInfo()
    CdDoc.ActiveLayout.ConfigName = "Boules JPG.pc3" ''this is the file that i make
    CdDoc.ActiveLayout.CanonicalMediaName = "UserDefinedRaster (1600.00 x 1600.00Pixels)"
    CdDoc.ActiveLayout.PlotRotation = AutoCAD.AcPlotRotation.ac0degrees
    CdDoc.ActiveLayout.PaperUnits = AutoCAD.AcPlotPaperUnits.acPixels
    CdDoc.ActiveLayout.PlotType = AutoCAD.AcPlotType.acWindow
    CdDoc.ActiveLayout.PlotWithLineweights = False
    CdDoc.ActiveLayout.PlotWithPlotStyles = False
    CdDoc.ActiveLayout.ScaleLineweights = False
    CdDoc.ActiveLayout.ShowPlotStyles = False
    CdDoc.ActiveLayout.StandardScale = AutoCAD.AcPlotScale.acScaleToFit
    CdDoc.ActiveLayout.UseStandardScale = True
    CdDoc.SetVariable("BACKGROUNDPLOT", 0)

    Dim fil_jpg As String = Application.StartupPath & "\" & "Boules2.jpg"
    
    CdDoc.Plot.PlotToFile(fil_jpg)
    CdApp.Preferences.Files.PrinterConfigPath = Ov '' return the value to old location

End Sub